为什么 Red Hat Linux 报告的系统可用内存少于实际可用内存?

Aar*_*n K 9 linux memory redhat low-memory

我有一个相对较小的家用 Red Hat Linux 服务器(大约 8 GB RAM)。除了运行一些自制的应用程序来跟踪各种事情之外,我不使用它。在盒子上运行的唯一真实的东西是一个数据库和一个网络服务器。

我注意到,当使用 NMON 和 TOP 等工具检查系统计数器时,系统总可用内存相对较低(大约几百 MB),而数据库和 Web 服务器的活动内存仍然很低(仅总共消耗 3 GB)。即使包括所有其他正在运行的进程,总消耗的内存也小于 4 GB。

为什么 Red Hat Linux 报告的可用内存少于总内存减去运行进程的已用内存总和?

Dav*_*ney 19

不要将空闲内存与未使用的内存混淆。空闲内存,在 unix 世界中是一个物理内存页面,没有映射到它的逻辑数据。未使用的内存确实有一些数据映射到它,但它当前没有被正在运行的进程主动使用。

% free -m
             total       used       free     shared    buffers     cached
Mem:           997        942         55          0         71        366
-/+ buffers/cache:        504        492
Swap:         2015        618       1397
Run Code Online (Sandbox Code Playgroud)

Linux(和所有 Unix 操作系统)尝试尽可能少的空闲内存。相反,它们使用未主动映射到正在运行的操作系统中的进程的内存,用于文件缓存和各种 IO 传输操作的缓冲区。

可能让您感到困惑的另一件事是,您不能简单地将所有正在运行的进程使用的内存相加来获得总内存使用量。如果您尝试这样做,您会很快发现您的应用程序使用的内存似乎比机器上实际存在的内存多。这是出于两个原因

  1. 内存可以在各个进程之间共享,通过Copy-On-Write内存分配、内存映射 IO共享动态库
  2. 操作系统可以自由地向应用程序承诺比它实际提供的更多的内存。理论上,大多数应用程序编写者更愿意一次性请求大量内存,以避免开销,并且实际上可能不会使用所有内存。

lwn.net上最近有一篇文章讨论了这个问题