我正在尝试编写一个PowerShell脚本,显示服务器中安装的内存量(512 GB的物理服务器)。
我尝试了三种不同的方法,但得到了不同的结果。
(Get-WmiObject Win32_PhysicalMemory | Measure-Object -Property Capacity -Sum).Sum)/1GB
返回255.99 GB。
$InstalledRAM = Get-WmiObject -Class Win32_ComputerSystem
[Math]::Round(($InstalledRAM.TotalPhysicalMemory/1GB), 2)
返回511.88 GB。
$MaxRam = 0
$RamPool = (Get-CimInstance -Class "Cim_PhysicalMemory" | % {$_.Capacity})
foreach ($RamBank in $RamPool) {
$MaxRam += $RamBank/1024/1024
}
返回255.99 GB。
Taskmanager / systeminfo显示安装了512 GB。
当我使用Win32_PhysicalMemory
打印出安装在不同内存库中的内存时,我得到了8个32 GB的内存。
但我确定服务器包含512 GB。
有人可以向我解释为什么方法1和3只返回256 GB?
更新:
当我查看BIOS时,我看到每个物理处理器分配了256 GB。我的知识不是那么先进但我是否有可能首先请求NUMA节点并且foreach节点检索分配给它的内存量?或者Powershell不可能这样做吗?
答案 0 :(得分:0)
CIM_PhysicalMemory
和Win32_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版本号而不是标准版,但SMBIOSMajorVersion
和SMBIOSMinorVersion
会返回正确的值。
Win32_ComputerSystem
查询来自Win32 api [3]的信息。
物理内存的总大小。请注意,在某些情况下,此属性可能无法返回物理内存的准确值。例如,如果BIOS使用某些物理内存,则不准确。要获得准确的值,请改用Win32_PhysicalMemory中的Capacity属性。