次の方法で共有


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