繁体   English   中英

固定的内存导致C#WebApi中的碎片

[英]Pinned memory causes fragmentation in C# WebApi

我们有一个Web应用程序可以用作反向代理(转发请求和响应)。 这是一个更大的平台的一部分,因此有大量的电话通过那里。 该应用程序在IIS上运行,我们使用ASP.NET WebApis ApiController接收并使用HttpClient重新发送调用(.NET 4.6.1上较新的NuGet程序包)。 我们已禁用IIS工作进程回收。

在生产中,我们可以看到,在大约一周的时间里,内存使用量一直在增长,然后保持较高水平。 有时我们会收到OutOfMemoryExceptions。 使用R#dotMemory事件探查器,我们找不到内存泄漏,但是我们可以看到Gen 0到2对象存在巨大的碎片(高达99%!)。 我们假定这与dotMemory标记为固定的OverlappedData对象有关。

有一些关于这种问题的文章,一个很好的是http://www.ahuwanya.net/blog/post/Buffer-Pooling-for-NET-Socket-Operations-摘要是碎片是与IO操作的缓冲区固定有关。 因此,在此基础上,我们有一些问题:

  1. 我们如何引入一个如Socket所示的缓冲池,以便与ApiController和HttpClient一起使用?
  2. 我们如何强制释放固定的内存(例如通过关闭连接)而又不会造成明显的性能损失?
  3. 我们如何通过获取有关固定内存的更多详细信息来确保假设正确无误? 我们发现了一些有关使用Perfmon记录堆栈跟踪的信息,但更详细的指南将不胜感激。

当然,任何其他有助于我们缩小范围并解决问题的建议,暗示或言论也应受到赞赏。 请注意,我们要解决此问题,而没有解决方法(例如每天重新启动IIS工作进程)。

在当前版本中,我们不再存在此问题。 我们对此没有真正的解释-似乎唯一改变的是我们删除了一些“易失”定义。 这可能是原因吗? 也许是的-实际上我们假设是这样,但没有真正的证据。 根据文档,尚不清楚volatile是否会阻止内存优化,但有可能了解这一点。 所以我们只是这样接受它...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM