在加载结束之前,WCF undel加载不会释放内存 - 可能是会话

时间:2013-07-16 13:29:44

标签: wcf load

我有一个组件X同时扮演客户端和服务器。客户端和服务器连接都是WCF。问题是在高负载下,WCF似乎不会释放会话或类似的东西。我根据这些迹象得出了这个结论:

1)负载下该组件的内存不断增长。

2)内存分析器AQTime显示没有泄漏。在加载期间主动调用垃圾收集器(使用GC.Collect和GC.WaitForPendingFinalizers)会释放一些内存,但它仍在增长。但是在关闭负载后,所有内存都被释放。

3)在我将通信框架从WCF更改为ZeroMQ之后,该组件与连接到内存的组件之间的行为要好得多 - 它几乎不会增长。

组件的描述:

它使用net.tcp绑定连接到组件Y,并且也使用net.tcp进行侦听。绑定定义是:

 <binding
      name="netTcpBinding_Server"
      maxReceivedMessageSize="1073741824"
      maxBufferSize="1073741824"
      transferMode="Buffered">
      <security mode="None" />
      <readerQuotas maxArrayLength="1073741824" maxStringContentLength="1073741824" />
    </binding>

    <binding name="netTcpBinding_Client"
      maxReceivedMessageSize="1073741824"
      openTimeout="00.00:00:30"
      closeTimeout="00.00:00:30"
      receiveTimeout="Infinite">
      <security mode="None" />
      <readerQuotas maxArrayLength="1073741824" maxStringContentLength="1073741824" />
    </binding>

行为是:

<behaviors>
  <serviceBehaviors>
    <behavior name="ServerServiceBehavior">
      <serviceDebug includeExceptionDetailInFaults="true" />
      <dataContractSerializer maxItemsInObjectGraph="2147483647" />
      <serviceThrottling maxConcurrentSessions="64" maxConcurrentCalls="128" maxConcurrentInstances="192" />
    </behavior>
  </serviceBehaviors>

  <endpointBehaviors>
    <behavior name="ServerEndPointBehavior">
      <dataContractSerializer maxItemsInObjectGraph="6553600"/>
      <protobuf/>
    </behavior>

    <behavior name="ClinetEndPointBehavior">
      <dataContractSerializer maxItemsInObjectGraph="6553600"/>
      <protobuf/>
    </behavior>
  </endpointBehaviors>
</behaviors>

<extensions>
  <behaviorExtensions>
    <add name="protobuf" type="ProtoBuf.ServiceModel.ProtoBehaviorExtension, protobuf-net, Version=1.0.0.280, Culture=neutral, PublicKeyToken=257b51d87d2e4d67"/>
  </behaviorExtensions>
</extensions>

如果有人想了解更多细节,我会很乐意尽我所能。有人可以告诉我,这是否是一种熟悉的行为以及我是否可以采取行动?

提前致谢!

马克西姆

1 个答案:

答案 0 :(得分:0)

这样的东西:maxBufferSize =“1073741824”将导致WCF抓住那么多ram,并且在卸载应用程序之前永远不要放弃它。

你告诉框架你打算在瞬间为它提供1,073,741,824字节的数据,所以“准备好”因为这个原因它将保留那么多的ram空间,无论用什么来保存性能点击像GC这样的东西

你基本上是在说这个端点“总是消耗超过1GB的ram”。

你怎么能有一个数组或字符串值的缓冲区大小???

的MaxArrayLength = “1073741824” maxStringContentLength =“1073741824”

这些设置毫无意义。