我的产品在大多数情况下工作正常,但之后我遇到了一个案例,我得到了很多内存异常(服务中)。
该服务是作为Windows服务托管的WCF服务。该服务使用netTCPBinding和Protobuf-net与Winform客户端进行通信。 Service设置为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设置为高? Maby我们应该降到64?
重建它作为64位软件也是一种方法,这应该清除2 GB的ram限制。
答案 0 :(得分:0)
尝试更改为流式传输,这是使用WCF发送大型有效负载时的已知问题。问题的原因是它试图在发送内容之前和接收之后将所有内容加载到内存中,这会耗尽内存。有关信息,请参阅Large Data and Streaming下的大数据内容部分,流数据部分,了解如何启用流式传输
答案 1 :(得分:0)
我决定用64位构建服务,内存限制没有问题。