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 使用率の上限は次の整数に切り上げられます。
次の表は、8 個の論理プロセッサを搭載したマシン上での .NET 5 から .NET 6 への Environment.ProcessorCount の値の変化を示しています。
環境 | .NET 5 | .NET 6 |
---|---|---|
2 つの論理プロセッサとのアフィニティがあるプロセス (Windows) | 8 | 2 |
2 つの論理プロセッサとのアフィニティがあるプロセス (Unix) | 2 | 2 |
2 つの論理プロセッサに相当する CPU 使用率の制限 (Windows) | 8 | 2 |
2 つの論理プロセッサに相当する CPU 使用率の制限 (Unix) | 2 | 2 |
導入されたバージョン
6.0
変更理由
このプロパティは、プロセスの並列処理係数を決定するためによく使用されます。 アフィニティと CPU 使用率の制限に基づいてプロパティの値を制限しないと、パフォーマンスが低下する可能性があることが確認されました。
推奨アクション
Environment.ProcessorCount を使用して、アプリケーションまたはシステム構成に基づいて並列処理係数をスケールダウンするコードをレビューします。 コードがプロセスのアフィニティ マスクまたはジョブ オブジェクトの CPU 使用率の制限を考慮しても、意図したよりも低い並列処理が使用される可能性があります。
ユーザーに表示するためなどに、Environment.ProcessorCount でマシンの論理プロセッサの合計数を返すことが想定されるコードをレビューします。 代わりに、 GetSystemInfo
または GetNativeSystemInfo
Win32 API に対する PInvoke 呼び出しを使用できます。
この変更の結果としてコードのパフォーマンスが低下する場合は、DOTNET_PROCESSOR_COUNT
環境変数を使用して、.NET ランタイムで使用可能であり、Environment.ProcessorCount プロパティによって報告されると考えられるプロセッサの数をオーバーライドできます。 たとえば、DOTNET_PROCESSOR_COUNT
を 4 に設定すると、 Environment.ProcessorCount ではプロセス アフィニティと CPU 使用率の制限が無視され、4 が返されます。 .NET 5 の動作を模倣するには、環境変数を %NUMBER_OF_PROCESSORS%
に設定します。
影響を受ける API
.NET