簡體   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