我有一台 Linux 机器,它报告几乎所有内存和交换空间都在使用中,但我无法识别机器上任何使用大量内存的进程。我们正在运行 Linux 内核2.6.32-431.40.2.el6.x86_64
,它是从 RHEL srpm 构建的,未经修改。这是一个物理系统(不是虚拟系统);一台配备两个 6 核 Intel X5650 CPU 的 Dell C6100。该系统已运行 12 天,以下是内存和交换空间的使用情况。
Mem: 49416180k total, 48890424k used, 525756k free, 18300k buffers
Swap: 12582908k total, 12582908k used, 0k free, 727252k cached
我运行了以下命令并收到以下输出,但这些输出似乎都没有表明机器上的任何进程正在消耗大量内存:
ps -eo pid,args,pmem --sort pmem
这是ps
该命令的完整输出在 Pastebin 上。
我也跑slabtop -o
了cat /proc/meminfo
以下是这些命令的完整输出在 Pastebin 上也是如此。
我现在很困惑。如果有人知道可能发生了什么,或者想查看任何其他命令的输出,我会很高兴听到。
答案1
这个问题的根源原来是系统上运行的 Lustre 内核模块中的一个错误 (LU-5726)。每次从机器托管的 Lustre 文件系统中删除文件时,这都会导致内核泄漏内存。升级到 Lustre 2.5.4(其中已合并修复程序)解决了这个问题。
引用错误报告(这是别人的,不是我的):
描述:
删除大量文件时,MDS 服务器上的内存使用量会显著增加。尝试通过删除缓存来回收内存只能释放部分内存。缓冲区使用量会持续增长,直到 MDS 服务器最终开始 OOMing。
缓冲区使用率的增长速度似乎有所不同,但似乎可能取决于删除文件的客户端数量和删除文件的速度。
针对该补丁,有报道称:
我们今天刚刚将补丁应用到我们的生产文件系统 (Lustre 2.4.3),现在正在运行一些大规模清除。我收集了一些有关内存使用情况的信息。在补丁之前,内存增长似乎主要由 /proc/meminfo 中的“Inactive(file)”决定。我删除了 MDS 服务器中的缓存 (echo 3 > /proc/sys/vm/drop_caches),并每分钟收集一次 Inactive(file) 使用情况:
inactive(file): 1146656 kB ..... 这个数字最初迅速上升,但随后趋于平稳。为了再检查一下,我再次删除了缓存:
不活动(文件):401152 kB ....
我们得到了相同的行为,更重要的是,我们似乎正在从 Inactive(file) 中回收内存。我还在删除缓存之前/之后检查了 MemFree 和 Buffers:
(之前)MemTotal:66053640 kB MemFree:51291028 kB 缓冲区:10685976 kB
(之后)MemTotal:66053640 kB MemFree:63239432 kB 缓冲区:198148 kB
缓冲区使用量降至 200 MB 以下。考虑到我们清除的速度,在应用补丁之前绝不会发生这种情况。
我觉得这个补丁有 90% 的把握解决了问题。如果我们能在几天内以这个速度继续清除而不增加内存使用量,那么我认为我会 100% 有信心。
此外
今天早上我再次检查了 MDS 内存使用情况:
MemTotal:66053640 kB MemFree:5568288 kB 缓冲区:
55504980 kB 活动:22374284 kB 非活动:33260116 kB删除缓存后:
MemTotal:66053640 kB MemFree:63146420 kB 缓冲区:
59788 kB 活动:57960 kB 非活动:93452 kB看起来补丁已经成功。
答案2
从我在这里看到的是,这是 Linux 的磁盘缓存。您的内存很好,当进程需要它时,它就可以使用它。
更多相关信息请参见此处: http://www.linuxatemyram.com/
我唯一不太确定的是 SWAP 的使用情况。我从未在任何一台机器上看到过这么高的使用率。
erik@xenon ~] $ free -m total used free shared buffers cached Mem: 7883 7756 126 0 201 5702 -/+ buffers/cache: 1852 6030 Swap: 8068 11 8057