Udostępnij za pośrednictwem


Zachowanie Environment.ProcessorCount w systemie Windows

W systemie Windows Environment.ProcessorCount właściwość uwzględnia teraz koligację procesów i twardy limit obiektu zadania w zakresie wykorzystania procesora CPU.

Opis zmiany

W poprzednich wersjach Environment.ProcessorCount platformy .NET właściwość w systemie Windows zwraca liczbę procesorów logicznych na maszynie. Właściwość ignoruje koligację procesów i twardy limit obiektu zadania w zakresie wykorzystania procesora 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 koligacją procesora CPU, liczba procesorów, do których proces jest affinitized.
  • Jeśli proces jest uruchomiony z limitem wykorzystania procesora CPU, limit wykorzystania procesora CPU został zaokrąglony do następnej liczby całkowitej.

W poniższej tabeli przedstawiono, jak wartość Environment.ProcessorCount zmian z platformy .NET 5 do .NET 6 na maszynie z ośmioma procesorami logicznymi:

Środowisko .NET 5 .NET 6
Przetwarzanie affinitized do dwóch procesorów logicznych (Windows) 8 2
Przetwarzanie affinitized do dwóch procesorów logicznych (Unix) 2 2
Wykorzystanie procesora CPU ograniczone do odpowiednika dwóch procesorów logicznych (Windows) 8 2
Wykorzystanie procesora CPU ograniczone do odpowiednika dwóch procesorów logicznych (Unix) 2 2

Wprowadzona wersja

6.0

Przyczyna wprowadzenia 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 przyjmuje maskę koligacji procesu lub limit wykorzystania procesora CPU obiektu zadania, może to spowodować użycie mniejszej równoległości niż zamierzone.

Przejrzyj kod, który oczekuje Environment.ProcessorCount zwrócenia całkowitej liczby procesorów logicznych na maszynie, na przykład, aby wyświetlić go użytkownikowi. Zamiast tego możesz użyć wywołania PInvoke do GetSystemInfo interfejsów API lub GetNativeSystemInfo Win32.

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

Dotyczy interfejsów API