Windows 上的 Environment.ProcessorCount 行为

在 Windows 上,Environment.ProcessorCount 属性现在会考虑进程相关性,以及作业对象对 CPU 利用率的硬限制。

更改描述

在以前的 .NET 版本中,Windows 上的 Environment.ProcessorCount 属性返回计算机上逻辑处理器的数量。 该属性忽略进程相关性和作业对象对 CPU 利用率的硬限制。 这种 Windows 行为与考虑这些限制的基于 Unix 的操作系统上的行为不一致。

从 .NET 6 开始,Windows 上 Environment.ProcessorCount 的行为与基于 Unix 的操作系统上的行为一致。 通常,Environment.ProcessorCount 返回以下值中的最小值:

  • 计算机上逻辑处理器的数量。
  • 与进程关联的处理器的数量(如果进程运行时具有 CPU 相关性)。
  • 四舍五入到下一个整数的 CPU 利用率限制(如果进程运行时具有 CPU 利用率限制)。

下表显示了在具有八个逻辑处理器的计算机上,Environment.ProcessorCount 的值从 .NET 5 到 .NET 6 的变化:

环境 .NET 5 .NET 6
进程关联到两个逻辑处理器 (Windows) 8 2
进程关联到两个逻辑处理器 (Unix) 2 2
CPU 利用率限制为相当于两个逻辑处理器 (Windows) 8 2
CPU 利用率限制为相当于两个逻辑处理器 (Unix) 2 2

引入的版本

6.0

更改原因

此属性通常用于确定进程的并行度因子。 我们发现,如果不根据相关性和 CPU 利用率限制来限制该属性的值,可能会导致性能下降。

审查使用 Environment.ProcessorCount 根据应用程序或系统配置纵向缩减并行度因子的代码。 即使代码考虑了进程的相关性掩码或作业对象的 CPU 利用率限制,最终也有可能使用比预期更低的并行度。

审查期望 Environment.ProcessorCount 返回计算机上逻辑处理器的总数(例如,显示给用户)的代码。 你可以改用对 GetSystemInfoGetNativeSystemInfo Win32 API 的 PInvoke 调用。

如果由于此更改而使代码的性能变差,可以使用 DOTNET_PROCESSOR_COUNT 环境变量来替代 .NET 运行时认为可用的处理器数量和 Environment.ProcessorCount 属性报告的处理器数量。 例如,如果将 DOTNET_PROCESSOR_COUNT 设置为 4,Environment.ProcessorCount 将忽略任何进程相关性和 CPU 利用率限制,并返回 4。 若要模拟 .NET 5 行为,请将环境变量设置为 %NUMBER_OF_PROCESSORS%

受影响的 API