Udostępnij za pośrednictwem


Zachowanie Environment.ProcessorCount w systemie Windows

W systemie Windows właściwość Environment.ProcessorCount teraz respektuje koligację procesów i twardy limit obiektu zadania na wykorzystanie procesora.

Zmień opis

W poprzednich wersjach platformy .NET właściwość Environment.ProcessorCount w systemie Windows zwraca liczbę procesorów logicznych na maszynie. Właściwość ignoruje przywiązanie procesów i twardy limit obiektu zadania dotyczący wykorzystania CPU. To zachowanie systemu Windows jest niezgodne z zachowaniem w systemach operacyjnych opartych na systemie Unix, w których te limity są przestrzegane.

Począwszy od platformy .NET 6, zachowanie Environment.ProcessorCount w systemie Windows jest zgodne z zachowaniem systemu operacyjnego opartego na systemie Unix. Ogólnie rzecz biorąc, Environment.ProcessorCount zwraca wartość minimalną:

  • Liczba procesorów logicznych na maszynie.
  • Jeśli proces jest uruchomiony z przypisaniem CPU, liczba procesorów, do których proces jest przypisany.
  • Jeśli proces jest uruchomiony z limitem wykorzystania CPU, limit ten został zaokrąglony w górę do najbliższej liczby całkowitej.

W poniższej tabeli przedstawiono, jak wartość Environment.ProcessorCount zmienia się z .NET 5 na .NET 6 na maszynie z ośmioma rdzeniami logicznymi.

Środowisko .NET 5 .NET 6
Proces przypisany do dwóch procesorów logicznych (Windows) 8 2
Proces zbieżny do dwóch procesorów logicznych (Unix) 2 2
Wykorzystanie procesora ograniczone do dwóch rdzeni logicznych (Windows) 8 2
Wykorzystanie procesora ograniczone do równowartości dwóch rdzeni logicznych (Unix) 2 2

Wersja wprowadzona

6.0

Przyczyna zmiany

Ta właściwość jest często używana do określania współczynnika równoległości dla procesu. Zaobserwowaliśmy, że nie ograniczenie wartości właściwości na podstawie wartości affinitization i limitu wykorzystania procesora CPU może prowadzić do gorszej wydajności.

Przejrzyj kod używany Environment.ProcessorCount do skalowania w dół współczynnika równoległości w oparciu o konfigurację aplikacji lub systemu. Nawet jeśli kod bierze pod uwagę maskę koligacji procesu lub limit wykorzystania procesora obiektu zadania, może się skończyć na użyciu mniejszego równoległego przetwarzania niż zamierzone.

Przejrzyj kod, który oczekuje, że Environment.ProcessorCount zwróci całkowitą liczbę procesorów logicznych na maszynie, aby na przykład wyświetlić tę liczbę użytkownikowi. Zamiast tego możesz użyć wywołania PInvoke do GetSystemInfo lub GetNativeSystemInfo API Win32.

Jeśli kod działa gorzej w wyniku tej zmiany, możesz użyć zmiennej środowiskowej DOTNET_PROCESSOR_COUNT, aby nadpisać liczbę procesorów, które uznawane są za dostępne przez środowisko uruchomieniowe platformy .NET i jak zgłoszone przez właściwość Environment.ProcessorCount. Na przykład, jeśli ustawisz wartość DOTNET_PROCESSOR_COUNT na 4, Environment.ProcessorCount zignoruje wszelkie koligacje procesów oraz limit wykorzystania CPU i zwróci wartość 4. Aby naśladować zachowanie platformy .NET 5, ustaw zmienną środowiskową na %NUMBER_OF_PROCESSORS%.

Interfejsy API, których dotyczy problem