NUMBER_OF_PROCESSORS env var 在帶有 Windows Server 2012 R2 的 Dell PowerEdge Gen14 上不正確
我在執行 Windows Server 2012 R2 Standard 的新安裝的 Dell PowerEdge 740xd Gen 14 上看到環境變數 NUMBER_OF_PROCESSORS 不正確。
該機器包含 2 個 CPU - Intel Platinum Xeon 8173M。每個 CPU 包含 28 個核心,因此總共 56 個核心,但每個核心都是超執行緒的,因此總共有 112 個執行緒。我希望看到 NUMBER_OF_PROCESSORS=112 但我看到 NUMBER_OF_PROCESSORS=56 。我可以進入控制面板,系統並手動更改 NUMBER_OF_PROCESSORS 的值,但是當機器重新啟動時,它又回到了 56。
請務必注意,諸如 msinfo32 和任務管理器等各種系統工具會報告正確的處理器、核心和執行緒數。
我在這裡找到了一個相關的執行緒:如何生成 NUMBER_OF_PROCESSORS 環境變數?在底部,它建議在 BIOS 設置中關閉節點交錯。我發現我的機器上已經關閉了 Node Interleaving,但我決定打開它,效果是 NUMBER_OF_PROCESSORS 變為 64。
在執行相同作業系統的較舊的 Dell Gen 13 機器上,我確實看到 NUMBER_OF_PROCESSORS env var 設置為 number_of_cpus x cores_per_cpu x 2 。所以這似乎是與戴爾 Gen 14 相關的問題。
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
,可能更精確。