0

我的产品在大多数情况下都可以正常工作,但后来我遇到了很多内存不足异常(在服务中)的情况。

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

4

2 回答 2

0

尝试更改为流式传输,这是使用 WCF 发送大型有效负载时的一个已知问题。问题的原因是它试图在发送内容之前和接收之后将所有内容加载到内存中,这会耗尽内存。有关信息,请参阅大数据和流式传输下的大数据内容部分,以及流式数据部分以了解如何启用流式传输

于 2013-06-11T14:55:38.787 回答
0

我决定以 64 位构建服务,内存限制不再有问题。

于 2013-07-05T11:52:12.573 回答