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