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

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

Примечание

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

Группы ЦП

  • Определяет, выполняется ли автоматическое распределение потоков между группами ЦП.
  • Если этот параметр не задан, потоки не распределяются между группами ЦП. Это эквивалентно присвоению значения 0.
Имя параметра Значения
runtimeconfig.json Н/Д Н/Д
Переменная среды COMPlus_Thread_UseAllCpuGroups или DOTNET_Thread_UseAllCpuGroups 0 — отключено
1 — включено

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

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

Примеры

Файл runtimeconfig.json

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

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

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

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

</Project>

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

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

Примеры

Файл runtimeconfig.json

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

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

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

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

</Project>

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

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

Имя параметра runtimeconfig.json Описание Представленная версия
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
      }
   }
}

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

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

Имя параметра Значения Представленная версия
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
      }
   }
}

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

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

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

</Project>