Cim_PhysicalMemory和Win32_ComputerSystem返回不同的内存量

时间:2017-08-23 10:35:50

标签: powershell server

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

  1. Win32_PhysicalMemory

    (Get-WmiObject Win32_PhysicalMemory | Measure-Object -Property Capacity -Sum).Sum)/1GB
    

    返回255.99 GB。

  2. Win32_ComputerSystem

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

    返回511.88 GB。

  3. Cim_PhysicalMemory

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

    返回255.99 GB。

  4. Taskmanager / systeminfo显示安装了512 GB。

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

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

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

1 个答案:

答案 0 :(得分:0)

CIM_PhysicalMemoryWin32_PhysicalMemory相同[1]。

  

此属性继承自CIM_PhysicalMemory。

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

  

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

SMBIOS标准说[2]

  

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

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

请尝试使用

验证您的SMBIOS版本
(Get-CimInstance -ClassName Win32_BIOS) | Select-Object SMBIOS*

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

Win32_ComputerSystem查询来自Win32 api [3]的信息。

  

物理内存的总大小。请注意,在某些情况下,此属性可能无法返回物理内存的准确值。例如,如果BIOS使用某些物理内存,则不准确。要获得准确的值,请改用Win32_PhysicalMemory中的Capacity属性。