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


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

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

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

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

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

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

Минимальные потоки

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

Примеры

Файл 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 .
Название настройки Ценности
runtimeconfig.json System.Threading.ThreadPool.MaxThreads Целое число, представляющее максимальное количество потоков
Свойство MSBuild ThreadPoolMaxThreads Целое число, представляющее максимальное количество потоков
Переменная среды N/A N/A

Примеры

Файл 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 является класс.
Название настройки Ценности Представленная версия
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.

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

Примеры

Файл 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>