Partilhar via


Opções de configuração em tempo de execução para threading

Este artigo detalha as definições que pode usar para configurar a threading em .NET.

Usar todos os grupos de CPU no Windows

  • Em máquinas que têm múltiplos grupos de CPU, esta definição configura se componentes como o pool de threads utilizam todos os grupos de CPU ou apenas o grupo principal de CPU do processo. A definição também afeta o que Environment.ProcessorCount devolve.
  • Quando esta configuração está ativada, todos os grupos de CPU são usados e as threads também são distribuídas automaticamente entre os grupos de CPU por defeito.
  • Esta definição está ativada por defeito no Windows 11 e versões posteriores, e desativada por defeito no Windows 10 e versões anteriores. Para que esta configuração tenha efeito quando ativada, o GC deve também estar configurado para usar todos os grupos de CPU; para mais informações, veja GC CPU groups.
Nome da configuração Valores
runtimeconfig.json N/A N/A
Variável de ambiente DOTNET_Thread_UseAllCpuGroups 0 - deficientes
1 - ativado

Atribuir threads a grupos de CPU no Windows

  • Em máquinas que têm múltiplos grupos de CPU e todos os grupos de CPU estão a ser usados, esta definição configura se os threads são automaticamente distribuídos entre os grupos de CPU.
  • Quando esta definição está ativada, novos threads são atribuídos a um grupo de CPU de forma a tentar preencher totalmente um grupo de CPU já em uso antes de utilizar um novo grupo de CPU.
  • Esta definição está ativada por predefinição.
Nome da configuração Valores
runtimeconfig.json N/A N/A
Variável de ambiente DOTNET_Thread_AssignCpuGroups 0 - deficientes
1 - ativado

Threads mínimos

  • Especifica o número mínimo de threads para o pool de threads de trabalho.
  • Corresponde ao ThreadPool.SetMinThreads método.
Nome da configuração Valores
runtimeconfig.json System.Threading.ThreadPool.MinThreads Um inteiro que representa o número mínimo de threads
Propriedade MSBuild ThreadPoolMinThreads Um inteiro que representa o número mínimo de threads
Variável de ambiente N/A N/A

Examples

runtimeconfig.json ficheiro:

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

runtimeconfig.template.json arquivo:

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

Ficheiro do projeto:

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

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

</Project>

Threads máximos

  • Especifica o número máximo de threads para o pool de threads de trabalho.
  • Corresponde ao ThreadPool.SetMaxThreads método.
Nome da configuração Valores
runtimeconfig.json System.Threading.ThreadPool.MaxThreads Um inteiro que representa o número máximo de threads
Propriedade MSBuild ThreadPoolMaxThreads Um inteiro que representa o número máximo de threads
Variável de ambiente N/A N/A

Examples

runtimeconfig.json ficheiro:

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

runtimeconfig.template.json arquivo:

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

Ficheiro do projeto:

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

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

</Project>

Pool de threads do Windows

  • Para projetos no Windows, configura se a gestão do pool de threads é delegada ao pool de threads do Windows.
  • Se omitires esta definição ou se a plataforma não for o Windows, usa-se o pool de threads .NET em vez disso.
  • Apenas as aplicações publicadas com AOT nativo no Windows usam o pool de threads do Windows por defeito, para o qual pode optar por usar o pool de threads .NET desativando a definição de configuração.
  • O pool de threads do Windows pode ter um desempenho melhor em alguns casos, como em casos em que o número mínimo de threads está configurado para um valor elevado, ou quando o pool de threads do Windows já está a ser fortemente utilizado pela aplicação. Também podem existir casos em que o pool de threads .NET tem melhor desempenho, como em manuseamento pesado de I/O em máquinas maiores. É aconselhável verificar as métricas de desempenho ao alterar esta configuração de configuração.
  • Algumas APIs não são suportadas ao utilizar o pool de threads do Windows, como ThreadPool.SetMinThreads, ThreadPool.SetMaxThreads, e ThreadPool.BindHandle(SafeHandle). As definições de configuração do pool de threads para threads mínimo e máximo também não são eficazes. Uma alternativa ThreadPool.BindHandle(SafeHandle) é a ThreadPoolBoundHandle aula.
Nome da configuração Valores Versão introduzida
runtimeconfig.json System.Threading.ThreadPool.UseWindowsThreadPool true - ativado
false - deficientes
.NET 8
Propriedade MSBuild UseWindowsThreadPool true - ativado
false - deficientes
.NET 8
Variável de ambiente DOTNET_ThreadPool_UseWindowsThreadPool 1 - ativado
0 - deficientes
.NET 8

Examples

runtimeconfig.json ficheiro:

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

runtimeconfig.template.json arquivo:

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

Ficheiro do projeto:

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

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

</Project>

Injeção de threads em resposta a blocar itens de trabalho

Em alguns casos, o pool de threads deteta itens de trabalho que bloqueiam os seus threads. Para compensar, injeta mais roscas. No .NET 6+, pode usar as seguintes definições de configuração em tempo de execução para configurar a injeção de threads em resposta a itens de trabalho bloqueadores. Atualmente, estas definições só têm efeito para itens de trabalho que aguardam que outra tarefa seja concluída, como nos casos típicos de sincronização sobre assíncrono .

runtimeconfig.json nome do cenário Description Versão introduzida
System.Threading.ThreadPool.Blocking.ThreadsToAddWithoutDelay_ProcCountFactor Depois de atingida a contagem de threads baseada em MinThreads , este valor (após ser multiplicado pela contagem de processadores) especifica quantos threads adicionais podem ser criados sem atraso. .NET 6
System.Threading.ThreadPool.Blocking.ThreadsPerDelayStep_ProcCountFactor Depois de atingida a contagem de threads baseada em ThreadsToAddWithoutDelay , este valor (após ser multiplicado pela contagem do processador) especifica após quantas threads seria adicionada uma adicional DelayStepMs ao atraso antes de cada nova thread ser criada. .NET 6
System.Threading.ThreadPool.Blocking.DelayStepMs Depois de atingida a contagem de threads baseada em ThreadsToAddWithoutDelay , este valor especifica quanto atraso adicional adicionar por ThreadsPerDelayStep thread, que será aplicado antes de cada nova thread ser criada. .NET 6
System.Threading.ThreadPool.Blocking.MaxDelayMs Depois de atingida a contagem de threads baseada em ThreadsToAddWithoutDelay , este valor especifica o atraso máximo a usar antes de cada nova thread ser criada. .NET 6
System.Threading.ThreadPool.Blocking.IgnoreMemoryUsage Por defeito, a taxa de injeção de threads em resposta ao bloqueio é limitada por heurísticas que determinam se existe memória física suficiente disponível. Em algumas situações, pode ser preferível injetar threads mais rapidamente, mesmo em situações de baixa memória. Podes desativar as heurísticas de uso de memória desligando este interruptor. .NET 7

Como as definições de configuração entram em vigor

  • Depois de atingida a contagem de threads baseada em MinThreads , podem ser criados até ThreadsToAddWithoutDelay threads adicionais sem demora.
  • Depois disso, antes de cada thread adicional ser criado, é induzido um atraso, começando por DelayStepMs.
  • Por cada ThreadsPerDelayStep thread que é adicionado com um atraso, é adicionado um DelayStepMs adicional ao atraso.
  • O atraso não pode exceder MaxDelayMs.
  • Os atrasos só são induzidos antes de criar threads. Se os threads já estiverem disponíveis, serão lançados sem demora para compensar o bloqueio dos itens de trabalho.
  • Também são usados o uso físico da memória e os limites e, para além de um determinado limite, o sistema passa para uma injeção de thread mais lenta.

Examples

runtimeconfig.json ficheiro:

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

runtimeconfig.template.json arquivo:

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

AutoreleasePool para threads geridos

Esta opção configura se cada thread gerido recebe um NSAutoreleasePool implícito ao correr numa plataforma macOS suportada.

Nome da configuração Valores Versão introduzida
runtimeconfig.json System.Threading.Thread.EnableAutoreleasePool true ou false .NET 6
Propriedade MSBuild AutoreleasePoolSupport true ou false .NET 6
Variável de ambiente N/A N/A N/A

Examples

runtimeconfig.json ficheiro:

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

runtimeconfig.template.json arquivo:

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

Ficheiro do projeto:

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

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

</Project>