发送大数据集合时内存不足
本文关键字:集合 内存不足 数据集 数据 | 更新日期: 2023-09-27 18:17:49
我有一个产品,在大多数情况下工作良好,但后来我有一个情况,我得到了很多内存不足的异常(在服务)。
该服务是作为Windows服务托管的WCF服务。该服务使用netttcpbinding和Protobuf-net与Winform客户端进行通信。服务设置为PerCall,并使用SessionMode.Required。在服务中,我为客户端保存上下文对象,以便能够跟踪。
服务也使用回调。
服务和客户端都是32位的,所以这限制了它使用2gb的内存。
产生内存异常的环境(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的内存限制。
尝试更改为流,这是使用WCF发送大型有效负载时的已知问题。问题的原因是它试图在发送内容之前和接收内容之后将所有内容加载到内存中,这会耗尽内存。查看大数据内容章节中的大数据和流信息,以及流数据章节了解如何启用流
我决定构建64位的服务,内存限制不再有问题了