我有一台相对较小的家用 Red Hat Linux 服务器(大约 8 GB RAM)。除了运行一些自制应用程序来跟踪各种事情外,我很少使用它。这台机器上唯一真正运行的东西是数据库和 Web 服务器。
我注意到,在使用 NMON 和 TOP 等工具检查系统计数器时,系统总可用内存相对较低(大约几百 MB),而数据库和 Web 服务器的活动内存仍然很低(总共只消耗 3 GB)。即使包括所有其他正在运行的进程,总消耗的内存也少于 4 GB。
为什么 Red Hat Linux 报告的可用内存小于总内存减去正在运行的进程的已用内存总和?
答案1
不要将空闲内存与未使用的内存混淆。在 UNIX 世界中,空闲内存是没有逻辑数据映射到的物理内存页。未使用的内存确实有一些数据映射到它,但它目前不在积极的由正在运行的进程使用。
% free -m
total used free shared buffers cached
Mem: 997 942 55 0 71 366
-/+ buffers/cache: 504 492
Swap: 2015 618 1397
Linux(以及所有 Unix 操作系统)尽量减少空闲内存。它们会使用未主动映射到正在运行的操作系统中的进程的内存,例如文件缓存和各种 IO 传输操作的缓冲区。
另一个可能让你感到困惑的是,你不能简单地将所有正在运行的进程使用的内存加起来,从而得到总的内存使用量。如果你尝试这样做,你很快就会发现你的应用程序使用的内存似乎比机器上实际存在的内存要多。这是有两个原因
- 内存可以在不同的进程间共享,通过写时复制内存分配,内存映射输入输出和共享动态库。
- 操作系统可以随意向应用程序承诺比实际提供的内存更多的内存。理论上,大多数应用程序编写者更喜欢一次性请求大量内存,以避免开销,并且实际上可能不会使用所有这些内存。
最近有一篇文章lwn.net 正在讨论此问题。
答案2
Linux 会主动将文件系统访问缓存到内存中,以加快磁盘访问速度。无需担心。
在盒子上运行 free -m 将使您更好地了解内存的使用位置。
下面是从我的一个机器中提取的输出。可用内存为 147Meg,其中将近 4G 被缓存用于文件系统访问请求。
free -m
total used free shared buffers cached
Mem: 6035 5888 147 0 77 4116
-/+ buffers/cache: 1693 4341
Swap: 4722 0 4722
答案3
您是否还包括“缓冲”和“缓存”字段?
答案4
您在系统上运行的是哪种内核?除非启用 PAE 进行编译,否则 32 位内核将仅报告大约 3.6GB 的内存。
也就是说,如果这是 Redhat Enterprise Linux(或 CentOS)的现代版本 - v3 及以上版本 - 默认的 32 位内核将启用此功能。
如果您可以发布上面详细的“free”命令的输出,我们将能够知道这是否是问题所在。