.Net核心級的效能優化(GC篇)

2023-10-13 12:01:36

1.前言

大部分人對於.Net效能優化,都停留在業務層面。或者簡單的.Net框架設定層面。本篇來看下.Net核心部分GC垃圾回收設定:保留VM,大物件,獨立GC,節省記憶體等.Net8裡面有很多的各種GC設定,用以幫助你的程式進行最大程度效能提升和優化。

文章分為兩部分,第一個是GC有哪些動作可以效能最大的優化,第二部分就是如何設定這些動作以便讓你的程式達到這些效能效果。

2.GC動作

1.節省記憶體:System.GC.ConserveMemory(預設值為0)

2.獨立GC:DOTNET_GCName(預設值,coreclr.dll的預設GC)

3.大型物件堆閾值DOTNET_GCLOHThreshold(預設值85000位元組,指定值必須大於其)

4.允許大型物件DOTNET_gcAllowVeryLargeObjects(預設垃圾回收大於2GB的陣列,也就是預設值為1)

5.大型頁面DOTNET_GCLargePages,指示堆硬限制是否使用大型頁面 DOTNET_GCLargePages(預設值為0,也即是不使用)

6.保留VM,DOTNET_GCRetainVM。意思是把一個經過垃圾回收,沒有物件的段是被系統回收還是放在堆段列表,以便下次使用.(預設值false,被系統回收)

7.高記憶體百分比DOTNET_GCHighMemPercent,當實體記憶體負載大於其指定的值的時候,進行完整的垃圾回收,以便騰出跟多空間(預設負載閾值介於90%到 97%之間)

8.物件堆限制百分比

DOTNET_GCHeapHardLimitSOHPercent,DOTNET_GCHeapHardLimitLOHPercent,DOTNET_GCHeapHardLimitPOHPercent.分別為小物件堆,大物件堆,固定堆的限制百分比。

9.物件堆限制

DOTNET_GCHeapHardLimitSOH,DOTNET_GCHeapHardLimitLOH,DOTNET_GCHeapHardLimitPOH可以根據每個物件堆指定 GC 的允許堆使用量

10.堆限制百分比DOTNET_GCHeapHardLimitPercent預設值(僅在某些情況下適用)是20MB或容器記憶體限制的75%(以較大者為準)

11.堆限制DOTNET_GCHeapHardLimit預設值(僅在某些情況下適用)是20MB或容器記憶體限制的75%(以較大者為準)

12.關聯DOTNET_GCNoAffinitize指定是否將垃圾回收執行緒與處理器關聯。若要關聯一個 GC 執行緒,則意味著它只能在其特定的 CPU 上執行。為每個 GC 執行緒建立一個堆。

13.CPU組DOTNET_GCCpuGroup,設定垃圾回收器是否使用CPU組。(預設值為0,表示不會跨CPU組)

14.關聯範圍DOTNET_GCHeapAffinitizeRanges,指定用於垃圾回收器執行緒的處理器列表。以逗號分隔的處理器編號列表或處理器編號範圍。
Unix 範例:「1-10,12,50-52,70」
Windows 範例:「0:1-10,0:12,1:50-52,1:70」

15.關聯掩碼DOTNET_GCHeapAffinitizeMask,指定垃圾回收器執行緒應使用的確切處理器數。

16.堆計數DOTNET_GCHeapCount限制通過垃圾回收器建立的堆數。

3.設定

設定這些GC設定,主要是可以從三個方面來設定。
其一:執行時組態檔runtimeconfig.json
以保留VM為例:

{
   "runtimeOptions": {
      "configProperties": {
         "System.GC.RetainVM": true
      }
   }
}

其二:MSbuild設定
以保留VM為例:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <RetainVMGarbageCollection>true</RetainVMGarbageCollection>
  </PropertyGroup>
</Project>

其三:環境變數設定

Windows CMD:
set DOTNET_GCRetainVM=true

Windows Powershell:
$env:DOTNET_GCRetainVM=true

Unix/Linux
export DOTNET_GCRetainVM=true

以上16個GC動作均可以通過這個三個設定方式來進行設定。

參考微軟官網:

https://learn.microsoft.com/en-us/dotnet/core/runtime-config/garbage-collector


歡迎關注公眾號:jianghupt,文章首發,以及更多高階內容分享。