我的产品在大多数情况下都可以正常工作,但后来我遇到了很多内存不足异常(在服务中)的情况。
该服务是作为 Windows 服务托管的 WCF 服务。该服务使用 netTCPBinding 和 Protobuf-net 与 Winform 客户端进行通信。服务设置为 PerCall 并使用 SessionMode.Required。在服务中,我为客户保留上下文对象以便能够跟踪。
该服务也使用回调。
服务和客户端都构建为 32 位,因此这将其限制为使用 2 GB 内存。
生成我们的内存异常的环境(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 可能是问题所在吗?
服务节流设置如下:
<serviceThrottling maxConcurrentCalls="2000" maxConcurrentSessions="2147483647" maxConcurrentInstances="2000"/>
maxConcurrentCalls 是否也可能设置为高?也许我们应该降到64?
将其重新构建为 64 位软件也是一种方法,这应该清除 2 GB 的内存限制。