Compartilhar via


Comportamento de environment.ProcessorCount no Windows

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

Descrição da alteração

Nas versões anteriores do .NET, a Environment.ProcessorCount propriedade 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 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 é arredondado para 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 afinizado para dois processadores lógicos (Windows) oito 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) oito 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.

Revise o código que usa Environment.ProcessorCount para diminuir 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 Environment.ProcessorCount retornar o número total de processadores lógicos no computador, por exemplo, para exibi-lo a um usuário. Em vez disso, você pode fazer uma chamada PInvoke para as APIs Win32 GetSystemInfo ou GetNativeSystemInfo.

Se o código apresentar um desempenho pior como resultado dessa alteração, você poderá usar a variável de ambiente DOTNET_PROCESSOR_COUNT para sobrepor 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