为什么“free”命令和“dmidecode”显示的 RAM 值不同?

为什么“free”命令和“dmidecode”显示的 RAM 值不同?

我有一个 CentOS 5.10 (32 位) 服务器在 VMWare 上运行。它分配了 4 GB 的 RAM。

如果我跑步dmidecode -t 17 | grep Size | grep MB我会看到:

Size: 4096 MB

然而当我运行时free,我看到:

             total       used       free     shared    buffers     cached
Mem:       3107140    1239244    1867896          0        332     400464
-/+ buffers/cache:     838448    2268692
Swap:      2096472          0    2096472

为什么内存总量free报告和dmidecode输出有差异?

我正在运行的内核是:

2.6.18-371.4.1.el5 #1 SMP Thu Jan 30 06:09:24 EST 2014 i686 i686 i386 GNU/Linux

诚然,内核没有运行PAE,但我认为这只是为了内存超过4GB。

我知道我遗漏了一些简单的东西 - 有人可以详细说明吗?

附加说明/观察

看起来我的内核确实为其他东西保留了大量内存。这是我看到的/var/log/dmesg

Linux version 2.6.18-371.4.1.el5 ([email protected]) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-54)) #1 SMP Thu Jan 30 06:09:24 EST 2014
BIOS-provided physical RAM map:
 BIOS-e820: 0000000000010000 - 000000000009f800 (usable)
 BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved)
 BIOS-e820: 00000000000ca000 - 00000000000cc000 (reserved)
 BIOS-e820: 00000000000dc000 - 0000000000100000 (reserved)
 BIOS-e820: 0000000000100000 - 00000000bfef0000 (usable)
 BIOS-e820: 00000000bfef0000 - 00000000bfeff000 (ACPI data)
 BIOS-e820: 00000000bfeff000 - 00000000bff00000 (ACPI NVS)
 BIOS-e820: 00000000bff00000 - 00000000c0000000 (usable)
 BIOS-e820: 00000000e0000000 - 00000000f0000000 (reserved)
 BIOS-e820: 00000000fec00000 - 00000000fec10000 (reserved)
 BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved)
 BIOS-e820: 00000000fffe0000 - 0000000100000000 (reserved)
 BIOS-e820: 0000000100000000 - 0000000140000000 (usable)
Warning only 4GB will be used.
Use a PAE enabled kernel.
3200MB HIGHMEM available.
896MB LOWMEM available.
found SMP MP-table at 000f6bf0
Memory for crash kernel (0x0 to 0x0) notwithin permissible range

答案1

使用 32 位内核,您只有 4GB 可用地址空间. 部分地址空间必须由系统中的(虚拟或物理)硬件(如视频卡、NIC 等)用于其自身用途。此使用量通常在 256MB-1GB 之间,具体取决于特定硬件需要多少地址空间。

由于该地址空间由硬件使用,因此 32 位系统通常无法访问相应的 RAM。

您有以下几种选择:

  1. 首选方案是运行 64 位操作系统。这极大地扩展了地址空间,因此有足够的空间容纳所有 RAM 和硬件。它还打破了 2GB/3GB 32 位应用程序的限制,同时保持了运行 32 位程序的能力。一般来说,任何具有 2GB 或以上 RAM 的系统都应运行 64 位操作系统以避免这些问题。
  2. 另一个选项是运行启用了 PAE 的 32 位内核。这将取消隐藏 RAM,但每个进程仍将限制在 2GB/3GB 的地址空间内,具体取决于内核构建的细节。由于 64 位操作系统可以完美运行 32 位应用程序,因此这没有任何优势,而且有很多缺点(例如缺乏升级途径)。

答案2

该命令的输出free不计算保留的内核内存和其他一些小位。即使在 64 位内核中,即使 RAM 不足 2GB,您也会看到这种差异。

答案3

物理RAM映射中的关键行是这样的:

 BIOS-e820: 0000000100000000 - 0000000140000000 (usable)

此行显示,系统物理 RAM 中有 1 GB(0x40000000 字节,十六进制)已被 BIOS 映射,超出了 4GB 的限制,因此没有 PAE 的 32 位系统无法访问它。

相关内容