0

私はほとんどの場合正常に動作する製品を持っていますが、(サービス中に) 多くのメモリ不足の例外が発生するケースが 1 つあります。

このサービスは、Windows サービスとしてホストされる WCF サービスです。このサービスは、netTCPBinding と Protobuf-net を使用して Winform クライアントと通信します。サービスは PerCall に設定され、SessionMode.Required を使用します。サービスでは、クライアントが追跡できるようにコンテキスト オブジェクトを保持します。

サービスはコールバックも使用します。

サービスとクライアントの両方が 32 ビットとして構築されているため、2 GB の RAM の使用に制限されます。

メモリ例外を生成する環境 (1000 ユーザー) は、他のインストールよりもはるかに大きくなります。一部のメッセージは大きく、複数のユーザーが同時にこのデータを要求すると、メモリが完全に消費されると考えられます。

バインディングは次のようになります。

<binding name="netTcpRegular" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="infinite" sendTimeout="01:00:00" transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="1000" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="200" maxReceivedMessageSize="2147483647">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
          <reliableSession ordered="true" inactivityTimeout="infinite" enabled="false"/>
          <security mode="None">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </netTcpBinding>

maxBufferSize が問題になる可能性はありますか?

Service Throttling は次のように設定されます。

<serviceThrottling maxConcurrentCalls="2000" maxConcurrentSessions="2147483647" maxConcurrentInstances="2000"/>

maxConcurrentCalls も高く設定されている可能性はありますか? たぶん、64まで下げるべきですか?

64 ビット ソフトウェアとして再ビルドすることも方法の 1 つです。これにより、RAM の 2 GB 制限がクリアされるはずです。

4

2 に答える 2

0

ストリーミングに変更してみてください。これは、WCF で大きなペイロードを送信する場合の既知の問題です。この問題の原因は、コンテンツを送信する前と受信した後にすべてをメモリにロードしようとするため、メモリを使い果たしてしまうことです。詳細については、 Large Data and Streamingの下のLarge Data Contentセクションを参照してください。ストリーミングを有効にする方法については、Streaming Dataセクションを参照してください。

于 2013-06-11T14:55:38.787 に答える