固定内存会导致C#WebApi碎片化

时间:2018-06-14 02:30:24

标签: c# memory-management asp.net-web-api2

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

在生产中我们可以看到,大约一周内存使用量不断增长,然后保持在较高水平。偶尔我们会得到OutOfMemoryExceptions。使用R#dotMemory profiler我们找不到内存泄漏,但我们可以看到Gen 0到2对象存在巨大的碎片(高达99%!)。我们假设这与dotMemory标记为固定的OverlappedData对象有关。

有一些帖子处理这类问题,一个好的问题是http://www.ahuwanya.net/blog/post/Buffer-Pooling-for-NET-Socket-Operations - 摘要是碎片与IO操作的缓冲区固定有关。所以在这个基础上我们有一些问题:

  1. 我们如何引入一个缓冲池,如带有套接字的帖子所示,用于ApiController和HttpClient?
  2. 我们如何强制释放固定内存,例如关闭连接 - 而不会造成重大性能损失?
  3. 如何通过获取有关固定内存的更多详细信息来确保假设是正确的?我们发现了一些关于使用Perfmon记录堆栈跟踪的内容,但我们将非常感谢您提供更详细的指南。
  4. 当然,任何其他建议,提示或评论都可以帮助我们缩小范围并解决问题。请注意,我们希望解决此问题,但没有针对它的解决方法(例如每天重新启动IIS工作进程)。

1 个答案:

答案 0 :(得分:0)

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