Compartilhar via


Comportamento de environment.ProcessorCount no Windows

No Windows, a propriedade Environment.ProcessorCount agora respeita a afinidade de processo e o limite rígido do objeto de trabalho na utilização da CPU.

Descrição das alterações

Nas versões anteriores do .NET, a propriedade Environment.ProcessorCount no Windows retorna o número de processadores lógicos no computador. A propriedade ignora a afinidade de processo e o limite rígido do objeto de trabalho na utilização da CPU. Esse comportamento do Windows é inconsistente com o comportamento em sistemas operacionais baseados em Unix, em que esses limites são respeitados.

A partir do .NET 6, o comportamento do Environment.ProcessorCount no Windows é consistente com o comportamento no sistema operacional baseado em Unix. Em geral, Environment.ProcessorCount retorna o mínimo de:

  • O número de processadores lógicos no computador.
  • Se o processo estiver em execução com afinidade de CPU, o número de processadores aos quais o processo tem afinidade.
  • Se o processo estiver em execução com um limite de utilização da CPU, o limite de utilização da CPU será arredondado até o próximo número inteiro.

A tabela a seguir mostra como o valor de Environment.ProcessorCount muda do .NET 5 para o .NET 6 em um computador com oito processadores lógicos:

Ambiente .NET 5 .NET 6
Processo com afinidade com dois processadores lógicos (Windows) 8 2
Processo com afinidade com dois processadores lógicos (Unix) 2 2
Utilização da CPU limitada ao equivalente a dois processadores lógicos (Windows) 8 2
Utilização da CPU limitada ao equivalente a dois processadores lógicos (Unix) 2 2

Versão introduzida

6,0

Motivo da alteração

Essa propriedade é frequentemente usada para determinar o fator de paralelismo para um processo. Observamos que não limitar o valor da propriedade com base na afinidade e no limite de utilização da CPU pode levar a um desempenho pior.

Examine o código que usa Environment.ProcessorCount para reduzir horizontalmente o fator de paralelismo com base na configuração do aplicativo ou do sistema. Mesmo que o código leve em conta a máscara de afinidade do processo ou o limite de utilização da CPU do objeto de trabalho, ele pode acabar usando um paralelismo menor do que o pretendido.

Examine o código que espera que Environment.ProcessorCount retorne o número total de processadores lógicos no computador, por exemplo, para exibi-lo a um usuário. Em vez disso, você pode usar uma chamada PInvoke para as APIs do Win32 GetSystemInfo ou GetNativeSystemInfo.

Se o código tiver um desempenho pior como resultado dessa alteração, você poderá usar a variável de ambiente DOTNET_PROCESSOR_COUNT para substituir o número de processadores considerados disponíveis pelo runtime do .NET e relatados pela propriedade Environment.ProcessorCount. Por exemplo, se você definir DOTNET_PROCESSOR_COUNT como 4, Environment.ProcessorCount desconsiderará qualquer afinidade de processo e limite de utilização da CPU e retornará 4. Para imitar o comportamento do .NET 5, defina a variável de ambiente como %NUMBER_OF_PROCESSORS%.

APIs afetadas