<binding name=”Allscripts.Homecare.WSHTTPBinding.Configuration” closeTimeout=”00:05:00″ openTimeout=”00:05:00″ receiveTimeout=”00:10:00″ sendTimeout=”00:05:00″ maxBufferPoolSize=”2147483647″ maxReceivedMessageSize=”2147483647″>
<readerQuotas maxDepth=”2147483647″ maxStringContentLength=”2147483647″ maxArrayLength=”2147483647″ maxBytesPerRead=”2147483647″ maxNameTableCharCount=”2147483647″/>
从http://kennyw.com/work/indigo/51:
“在内置的 WCF 绑定和传输绑定元素上,我们将 MaxBufferPoolSize 公开为一个属性,以便您控制我们的缓存占用空间。如果您要发送小型 (< 64K) 消息,那么默认值 512K 可能是可以接受的。对于较大的消息,通常最好完全避免池化,您可以通过设置MaxBufferPoolSize=0来完成。当然,您应该在不同的值下分析您的代码,以确定最适合您的应用程序的设置。”
因此,通过将 maxBufferPoolSize 更改为 0,我能够见证我们服务工作的稳定性。当然,由于我们给它的困难,它仍然消耗一些内存,但它没有泄漏。
概括
如果您有性能问题,并尝试通过更改所有配置参数(超时、缓冲区大小、其他内容)来修复它们,请仔细执行此操作。始终评估性能影响。如果您已经遇到问题,请使用高级分析器。
令人惊讶的是,增加 WCF maxBufferPoolSize并不总是意味着性能的提高,如果消息的大小大于 64K,它可能会导致巨大的内存泄漏。对于较大的消息,最好设置 MaxBufferPoolSize=0。对我来说,听起来 GC 并不热衷于从堆中处理大对象,这导致了我们的问题。
希望这可以帮助某人。
参考: