为什么Red Hat Linux在系统上报告的可用内存比实际可用的less?

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

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

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

不要将可用内存与未使用的内存混淆。 在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操作系统)都尽可能地使用尽可能less的空闲内存。 相反,它们使用的内存不是主动映射到正在运行的操作系统中的进程,例如文件高速caching和各种IO传输操作的缓冲区。

还有一些可能让你感到困惑的是,你不能简单地将所有正在运行的进程所使用的内存加起来,以获得一个正在使用的内存总量。 如果你尝试了这个,你很快就会发现你的应用程序看起来使用的内存比机器上实际存在的要多。 这是有两个原因的

  1. 通过写时复制内存分配, 内存映射IO和共享dynamic库 ,可以在各种进程之间共享内存 。
  2. 操作系统可以自由地向应用程序提供比实际提供的内存更多的内存。 理论上说,大多数应用程序编写者倾向于一次要求大量的内存,以避免开销,并且可能实际上不使用所有的内存。

最近有一篇关于lwn.net的文章讨论这个问题 。

Linux将主动将文件系统访问caching到内存中以提供更快的磁盘访问时间。 这是没有什么可担心的。

在这个盒子上运行free -m可以让你更好地了解内存的使用情况。

下面是从我的一个箱子拉出的输出。 空闲内存是147Meg,几乎4Gcaching文件系统访问请求。

 free -m total used free shared buffers cached Mem: 6035 5888 147 0 77 4116 -/+ buffers/cache: 1693 4341 Swap: 4722 0 4722 

你还包括“缓冲”和“caching”字段?

使用linux,查看/ proc / meminfo中的Committed_AS,这是内核实际承诺运行进程的内存量(实数+交换)。

Linux非常高效地使用内存,任何不被承诺某些进程的块被用来caching最近/经常访问的文件。 因此,在启动之后,Linux通常使用所有可用物理内存的90%。

看看内核已经承诺提供..和脏(交换)使用,这给你一个更好的整体情况。

如果您需要调整此行为,请更新您的问题:)

这是Linux的标准MO ..一些发行版通过sysctl来调整内存pipe理来满足他们的需求。 但是,你所报告的是非常典型的。

你在系统上运行什么样的内核? 除非使用PAE编译,否则32位内核只会报告大约3.6GB的内存。

说,如果这是Redhat Enterprise Linux(或CentOS)的现代版本 – v3以上 – 默认的32位内核将启用此function。

如果你可以发布上面详细描述的“free”命令的输出,我们将能够看到这是否是问题。