Sdílet prostřednictvím


Chování "Environment.ProcessorCount" ve Windows

Ve Windows nyní vlastnost Environment.ProcessorCount respektuje přiřazení procesu a pevný limit využití procesoru, jak je určen objektu úlohy.

Změnit popis

Ve starších verzích .NET vlastnost Environment.ProcessorCount ve Windows vracela počet logických procesorů na počítači. Vlastnost ignoruje spřažení procesu a pevný limit objektu úlohy na využití procesoru. Toto chování systému Windows je nekonzistentní s chováním v operačních systémech Unix, kde jsou tyto limity dodrženy.

Počínaje rozhraním .NET 6 je chování Environment.ProcessorCount na Windows konzistentní s chováním na operačních systémech založených na Unixu. Obecně Environment.ProcessorCount vrátí minimum z:

  • Počet logických procesorů na počítači.
  • Pokud proces běží s nastavením vazby na procesor, počet procesorů, ke kterým je proces vázán.
  • Pokud proces běží s limitem využití procesoru, zaokrouhluje se limit využití procesoru nahoru na další celé číslo.

Následující tabulka ukazuje, jak se hodnota Environment.ProcessorCount mění od .NET 5 na .NET 6 na počítači s osmi logickými procesory.

Životní prostředí .NET 5 .NET 6
Proces spřažený se dvěma logickými procesory (Windows) 8 2
Proces přiřazený ke dvěma logickým procesorům (Unix) 2 2
Využití procesoru omezené na ekvivalent dvou logických procesorů (Windows) 8 2
Využití procesoru omezené na ekvivalent dvou logických procesorů (Unix) 2 2

Verze byla představena

6.0

Důvod změny

Tato vlastnost se často používá k určení faktoru paralelismu procesu. Zjistili jsme, že neomezení hodnoty vlastnosti na základě spřažení a limitu využití procesoru může vést k horšímu výkonu.

Zkontrolujte kód, který používá Environment.ProcessorCount ke snížení kapacity faktoru paralelismu na základě konfigurace aplikace nebo systému. I když kód vezme v úvahu nastavení afinity procesu nebo vypočítá limit využití CPU objektu úlohy, může nakonec použít nižší paralelismus, než bylo zamýšleno.

Zkontrolujte kód, který očekává Environment.ProcessorCount , že vrátí celkový počet logických procesorů na počítači, například aby ho zobrazil uživateli. Místo toho můžete použít volání PInvoke k rozhraní Win32 API GetSystemInfo nebo GetNativeSystemInfo.

Pokud kód v důsledku této změny má horší výkon, můžete pomocí proměnné prostředí DOTNET_PROCESSOR_COUNT přepsat počet procesorů, které modul runtime .NET považuje za dostupné a které hlásí vlastnost Environment.ProcessorCount. Pokud například nastavíte DOTNET_PROCESSOR_COUNT hodnotu 4, Environment.ProcessorCount ignoruje všechny spřažení procesů a omezení využití procesoru a vrátí hodnotu 4. Pokud chcete napodobovat chování rozhraní .NET 5, nastavte proměnnou prostředí na %NUMBER_OF_PROCESSORS%hodnotu .

Ovlivněná rozhraní API