2013-06-11 29 views
0

我有一款产品在大多数情况下都能正常工作,但后来我遇到了一种情况,出现大量内存不足异常(服务中)。发送大量数据收集时内存不足

该服务是作为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的内存限制。

+0

一个.Net实例在1.5GB的迂回环境中出现内存不足异常而没有任何修改。你应该考虑通过在db中排队请求来减少你的服务在内存中保存的数据量,在内存中只有userIds而不是整个用户对象,并引入延迟加载和提前卸载对象。 – wonko79

回答

0

我决定在64位构建服务并有内存限制没有问题了。

+0

如何在64位模式下构建Windows服务? –

0

尝试更改为流媒体,这是使用WCF发送大型有效内容时的已知问题。问题的原因是它试图在发送内容之前和接收之后将所有内容加载到内存中,这耗尽了内存。见大数据内容Large Data and Streaming下信息部分,流数据部分,看看如何去使流

+0

是的,我已经着眼于流媒体,但它似乎是一个完全不同的逻辑,它不仅仅是改变WCF配置? – Banshee

+0

@SnowJim是的,它比修改配置更有意义,但没有什么疯狂的,请参阅http://msdn.microsoft.com/en-us/library/ms789010.aspx,除此之外,我认为你的其他选项是烤如果可能的话,将数据分块发送给逻辑的一些逻辑 – Jason

相关问题