我发现环境变量NUMBER_OF_PROCESSORS在我新安装的运行Windows 2012 R2标准的戴尔740 R2 14上是不正确的。
该机器包含2个CPUs英特尔白金Xeon 8173 M。每个CPU包含28个内核,因此总共有56个核心,但每个核心是超线程的,因此总共有112个线程。我希望看到NUMBER_OF_PROCESSORS=112,但我看到了NUMBER_OF_PROCESSORS=56。我可以进入控制面板,系统和手动更改NUMBER_OF_PROCESSORS的值,但当机器重新启动,它回到56。
需要注意的是,各种系统工具(如msinfo32和Task )都报告了正确数量的处理器、核心和线程。
我在这里找到了一个相关的线程:数字是怎样的_的_处理器env变量生成?,在底部,它建议关闭BIOS中的节点交织。我发现Node交织已经在我的机器上关闭了,但是我决定打开它,结果是NUMBER_OF_PROCESSORS变成了64。
在运行相同操作系统的较旧的戴尔Gen 13机器上,我确实正确地看到了NUMBER_OF_PROCESSORS env设置为number_of_cpus x cores_per_cpu x2。因此,这似乎是一个与戴尔第14代相关的问题。
发布于 2020-10-16 09:35:19
NUMBER_OF_PROCESSORS不能指示超过64个处理器,因为这是64位Windows的简单限制。
Windows使用处理器组来管理超过64个处理器,请参阅https://docs.microsoft.com/de-de/windows/win32/procthread/processor-groups。
NUMBER_OF_PROCESSORS ENV变量只是一种向软件表明什么是处理资源的方法。在禁用节点交织的情况下,操作系统试图通过仅指示物理内核来防止重载。启用节点交织后,它尝试指示SMT线程,但由于大小太大而失败。"64“是这个"API”的硬限制。这个变量的级别很低,因为它是用于批处理脚本之类的。
有更可靠和更详细的方法来了解CPU设置,这是其他工具所使用的。您可以尝试使用Powershell (Get-CimInstance Win32_ComputerSystem).NumberOfLogicalProcessors,这可能更精确。
https://serverfault.com/questions/1038736
复制相似问题