Поделиться через


Поведение Environment.ProcessorCount в Windows

Свойство Environment.ProcessorCount в Windows теперь учитывает привязку процессов и жесткое ограничение на использование ЦП для объекта задания.

Описание изменения

В предыдущих версиях .NET свойство Environment.ProcessorCount в Windows возвращало число логических процессоров на компьютере. Свойство не учитывало привязку процессов и жесткое ограничение на использование ЦП для объекта задания. Работа этого свойства в Windows не согласуется с его работой в операционных системах на основе Unix, в которых эти ограничения учитываются.

Начиная с версии .NET 6, действие свойства Environment.ProcessorCount в Windows согласуется с его действием в ОС на базе Unix. В общем случае свойство Environment.ProcessorCount возвращает наименьшее из следующих значений:

  • число логических процессоров на компьютере;
  • число процессоров, к которым привязан процесс, если он выполняется с такой привязкой;
  • лимит на использование ЦП, округленный до ближайшего большего целого числа, если для процесса действует такой лимит.

В следующей таблице показано значение свойства Environment.ProcessorCount в .NET 5 и .NET 6 на компьютере с восемью логическими процессорами.

Среда .NET 5 .NET 6
Процесс привязан к двум логическим процессорам (Windows) 8 2
Процесс привязан к двум логическим процессорам (Unix) 2 2
Использование ЦП ограничено эквивалентом двух логических процессоров (Windows) 8 2
Использование ЦП ограничено эквивалентом двух логических процессоров (Unix) 2 2

Представленные версии

6,0

Причина изменения

Это свойство часто используется для определения степени параллелизма процесса. По нашим наблюдениям, если не ограничивать значение свойства в зависимости от привязки и использования ЦП, то возможно ухудшение производительности.

Проверьте код, который использует Environment.ProcessorCount для уменьшения масштаба степени параллелизма в зависимости от конфигурации системы или приложений. Даже если код учитывает маску сходства процесса или ограничение на использование ЦП объектом задания, результирующая степень параллелизма может оказаться ниже запланированной.

Проверьте код, который ожидает, что свойство Environment.ProcessorCount возвратит общее число логических процессоров на компьютере, например чтобы отобразить его пользователю. Вместо этого свойства вы можете использовать вызов PInvoke для API-интерфейсов Win32 GetSystemInfo или GetNativeSystemInfo.

Если в результате этого изменения код работает хуже, можно использовать переменную среды DOTNET_PROCESSOR_COUNT, чтобы переопределить количество процессоров, которые должны быть доступны среде выполнения .NET и которые сообщаются свойством Environment.ProcessorCount. Например, если задать свойству DOTNET_PROCESSOR_COUNT значение 4, то Environment.ProcessorCount не будет учитывать привязку процессов и лимит на использование ЦП и возвратит 4. Чтобы имитировать поведение .NET 5, задайте для переменной среды значение %NUMBER_OF_PROCESSORS%.

Затронутые API