我有一个组件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>
如果有人想了解更多细节,我会很乐意尽我所能。有人可以告诉我,这是否是一种熟悉的行为以及我是否可以采取行动?
提前致谢!
马克西姆
答案 0 :(得分:0)
这样的东西:maxBufferSize =“1073741824”将导致WCF抓住那么多ram,并且在卸载应用程序之前永远不要放弃它。
你告诉框架你打算在瞬间为它提供1,073,741,824字节的数据,所以“准备好”因为这个原因它将保留那么多的ram空间,无论用什么来保存性能点击像GC这样的东西
你基本上是在说这个端点“总是消耗超过1GB的ram”。
你怎么能有一个数组或字符串值的缓冲区大小???
的MaxArrayLength = “1073741824” maxStringContentLength =“1073741824”
这些设置毫无意义。