Comportement d’Environment.ProcessorCount sur Windows

Sur Windows, la propriété Environment.ProcessorCount respecte désormais l’affinité de processus et la limite matérielle de l’objet de travail sur l’utilisation du processeur.

Description de la modification

Dans les versions .NET précédentes, la propriété Environment.ProcessorCount sur Windows retourne le nombre de processeurs logiques sur l’ordinateur. La propriété ignore l’affinité de processus et la limite matérielle de l’objet de travail sur l’utilisation du processeur. Ce comportement de Windows est incohérent avec le comportement sur les systèmes d’exploitation Unix, où ces limites sont respectées.

À compter de .NET 6, le comportement de Environment.ProcessorCount sur Windows est cohérent avec celui du système d’exploitation Unix. En général, Environment.ProcessorCount retourne le minimum de :

  • Nombre de processeurs logiques sur l’ordinateur.
  • Si le processus s’exécute avec l’affinité processeur, le nombre de processeurs auxquels le processus est lié.
  • Si le processus s’exécute avec une limite d’utilisation du processeur, la limite d’utilisation du processeur est arrondie au nombre entier suivant.

Le tableau suivant montre comment la valeur de Environment.ProcessorCount change de .NET 5 à .NET 6 sur une machine avec huit processeurs logiques :

Environnement .NET 5 .NET 6
Processus par affinité avec deux processeurs logiques (Windows) 8 2
Processus par affinité avec deux processeurs logiques (Unix) 2 2
Utilisation du processeur limitée à l’équivalent de deux processeurs logiques (Windows) 8 2
Utilisation du processeur limitée à l’équivalent de deux processeurs logiques (Unix) 2 2

Version introduite

6.0

Raison du changement

Cette propriété est fréquemment utilisée pour déterminer le facteur de parallélisme d’un processus. Nous avons observé que le fait de ne pas limiter la valeur de la propriété en fonction de l’affinité et de la limite d’utilisation du processeur peut entraîner une détérioration des performances.

Passez en revue le code qui utilise Environment.ProcessorCount pour réduire le facteur de parallélisme en fonction de la configuration de l’application ou du système. Même si le code prend en compte le masque d’affinité du processus ou la limite d’utilisation du processeur de l’objet de travail, il peut finir par utiliser un parallélisme plus faible que prévu.

Passez en revue le code qui s’attend à ce que Environment.ProcessorCount retourne le nombre total de processeurs logiques sur la machine, par exemple, pour l’afficher à un utilisateur. Au lieu de cela, vous pouvez utiliser un appel PInvoke à l’API Win32 GetSystemInfo ou GetNativeSystemInfo.

Si le code fonctionne moins bien à la suite de cette modification, vous pouvez utiliser la variable d’environnement DOTNET_PROCESSOR_COUNT pour remplacer le nombre de processeurs considérés comme disponibles par le runtime .NET et signalés par la propriété Environment.ProcessorCount. Par exemple, si vous définissez DOTNET_PROCESSOR_COUNT sur 4, Environment.ProcessorCount ignore toute affinité de processus et limite d’utilisation du processeur et retourne 4. Pour imiter le comportement de .NET 5, définissez la variable d’environnement sur %NUMBER_OF_PROCESSORS%.

API affectées