1

我有一个同时充当客户端和服务器的组件 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>

如果有人想要更多细节,我很乐意尽我所能。有人可以告诉我这是否是一种熟悉的行为,我是否可以对此做些什么?

提前致谢!

格言

4

1 回答 1

0

像这样的东西: maxBufferSize="1073741824" 将导致 WCF 抓取那么多内存,并且在卸载应用程序之前永远不会放手。

您正在告诉框架您打算在某一时刻及时为其提供 1,073,741,824 字节的数据,因此“准备好”,因此无论如何保存诸如 GC 之类的性能损失,它都将保持该数量的 ram 空间。

您基本上是在告诉端点“总是消耗超过 1GB 的内存”。

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

maxArrayLength="1073741824" maxStringContentLength="1073741824"

这些设置毫无意义。

于 2013-07-30T14:15:38.333 回答