Windows では、 Environment.ProcessorCount プロパティは、プロセス アフィニティとジョブ オブジェクトの CPU 使用率に対するハード制限を考慮するようになりました。
変更の説明
以前の .NET バージョンでは、Windows の Environment.ProcessorCount プロパティは、コンピューター上の論理プロセッサの数を返します。 このプロパティは、CPU 使用率に対するプロセス アフィニティとジョブ オブジェクトのハード制限を無視します。 その Windows の動作は、Unix ベースのオペレーティング システムでの動作と矛盾しており、これらの制限が適用されます。
.NET 6 以降、Windows での Environment.ProcessorCount の動作は、Unix ベースのオペレーティング システムでの動作と一致しています。 一般に、 Environment.ProcessorCount は次の最小値を返します。
- マシン上の論理プロセッサの数。
- プロセスが CPU アフィニティを使って稼働している場合、それが割り当てられているプロセッサの数。
- プロセスが CPU 使用率の制限で実行されている場合、CPU 使用率の制限は次の整数に切り上げられます。
次の表は、 Environment.ProcessorCount の値が、8 つの論理プロセッサを搭載したコンピューター上の .NET 5 から .NET 6 にどのように変化するかを示しています。
環境 | .NET 5 | .NET 6 |
---|---|---|
2 つの論理プロセッサに関連付けられたプロセス (Windows) | 8 | 2 |
2 つの論理プロセッサに関連付けられたプロセス (Unix) | 2 | 2 |
CPU 使用率は、2 つの論理プロセッサに相当するものに制限されます (Windows) | 8 | 2 |
CPU 使用率は、2 つの論理プロセッサに相当するものに制限されます (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