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 返回计算机上逻辑处理器的总数(例如,显示给用户)的代码。 你可以改用对 GetSystemInfo
或 GetNativeSystemInfo
Win32 API 的 PInvoke 调用。
如果由于此更改而使代码的性能变差,可以使用 DOTNET_PROCESSOR_COUNT
环境变量来替代 .NET 运行时认为可用的处理器数量和 Environment.ProcessorCount 属性报告的处理器数量。 例如,如果将 DOTNET_PROCESSOR_COUNT
设置为 4,Environment.ProcessorCount 将忽略任何进程相关性和 CPU 利用率限制,并返回 4。 若要模拟 .NET 5 行为,请将环境变量设置为 %NUMBER_OF_PROCESSORS%
。