Verhalten der Eigenschaft „Environment.ProcessorCount“ unter Windows

Die Eigenschaft Environment.ProcessorCount beachtet unter Windows jetzt die Prozessaffinität und das harte Limit des Auftragsobjekts für die CPU-Auslastung.

Änderungsbeschreibung

In früheren .NET-Versionen gibt die Environment.ProcessorCount-Eigenschaft unter Windows die Anzahl der logischen Prozessoren auf dem Computer zurück. Die Eigenschaft ignoriert die Prozessaffinität und das harte Limit des Auftragsobjekts für die CPU-Auslastung. Dieses Windows-Verhalten ist inkonsistent mit dem Verhalten unter Unix-basierten Betriebssystemen, bei denen diese Limits eingehalten werden.

Ab .NET 6 ist das Verhalten von Environment.ProcessorCount unter Windows mit dem Verhalten unter Unix-basierten Betriebssystemen konsistent. Im Allgemeinen gibt Environment.ProcessorCount das Minimum von Folgendem zurück:

  • Anzahl der logischen Prozessoren auf dem Computer
  • Anzahl der Prozessoren, denen der Vorgang zugeordnet ist (wenn der Vorgang mit CPU-Affinität ausgeführt wird)
  • CPU-Auslastungslimit aufgerundet auf die nächste ganze Zahl (wenn der Vorgang mit einem CPU-Auslastungslimit ausgeführt wird)

Die folgende Tabelle zeigt, wie sich der Wert von Environment.ProcessorCount auf einem Computer mit acht logischen Prozessoren in .NET 6 im Vergleich zu .NET 5 ändert:

Umgebung .NET 5 .NET 6
Vorgang ist zwei logischen Prozessoren zugeordnet (Windows) 8 2
Vorgang ist zwei logischen Prozessoren zugeordnet (Unix) 2 2
CPU-Auslastung ist auf das Äquivalent von zwei logischen Prozessoren beschränkt (Windows) 8 2
CPU-Auslastung ist auf das Äquivalent von zwei logischen Prozessoren beschränkt (Unix) 2 2

Eingeführt in Version

6.0

Grund für die Änderung

Diese Eigenschaft wird häufig verwendet, um den Parallelitätsfaktor für einen Vorgang zu bestimmen. Wir haben festgestellt, dass es zu einer schlechteren Leistung führen kann, wenn der Wert der Eigenschaft nicht basierend auf der Affinität und dem CPU-Auslastungslimit eingeschränkt wird.

Überprüfen Sie Code, der Environment.ProcessorCount verwendet, um den Parallelitätsfaktor basierend auf der Anwendungs- oder Systemkonfiguration herunterzuskalieren. Selbst wenn der Code die Affinitätsmaske des Vorgangs oder das CPU-Auslastungslimit des Auftragsobjekts berücksichtigt, wird möglicherweise eine niedrigere Parallelität als beabsichtigt verwendet.

Überprüfen Sie Code, der erwartet, dass Environment.ProcessorCount die Gesamtzahl logischer Prozessoren auf dem Computer zurückgibt, um sie beispielsweise einem Benutzer anzuzeigen. Stattdessen können Sie einen PInvoke-Aufruf der Win32-APIs GetSystemInfo oder GetNativeSystemInfo verwenden.

Wenn die Leistungsfähigkeit von Code aufgrund dieser Änderung abnimmt, können Sie die Umgebungsvariable DOTNET_PROCESSOR_COUNT verwenden, um die Anzahl der Prozessoren außer Kraft zu setzen, die von der .NET-Runtime als verfügbar betrachtet und von der Environment.ProcessorCount-Eigenschaft gemeldet werden. Wenn Sie beispielsweise DOTNET_PROCESSOR_COUNT auf 4 festlegen, ignoriert Environment.ProcessorCount jegliche Prozessaffinität und jegliches CPU-Auslastungslimit und gibt 4 zurück. Legen Sie die Umgebungsvariable auf %NUMBER_OF_PROCESSORS% fest, um das Verhalten von .NET 5 zu imitieren.

Betroffene APIs