2017-09-05 80 views
1

我們在託管Web API的Docker/Ubuntu上運行.NET Core 1.1容器。這些容器基於microsoft/aspnetcore:1.1.2,其中包含針對Ubuntu x64平臺發佈的二進制文件,並在構建映像時複製到其中,儘可能簡單。如何減少.NET Core docker容器的內存使用量?

我們的Web APIs目前也非常簡單,至多有少數控制器從SQL Server中提取數據。它們沒有顯着的緩存或任何異常情況,但每次運行時都使用500-900 Mb的RAM。這不是由於內存泄漏造成的 - 每個容器的內存使用量隨時間變化都是穩定的,在使用過程中上下變化10-15Mb。

這個級別的RAM使用應該是完全沒有必要的 - 我該如何減少它?

我回顧了Docker container memory use的問題,但它有所不同,現在還沒有答案。

+0

限制容器上的最大內存量。大多數應用程序(包括數據庫服務器)都會嘗試獲取儘可能多的內存,然後運行它們,然後查看您的應用程序是否可以在此限制範圍內運行。 – Tseng

+0

是的,謝謝,這在某種程度上有效,但是我看到的是容器未使用內存減少,內存只是進入交換,這會降低API的性能。 – Peter

回答

2

我已經嘗試了幾種方法來解決這個問題,並且從.NET Core團隊獲得了響應,所以我將在此處記錄以防其他人使用。

1)我已經有一些成功,指定使用標誌的Docker容器命令行的內存限制,例如。 --memory="200m" --memory-swap="500m";這可以用來控制內存使用情況並防止服務器意外運行內存不足,但我所看到的是容器所需的內存不會顯着減少,它只會被強制轉換爲交換,這會降低性能API。我還沒有試過--memory="200m" --memory-swap="200m"(即不允許交換) - 我會在有機會的時候這麼做,我懷疑這個API會拋出一個內存不足異常,或者會被嚴重降級。

2)使用.NET 1.1(如果需要限制內存)的最佳解決方案似乎是通過將<ServerGarbageCollection>false</ServerGarbageCollection>放入.csproj文件PropertyGroup部分來將GC切換到工作站模式。在我的情況下,這會將內存使用量降低到每個容器80-100mb。服務器垃圾收集的目的是在大規模併發期間處理內存清理,所以如果你正在構建API或經歷過這種情況的站點,這可能不是一個好的解決方案,但是我們的API只有少量的併發用戶,所以它似乎工作正常好。

更長期的,我從@janvorli得到了CoreCLR團隊的有用回覆。很顯然,這個問題是由.NET Core GC中的一個錯誤引起的,它將在即將發佈的2.0.2版本中得到修復。您可以閱讀 this issue on the Github repo(搜索「ettery」)中的詳細信息。