Параметры конфигурации времени выполнения для потоков
В этой статье подробно описаны параметры, которые можно использовать для настройки потоков в .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>