我有一款产品在大多数情况下都能正常工作,但后来我遇到了一种情况,出现大量内存不足异常(服务中)。发送大量数据收集时内存不足
该服务是作为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是问题?
的服务节流设置是这样的:
<serviceThrottling maxConcurrentCalls="2000" maxConcurrentSessions="2147483647" maxConcurrentInstances="2000"/>
它可能也maxConcurrentCalls设置为高?马比,我们应该下降到64?
重建它作为一个64位软件也是一种方式,这应该清除2 GB的内存限制。
一个.Net实例在1.5GB的迂回环境中出现内存不足异常而没有任何修改。你应该考虑通过在db中排队请求来减少你的服务在内存中保存的数据量,在内存中只有userIds而不是整个用户对象,并引入延迟加载和提前卸载对象。 – wonko79