Параметры конфигурации времени выполнения для потоков

В этой статье подробно описаны параметры, которые можно использовать для настройки потоков в .NET.

Примечание.

.NET 6 стандартизует префикс DOTNET_ вместо COMPlus_ для переменных среды, которые настраивают поведение .NET во время выполнения. Но префикс COMPlus_ будет и дальше работать. Если вы используете предыдущую версию среды выполнения .NET, следует и дальше использовать префикс COMPlus_ для переменных среды.

Использование всех групп ЦП в Windows

  • На компьютерах с несколькими группами ЦП этот параметр настраивает, используют ли такие компоненты, как пул потоков, все группы ЦП или только основную группу ЦП процесса. Параметр также влияет на то, что Environment.ProcessorCount возвращается.
  • Если этот параметр включен, все группы ЦП используются и потоки также автоматически распределяются между группами ЦП по умолчанию.
  • Этот параметр включен по умолчанию в Windows 11 и более поздних версиях и отключен по умолчанию в Windows 10 и более ранних версиях. Чтобы этот параметр вступают в силу при включении, сборка GC также должна быть настроена для использования всех групп ЦП; Дополнительные сведения см. в группах ЦП GC.
Имя настройки Values
runtimeconfig.json Неприменимо Неприменимо
Переменная среды COMPlus_Thread_UseAllCpuGroups или DOTNET_Thread_UseAllCpuGroups 0 — отключено
1 — включено

Назначение потоков группам ЦП в Windows

  • На компьютерах с несколькими группами ЦП и всеми группами ЦП используются, этот параметр настраивает, распределяются ли потоки автоматически между группами ЦП.
  • Если этот параметр включен, новые потоки назначаются группе ЦП таким образом, чтобы пытаться полностью заполнить группу ЦП, которая уже используется перед использованием новой группы ЦП.
  • Этот флажок устанавливается по умолчанию.
Имя настройки Values
runtimeconfig.json Неприменимо Неприменимо
Переменная среды COMPlus_Thread_AssignCpuGroups или DOTNET_Thread_AssignCpuGroups 0 — отключено
1 — включено

Минимальное число потоков

  • Указывает минимальное число потоков для рабочего пула потоков.
  • Соответствует методу ThreadPool.SetMinThreads.
Имя настройки Values
runtimeconfig.json System.Threading.ThreadPool.MinThreads Целочисленное значение, представляющее минимальное число потоков.
Свойство MSBuild ThreadPoolMinThreads Целочисленное значение, представляющее минимальное число потоков.
Переменная среды Неприменимо Неприменимо

Примеры

Файл runtimeconfig.json

{
   "runtimeOptions": {
      "configProperties": {
         "System.Threading.ThreadPool.MinThreads": 4
      }
   }
}

файл runtimeconfig.template.json :

{
   "configProperties": {
      "System.Threading.ThreadPool.MinThreads": 4
   }
}

Файл проекта:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <ThreadPoolMinThreads>4</ThreadPoolMinThreads>
  </PropertyGroup>

</Project>

Максимальное число потоков

  • Указывает максимальное число потоков для рабочего пула потоков.
  • Соответствует методу ThreadPool.SetMaxThreads.
Имя настройки Values
runtimeconfig.json System.Threading.ThreadPool.MaxThreads Целочисленное значение, представляющее максимальное число потоков.
Свойство MSBuild ThreadPoolMaxThreads Целочисленное значение, представляющее максимальное число потоков.
Переменная среды Неприменимо Неприменимо

Примеры

Файл runtimeconfig.json

{
   "runtimeOptions": {
      "configProperties": {
         "System.Threading.ThreadPool.MaxThreads": 20
      }
   }
}

файл runtimeconfig.template.json :

{
   "configProperties": {
      "System.Threading.ThreadPool.MaxThreads": 20
   }
}

Файл проекта:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <ThreadPoolMaxThreads>20</ThreadPoolMaxThreads>
  </PropertyGroup>

</Project>

Пул потоков Windows

  • Для проектов в Windows настраивается ли управление потоками пула потоков в пул потоков Windows.
  • Если этот параметр не указан или платформа не windows, вместо этого используется пул потоков .NET.
  • Только приложения, опубликованные в машинном режиме AOT в Windows, используют пул потоков Windows по умолчанию, для которого можно использовать пул потоков .NET, отключив параметр конфигурации.
  • Пул потоков Windows может улучшиться в некоторых случаях, например в тех случаях, когда минимальное количество потоков настроено на высокое значение или когда пул потоков Windows уже используется приложением. Также могут возникнуть случаи, когда пул потоков .NET работает лучше, например при интенсивной обработке операций ввода-вывода на больших компьютерах. Рекомендуется проверка метрики производительности при изменении этого параметра конфигурации.
  • Некоторые API не поддерживаются при использовании пула потоков Windows, например ThreadPool.SetMinThreads, ThreadPool.SetMaxThreadsи ThreadPool.BindHandle(SafeHandle). Параметры конфигурации пула потоков для минимальных и максимальных потоков также не эффективны. ThreadPool.BindHandle(SafeHandle) Альтернативой ThreadPoolBoundHandle является класс.
Имя настройки Values Представленные версии
runtimeconfig.json System.Threading.ThreadPool.UseWindowsThreadPool true — включено
false — отключено
.NET 8
Свойство MSBuild UseWindowsThreadPool true — включено
false — отключено
.NET 8
Переменная среды DOTNET_ThreadPool_UseWindowsThreadPool 1 — включено
0 — отключено
.NET 8

Примеры

Файл runtimeconfig.json

{
   "runtimeOptions": {
      "configProperties": {
         "System.Threading.ThreadPool.UseWindowsThreadPool": true
      }
   }
}

файл runtimeconfig.template.json :

{
   "configProperties": {
      "System.Threading.ThreadPool.UseWindowsThreadPool": true
   }
}

Файл проекта:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <UseWindowsThreadPool>true</UseWindowsThreadPool>
  </PropertyGroup>

</Project>

Внедрение потока в ответ на блокировку рабочих элементов

В некоторых случаях пул потоков обнаруживает, что некоторые рабочие элементы блокируют его потоки. Чтобы компенсировать эту потерю, он внедряет дополнительные потоки. В .NET 6 и более поздних версий вы можете использовать указанные ниже параметры конфигурации среды выполнения, чтобы настроить внедрение потока в ответ на блокировку рабочих элементов. Сейчас эти параметры действуют только для тех рабочих элементов, которые ожидают завершения другой задачи. Типичным примером такого поведения является выполнение синхронных операций через асинхронные.

Имя параметра runtimeconfig.json Description Представленные версии
System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor Когда число потоков достигает ограничения MinThreads, это значение (умноженное на число процессоров) указывает, сколько дополнительных потоков может быть создано без задержки. .NET 6
System.Threading.ThreadPool.Blocking.ThreadsPerDelayStep_ProcCountFactor Когда число потоков достигает ограничения ThreadsToAddWithoutDelay, это значение (умноженное на число процессоров) указывает, после скольких добавленных потоков задержка будет увеличиваться на DelayStepMs перед созданием каждого следующего потока. .NET 6
System.Threading.ThreadPool.Blocking.DelayStepMs Когда число потоков достигает ограничения ThreadsToAddWithoutDelay, это значение указывает, на сколько будет увеличиваться задержка после каждых ThreadsPerDelayStep потоков перед созданием каждого следующего потока. .NET 6
System.Threading.ThreadPool.Blocking.MaxDelayMs Когда число потоков достигает ограничения ThreadsToAddWithoutDelay, это значение указывает максимальную задержку перед созданием каждого следующего потока. .NET 6
System.Threading.ThreadPool.Blocking.IgnoreMemoryUsage По умолчанию скорость внедрения потоков в ответ на блокировку ограничена эвристиками, определяющими наличие достаточной физической памяти. В некоторых ситуациях может быть предпочтительнее внедрять потоки даже в ситуациях с низкой памятью. Вы можете отключить эвристики использования памяти, отключив этот переключатель. .NET 7

Как применяются эти параметры конфигурации

  • Когда число потоков достигает ограничения MinThreads, без задержки могут быть созданы ThreadsToAddWithoutDelay дополнительных потоков.
  • После этого перед созданием каждого следующего потока добавляется задержка, начиная с DelayStepMs.
  • После каждых ThreadsPerDelayStep потоков, добавленных с задержкой, значение задержки увеличивается на DelayStepMs.
  • Значение задержки не может превышать MaxDelayMs.
  • Эти задержки применяются только перед созданием потоков. Если готовые потоки уже доступны, они без всяких задержек выделяются для компенсации потерь, связанных с блокировкой рабочих элементов.
  • Также применяются ограничения на использование физической памяти, а сверх указанного предела система переходит на более медленное внедрение потоков.

Примеры

Файл runtimeconfig.json

{
   "runtimeOptions": {
      "configProperties": {
         "System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor": 5
      }
   }
}

файл runtimeconfig.template.json :

{
   "configProperties": {
      "System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor": 5
   }
}

AutoreleasePool для управляемых потоков

Этот параметр определяет, получает ли каждый управляемый поток неявный экземпляр NSAutoreleasePool при запуске на поддерживаемой платформе macOS.

Имя настройки Values Представленные версии
runtimeconfig.json System.Threading.Thread.EnableAutoreleasePool true или false .NET 6
Свойство MSBuild AutoreleasePoolSupport true или false .NET 6
Переменная среды Неприменимо Н/Д Неприменимо

Примеры

Файл runtimeconfig.json

{
   "runtimeOptions": {
      "configProperties": {
         "System.Threading.Thread.EnableAutoreleasePool": true
      }
   }
}

файл runtimeconfig.template.json :

{
   "configProperties": {
      "System.Threading.Thread.EnableAutoreleasePool": true
   }
}

Файл проекта:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <AutoreleasePoolSupport>true</AutoreleasePoolSupport>
  </PropertyGroup>

</Project>