Comportamento di Environment.ProcessorCount in Windows

In Windows la proprietà Environment.ProcessorCount rispetta ora l'affinità di processo e il limite rigido dell'oggetto processo sull'utilizzo della CPU.

Descrizione delle modifiche

Nelle versioni precedenti di .NET la proprietà Environment.ProcessorCount in Windows restituisce il numero di processori logici nel computer. La proprietà ignora l'affinità di processo e il limite rigido dell'oggetto processo per l'utilizzo della CPU. Questo comportamento di Windows non è coerente con il comportamento nei sistemi operativi basati su Unix, in cui tali limiti vengono rispettati.

A partire da .NET 6, il comportamento di Environment.ProcessorCount in Windows è coerente con il comportamento nel sistema operativo basato su Unix. In generale, Environment.ProcessorCount restituisce almeno:

  • Il numero di processori logici nel computer.
  • Se il processo è in esecuzione con affinità CPU, il numero di processori con cui il processo crea affinità.
  • Se il processo è in esecuzione con un limite di utilizzo della CPU, il limite di utilizzo della CPU arrotondato fino al numero intero successivo.

La tabella seguente illustra come il valore di Environment.ProcessorCount cambia da .NET 5 a .NET 6 in un computer con otto processori logici:

Ambiente .NET 5 .NET 6
Processo che crea affinità con due processori logici (Windows) 8 2
Processo che crea affinità con due processori logici (Unix) 2 2
Utilizzo della CPU limitato all'equivalente di due processori logici (Windows) 8 2
Utilizzo della CPU limitato all'equivalente di due processori logici (Unix) 2 2

Versione introdotta

6.0

Motivo della modifica

Questa proprietà viene spesso usata per determinare il fattore di parallelismo per un processo. È stato osservato che la mancata limitazione del valore della proprietà in base all'affinità e al limite di utilizzo della CPU può causare un peggioramento delle prestazioni.

Esaminare il codice che usa Environment.ProcessorCount per ridurre il fattore di parallelismo in base alla configurazione dell'applicazione o del sistema. Anche se il codice tiene in considerazione la maschera di affinità del processo o il limite di utilizzo della CPU dell'oggetto processo, potrebbe finire con l'usare un parallelismo inferiore rispetto a quello previsto.

Esaminare il codice che prevede che Environment.ProcessorCount restituisca il numero totale di processori logici nel computer, ad esempio, per visualizzarlo a un utente. È invece possibile usare una chiamata PInvoke alle API GetSystemInfo o GetNativeSystemInfo Win32.

Se il codice ha prestazioni peggiori in seguito a questa modifica, è possibile usare la variabile di ambiente DOTNET_PROCESSOR_COUNT per eseguire l'override del numero di processori considerati disponibili dal runtime .NET e segnalati dalla proprietà Environment.ProcessorCount. Ad esempio, se si imposta DOTNET_PROCESSOR_COUNT su 4, Environment.ProcessorCount ignorerà qualsiasi affinità di processo e limite di utilizzo della CPU e restituirà 4. Per simulare il comportamento di .NET 5, impostare la variabile di ambiente su %NUMBER_OF_PROCESSORS%.

API interessate