Windows 上的 Environment.ProcessorCount 行為

在 Windows 上 Environment.ProcessorCount 屬性現在會採用進程親和性,以及工作物件的 CPU 使用率硬性限制。

變更描述

在之前 .NET 版本中,Windows 上的 Environment.ProcessorCount 屬性會傳回電腦上的邏輯處理器數目。 屬性會忽略進程親和性,以及工作物件的 CPU 使用率硬性限制。 該 Windows 行為與 Unix 作業系統上的行為不一致,其中會遵守那些限制。

從 .NET 6 開始,Windows 上 Environment.ProcessorCount 的行為會與 Unix 型作業系統的行為一致。 一般而言,Environment.ProcessorCount 會傳回下列項目的最小值:

  • 電腦上的邏輯處理器數目。
  • 如果進程是以 CPU 親和性執行,進程所要親和的處理器數目。
  • 如果進程以 CPU 使用率限制執行,CPU 使用率限制會進位到下一個整數。

下列資料表顯示在具有八個邏輯處理器的電腦上,Environment.ProcessorCount 的值如何從 .NET 5 變更為 .NET 6:

Environment .NET 5 .NET 6
兩個邏輯處理器的進程親和性 (Windows) 8 2
兩個邏輯處理器的進程親和性 (Unix) 2 2
CPU 使用率限制為兩個邏輯處理器 (Windows) 8 2
CPU 使用率限制為兩個邏輯處理器 (Unix) 2 2

導入的版本

6.0

變更原因

這個屬性經常用來判斷進程平行處理原則因素。 我們觀察到,未根據同質性和 CPU 使用率限制來限制屬性值,可能會導致效能變差。

檢閱使用 Environment.ProcessorCount 來根據應用程式或系統設定相應減少平行處理原則因素的程式碼。 即使程式碼採用進程的親和性遮罩或工作物件的 CPU 使用率限制納入考慮,最終還是會使用比預期較低的平行處理原則。

例如,檢閱預期 Environment.ProcessorCount 會傳回機器上邏輯處理器總數的程式碼,來向使用者顯示。 相反地,您可以使用 GetSystemInfoGetNativeSystemInfo WIN32 API 的 PInvoke 呼叫。

如果程式碼因這項變更而執行得更糟,您可以使用 DOTNET_PROCESSOR_COUNT 環境變數來覆寫 .NET 執行階段認為可用並由 Environment.ProcessorCount 屬性報告的處理器數目。 例如,如果您設定 DOTNET_PROCESSOR_COUNT 為 4,Environment.ProcessorCount 將會忽略任何進程親和性和 CPU 使用率限制,並傳回 4。 若要模擬 .NET 5 行為,請將環境變數設定為 %NUMBER_OF_PROCESSORS%

受影響的 API