Het gedrag van Environment.ProcessorCount in Windows

In Windows respecteert de Environment.ProcessorCount eigenschap nu procesaffiniteit en de vaste limiet voor het CPU-gebruik van het taakobject.

Beschrijving wijzigen

In eerdere .NET-versies retourneert de Environment.ProcessorCount eigenschap in Windows het aantal logische processors op de computer. De eigenschap negeert procesaffiniteit en de vaste limiet van het taakobject voor CPU-gebruik. Dat Windows-gedrag niet overeenkomt met het gedrag op Unix-besturingssystemen, waarbij deze limieten worden gerespecteerd.

Vanaf .NET 6 is het gedrag van Environment.ProcessorCount op Windows consistent met het gedrag op Unix-besturingssystemen. In het algemeen geeft Environment.ProcessorCount het minimum van:

  • Het aantal logische processors op de computer.
  • Als het proces een processor-affiniteit heeft, is het aantal processors waarvoor het proces is ingesteld.
  • Als het proces wordt uitgevoerd met een limiet voor het CPU-gebruik, wordt de limiet voor HET CPU-gebruik afgerond tot het volgende gehele getal.

In de volgende tabel ziet u hoe de waarde van Environment.ProcessorCount verandert van .NET 5 naar .NET 6 op een computer met acht logische processors.

Milieu .NET 5 .NET 6
Proces geassocieerd met twee logische processors (Windows) 8 2
Proces toegewezen aan twee logische processors (Unix) 2 2
CPU-gebruik beperkt tot het equivalent van twee logische processors (Windows) 8 2
CPU-gebruik beperkt tot het equivalent van twee logische processors (Unix) 2 2

Geïntroduceerde versie

6,0

Reden voor wijziging

Deze eigenschap wordt vaak gebruikt om de parallellismefactor voor een proces te bepalen. We hebben vastgesteld dat het niet beperken van de waarde van de eigenschap op basis van affiniteit en cpu-gebruikslimiet kan leiden tot slechtere prestaties.

Bekijk code die wordt gebruikt Environment.ProcessorCount om de parallelle uitvoeringsfactor omlaag te schalen op basis van toepassings- of systeemconfiguratie. Zelfs als de code het affiniteitsmasker van het proces of de CPU-gebruikslimiet van het taakobject in aanmerking neemt, kan deze uiteindelijk lager parallellisme gebruiken dan bedoeld is.

Bekijk de code die Environment.ProcessorCount verwacht het totale aantal logische processors op de computer te retourneren, bijvoorbeeld om dit aan een gebruiker weer te geven. In plaats daarvan kunt u een PInvoke-aanroep naar de GetSystemInfo of GetNativeSystemInfo Win32-API's gebruiken.

Als code slechter presteert als gevolg van deze wijziging, kunt u de DOTNET_PROCESSOR_COUNT omgevingsvariabele gebruiken om het aantal processors te overschrijven dat beschikbaar is voor de .NET-runtime en door de Environment.ProcessorCount eigenschap is gerapporteerd. Als u DOTNET_PROCESSOR_COUNT bijvoorbeeld instelt op 4, negeert Environment.ProcessorCount elke procesaffiniteit en CPU-gebruikslimiet en retourneert 4. Als u het gedrag van .NET 5 wilt nabootsen, stelt u de omgevingsvariabele in op %NUMBER_OF_PROCESSORS%.

Betreffende API's