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


9

我有一台相对较小的家用Red Hat Linux服务器(大约8 GB RAM)。除了运行一些本地开发的应用程序来跟踪各种事情之外,我没有将其用于其他用途。盒子上运行的唯一真实的东西是数据库和Web服务器。

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

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

Answers:


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

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

可能使您感到困惑的其他事情是,您不能简单地将所有正在运行的进程使用中的内存相加,以获得使用中的总内存量。如果尝试这样做,您将很快发现应用程序使用的内存似乎比计算机上实际存在的内存更多。这有两个原因

  1. 可以通过写时复制内存分配,内存映射的IO共享的动态库在各种进程之间共享内存
  2. 操作系统可以自由向应用程序承诺比实际提供的内存更多的内存。该理论认为,大多数应用程序编写者都喜欢一次性请求大量内存,以避免开销,并且可能实际上并未使用所有内存。

lwn.net上最近有一篇文章讨论此问题


1
这里也提供了一个简单的解释:linuxatemyram.com
Steven T. Snyder

4

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

1

您是否还包括“缓冲”和“缓存”字段?


1

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

Linux非常高效地使用内存,任何答应进行某些处理的块都用于缓存最近/经常访问的文件。因此,对于Linux,通常在启动后不久就使用所有可用物理内存的90%。

查看内核承诺提供..和不干净(交换)使用的内容,这可以使您获得更好的整体印象。

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

这是Linux的标准MO。.一些发行版通过sysctl调整内存管理以满足他们的需求。但是,您报告的内容在所有情况中都是非常典型的。


1

您在系统上运行哪种内核?除非启用PAE进行编译,否则32位内核将仅报告大约3.6GB的内存。

就是说,如果这是Redhat Enterprise Linux(或CentOS)的现代版本-从v3开始,则默认的32位内核将启用此功能。

如果您可以发布上面详细介绍的“ free”命令的输出,我们将能够查看这是否是问题所在。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.