我有一个同时充当客户端和服务器的组件 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>
如果有人想要更多细节,我很乐意尽我所能。有人可以告诉我这是否是一种熟悉的行为,我是否可以对此做些什么?
提前致谢!
格言