Cim_PhysicalMemory和Win32_ComputerSystem返回不同的内存量

Fre*_*gen 5 powershell server

我正在尝试编写一个PowerShell脚本,显示服务器(512 GB的物理服务器)中安装的内存量.
我尝试了三种不同的方法,但得到了不同的结果.

  1. Win32_PhysicalMemory

    (Get-WmiObject Win32_PhysicalMemory | Measure-Object -Property Capacity -Sum).Sum)/1GB
    
    Run Code Online (Sandbox Code Playgroud)

    返回255.99 GB.

  2. Win32_ComputerSystem

    $InstalledRAM = Get-WmiObject -Class Win32_ComputerSystem
    [Math]::Round(($InstalledRAM.TotalPhysicalMemory/1GB), 2)
    
    Run Code Online (Sandbox Code Playgroud)

    这将返回511.88 GB.

  3. Cim_PhysicalMemory

    $MaxRam = 0
    $RamPool = (Get-CimInstance -Class "Cim_PhysicalMemory" | % {$_.Capacity})
    
    foreach ($RamBank in $RamPool) {
        $MaxRam += $RamBank/1024/1024
    }
    
    Run Code Online (Sandbox Code Playgroud)

    返回255.99 GB.

Taskmanager/systeminfo显示安装了512 GB.

当我Win32_PhysicalMemory用来打印安装在不同内存库中的内存时,我得到8个32 GB的库.但我确定服务器包含512 GB.

有人可以向我解释为什么方法1和3只返回256 GB?

更新:
当我查看BIOS时,我看到每个物理处理器分配了256 GB.我的知识不是那么先进但我是否有可能首先请求NUMA节点并且foreach节点检索分配给它的内存量?或者Powershell不可能做到这一点?

vrd*_*dse 0

CIM_PhysicalMemoryWin32_PhysicalMemory是相同的[ 1 ]。

该属性继承自 CIM_PhysicalMemory。

这是从[ 1 ]获得值的地方。

该值来自SMBIOS版本信息中的Memory Device结构。对于 SMBIOS 版本 2.1 到 2.6,该值来自 Size 成员。对于 SMBIOS 版本 2.7+,该值来自扩展大小成员。

SMBIOS 标准表示 [ 2 ]

扩展大小字段旨在表示大于 32,767 MB (32 GB - 1 MB) 的内存设备,无法使用大小字段进行描述。仅当 Size 字段中的值为 7FFFh 时,此字段才有意义。为了与旧版 SMBIOS 解析器兼容,小于 (32 GB - 1 MB) 的内存设备应在“大小”字段中使用其大小来表示,并将“扩展大小”字段设置为 0。

正如你所说,你有 8x64GB,但显示的是 8x32GB,对我来说这不像 NUMA 问题。如果是 NUMA,我希望您会显示 4x32GB。另外,我有一台 8x32GB 和 2 个插槽的服务器。因此,如果这是 NUMA 问题,我希望在我的机器上看到同样的问题。但是,我得到了正确显示的金额。看起来你的 BIOS 使用 2.7.1 之前的 SMBIOS 标准结构,但这很奇怪,因为它是 2011 年的。

请尝试验证您的 SMBIOS 版本

(Get-CimInstance -ClassName Win32_BIOS) | Select-Object SMBIOS*
Run Code Online (Sandbox Code Playgroud)

对我来说,SMBIOSVersion返回供应商的 BIOS 版本号而不是标准版本号,但SMBIOSMajorVersion返回SMBIOSMinorVersion正确的值。

Win32_ComputerSystem从 Win32 api [ 3 ]查询信息。

物理内存的总大小。请注意,在某些情况下,此属性可能不会返回物理内存的准确值。例如,如果 BIOS 正在使用某些物理内存,则它是不准确的。要获得准确的值,请改用 Win32_PhysicalMemory 中的“容量”属性。