我们为 HP ProLiant DL380 Gen9 计算机配备了 512 GB 的物理 RAM。计算机的 BIOS 正确显示安装了 512 GB 的物理内存。但遗憾的是,操作系统SUSE Linux Enterprise Release 11 Service Pack 4 显示的总内存只有504.7 GB,远小于预期的512 GB。我在 Gnome 系统监视器中看到总内存数字 504.7 GB,当我在终端会话中执行命令“free -m”时,它显示总内存大小为 516780 兆字节,对应于 504.7 GB。这让我很恼火,因为我想为在此服务器上运行的软件使用完整的 512 GB 物理 RAM。我不想白白丢掉 7.3 GB 的 RAM。在 Internet 上搜索并没有帮助我找出为什么 Linux 仅识别 504.7 GB 的总内存而不是实际安装的 512 GB。此外,我在计算机的 BIOS 中没有看到任何可以解释这种奇怪的 7.3 GB RAM 丢失的内容。所以,我现在问一下这个社区的高手:如何配置Linux操作系统来识别和使用完整的512GB物理内存?
令人沮丧的是,管理具有 512GB RAM 的高端服务器的人专注于此。
运行free -g
。
如果服务器POST为 512GB,则表示 RAM 是健康的。
Linux 内核和系统 BIOS 保留了一些 RAM,这是正常的。这不是一个错误,它不是一个旨在从您购买的 RAM 数量中剥夺您的计划。就是这样:
256GB 服务器:
# free -g
total used free shared buffers cached
Mem: 252 152 99 0 0 2
Run Code Online (Sandbox Code Playgroud)
或者这个 64GB RAM 系统:
我不使用 SUSE,但 CentOS 表现出类似(或相同)的行为。通常这必须与 BIOS 保留有关。
考虑安装了 8 个 16GB ECC DIMM 的 CentOS 7 系统。
# dmidecode -t 17 | grep Size
Size: 16384 MB
Type Detail: Registered (Buffered)
Size: No Module Installed
Type Detail: Synchronous
Size: 16384 MB
Type Detail: Registered (Buffered)
Size: No Module Installed
Type Detail: Synchronous
Size: 16384 MB
Type Detail: Registered (Buffered)
Size: No Module Installed
Type Detail: Synchronous
Size: 16384 MB
Type Detail: Registered (Buffered)
Size: No Module Installed
Type Detail: Synchronous
Size: 16384 MB
Type Detail: Registered (Buffered)
Size: No Module Installed
Type Detail: Synchronous
Size: 16384 MB
Type Detail: Registered (Buffered)
Size: No Module Installed
Type Detail: Synchronous
Size: 16384 MB
Type Detail: Registered (Buffered)
Size: No Module Installed
Type Detail: Synchronous
Size: 16384 MB
Type Detail: Registered (Buffered)
Size: No Module Installed
Type Detail: Synchronous
Run Code Online (Sandbox Code Playgroud)
那应该有 128GB 的内存。但是,CentOS 仅报告 125GB 的系统内存。
# free -h
total used free shared buff/cache available
Mem: 125G 65G 56G 113M 4.3G 56G
Swap: 3.8G 0B 3.8G
Run Code Online (Sandbox Code Playgroud)
其余部分被内核尊重以供 BIOS/硬件使用。
# dmesg | grep e820
[ 0.000000] e820: BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x00000000000993ff] usable
[ 0.000000] BIOS-e820: [mem 0x0000000000099400-0x000000000009ffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000007de21fff] usable
[ 0.000000] BIOS-e820: [mem 0x000000007de22000-0x000000007deb0fff] reserved
[ 0.000000] BIOS-e820: [mem 0x000000007deb1000-0x000000007dfb9fff] ACPI data
[ 0.000000] BIOS-e820: [mem 0x000000007dfba000-0x000000007e1dffff] ACPI NVS
[ 0.000000] BIOS-e820: [mem 0x000000007e1e0000-0x000000007f364fff] reserved
[ 0.000000] BIOS-e820: [mem 0x000000007f365000-0x000000007f7fffff] ACPI NVS
[ 0.000000] BIOS-e820: [mem 0x0000000080000000-0x000000008fffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000fed1c000-0x00000000fed3ffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000ff000000-0x00000000ffffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000100000000-0x000000207fffffff] usable
[ 0.000000] e820: update [mem 0x00000000-0x00000fff] usable ==> reserved
[ 0.000000] e820: remove [mem 0x000a0000-0x000fffff] usable
[ 0.000000] e820: last_pfn = 0x2080000 max_arch_pfn = 0x400000000
[ 0.000000] e820: update [mem 0x80000000-0xffffffff] usable ==> reserved
[ 0.000000] e820: last_pfn = 0x7de22 max_arch_pfn = 0x400000000
[ 0.000000] e820: [mem 0x90000000-0xfed1bfff] available for PCI devices
[ 0.948608] e820: reserve RAM buffer [mem 0x00099400-0x0009ffff]
[ 0.948610] e820: reserve RAM buffer [mem 0x7de22000-0x7fffffff]
Run Code Online (Sandbox Code Playgroud)
Linux 和 Windows 在表示上的唯一区别是 Windows 对正在发生的事情更清楚一点。
在 Linux 中,您必须查看dmesg
.
# dmesg | grep Memory
[ 0.000000] Memory: 131808356k/136314880k available (6441k kernel code, 2132248k absent, 2374276k reserved, 4265k data, 1620k init)
Run Code Online (Sandbox Code Playgroud)