.NET Core 兩種GC模式: Server GC / Workstation GC Server GC : 主要應用於多處理器系統,並且作為ASP.NET Core宿主的預設配置。它會為每個處理器都創建一個GC Heap,並且會並行執行回收操作。該模式的GC可以最大化吞吐量和較好的收縮性。這種... ...
.NET Core 兩種GC模式:
Server GC / Workstation GC
Server GC :
主要應用於多處理器系統,並且作為ASP.NET Core宿主的預設配置。它會為每個處理器都創建一個GC Heap,並且會並行執行回收操作。該模式的GC可以最大化吞吐量和較好的收縮性。這種模式的特點是初始分配的記憶體較大,並且儘可能不回收記憶體,進行回收用時會很耗時,併進行記憶體碎片整理工作。用一句簡單的話說,這個就是貪婪模式,通過儘可能多的獲得記憶體和少回收來得到更好的性能。結果就是高記憶體使用率性能較好。
Workstation GC :
主要應用於單處理器系統,Workstation GC儘可能地通過減少垃圾回收過程中程式的暫停次數來提高性能。低負載且不常在後臺(如服務)執行任務的應用程式,可以在禁用併發垃圾回收的情況下使用工作站垃圾回收。特點是會頻繁回收,來阻止一次較長時間的回收。結果就是低記憶體使用率性能較差。
簡單測試
以下測試結果都在同一臺電腦上,配置如下:
- Windows 7 Ultimate
- Intel Core I3-3220 @ 3.30 GHZ
- 8G記憶體,可用空間3GB
- SQL Server 2014
被測試的程式是ZKEACMS,首頁,單面壓力測試,5000個請求,1000個併發。測試結果如下:
Server GC :
響應結果如下,大概167.81 Req/s,這個結果並不是每次都一樣,會有所偏差,僅供參考:
記憶體使用漲到差不多600多M左右,期間會有上下上下浮動,情況如下圖所示:
經過反覆多次的測試,記憶體最高時漲到800多M,這與可用記憶體有關係,如果可用記憶體更多,還會漲到1G或更高然後再掉下來:
Workstation GC :
響應結果如下圖所示,大概151.33 Req/s,看起來是要比Server GC差一點點,並且多次測試結果,總體都是更差些。
記憶體使用情況一直在200M左右浮動,反覆的壓力測試,也不會有大的大起大落,這與它積極的回收有關係:
記憶體回收模式的切換
現在對.Net Core的不同的記憶體回收模式產生的影響已經有了一定的瞭解,那就可以看你的個人情況做出選擇了。.Net Core預設的貪婪模式可以得到更好的性能,這沒有什麼問題是,畢竟記憶體不用放在那也是浪費。當然如果你的伺服器上許多的程式在跑,並對記憶體有較高的限制要求不要影響到其它的程式,那就要做一些配置了。
開發環境
在開發環境,你可以編輯你的項目文件,加上以下配置,重新生成即可:
<PropertyGroup>
<ServerGarbageCollection>false</ServerGarbageCollection>
</PropertyGroup>
生產環境
可以不用修改重新部署,直接到你的程式中找到 *.runtimeconfig.json,如:ZKEACMS.WebHost.runtimeconfig.json,修改"System.GC.Server": false,重啟程式即可:
"configProperties": { "System.GC.Server": false }
參考資料:https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals
原文地址:http://www.zkea.net/codesnippet/detail/post-81