私はほとんどの場合正常に動作する製品を持っていますが、(サービス中に) 多くのメモリ不足の例外が発生するケースが 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 制限がクリアされるはずです。