可用 RAM 消失——内存泄漏?

可用 RAM 消失——内存泄漏?

在新启动的系统上,free报告大约使用了 1.5G RAM(总共 8G RAM,Ubuntu 12.04,带有 lightdm 和 plasma 桌面,启动了一个 konsole 窗口)。运行我使用的应用程序时,它仍然消耗不超过 2G。但是,系统运行几天后,越来越多的可用 RAM 消失了——没有显示在已使用应用程序列表中:虽然smem --pie=name报告使用量不到 20%(并且 80%​​ 可用),但其他一切都不同。free -m例如,大约第 7 天的报告:

             total       used       free     shared    buffers     cached
Mem:          7459       7013        446          0        178        997
-/+ buffers/cache:       5836       1623
Swap:         9536        296       9240

(所以你可以看到,这不是缓冲区或缓存的问题)。今天,这个问题终于以系统彻底崩溃而告终:窗口管理器消失了,应用程序“悬在空中”(无框架)——并且弹出一个通知我“打开的文件太多”的窗口。系统日志报告:

kernel: [856738.020829] VFS: file-max limit 752838 reached

于是我关闭了那些可以关闭的应用程序,并使用 Ctrl-Alt-backspace 杀死了 X。之后,X 尝试使用 failsafeX 再次启动,但无法启动,因为它无法再检测到其配置。因此,我使用 Ctrl-Alt-F2 切换到控制台,捕获我能想到的所有信息(vmstat、free、smem、proc/meminfolsof、ps aux),最后重新启动。X 再次启动 failsafeX;这次我告诉它“从我的备份配置中恢复”,然后切换到控制台并成功startx启动图形环境。

我不知道到底是什么导致了这个问题 —— 尽管它肯定与 X 本身或者在 X 上运行的某些用户进程有关 —— 因为在终止 X 之后,free -m输出如下所示:

             total       used       free     shared    buffers     cached
Mem:          7459       2677       4781          0         62        419
-/+ buffers/cache:       2195       5263
Swap:         9536         59       9477

(释放了约 3.5GB)——与重新启动后的输出进行比较:

             total       used       free     shared    buffers     cached
Mem:          7459       1483       5975          0         63        730
-/+ buffers/cache:        689       6769
Swap:         9536          0       9536

提供了另外两个有用的输出memstat -u。崩溃前不久:

User     Count     Swap      USS      PSS      RSS
mail         1        0      200      207      616
whoopsie     1      764      740      817     2300
colord       1     3200      836      894     2156
root        62    70404   352996   382260   569920
izzy        80   177508  1465416  1519266  1851840

X 被杀后:

User     Count     Swap      USS      PSS      RSS
mail         1        0      184      188      356
izzy         1     1400      708      739     1080
whoopsie     1      848      668      826     1772
colord       1     3204      804      888     1728
root        62    54876   131708   149950   267860

重启后,返回 X:

User     Count     Swap      USS      PSS      RSS
mail         1        0      212      217      628
whoopsie     1        0     1536     1880     5096
colord       1        0     3740     4217     7936
root        54        0   148668   180911   345132
izzy        47        0   370928   437562   915056

一周的文件系统使用情况 一周的内核/CPU 使用情况

编辑:刚刚从我的监控系统添加了两个图表。有趣的是:每次内存消耗“跳跃”时,CPU 也会达到峰值。刚刚发现这一点——它让我想起了指向 X 本身的另一个指标:通常当我返回我的机器并解锁屏幕时,我发现有什么东西在我的 CPU 上做着繁重的工作。用 检查top,结果总是/usr/bin/X :0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch -background none

经过这么长的解释之后,我终于有疑问了:

  1. 可能的原因有哪些?
  2. 我如何才能更好地识别所涉及的流程/应用程序?
  3. 可以采取什么步骤来避免这种行为——除了 X 天重新启动机器之外?

我在旧机器上运行 8.04 (Hardy) 大约 5 年了,从来没有遇到过类似的事情(总是正常运行超过 100 天,然后才重新启动以进行内核更新)。现在这是一台全新的机器,全新安装 12.04。以防万一,以下是一些规格:

AMD A4-3400 APU 配备 Radeon(tm) HD Graphics,使用开源 ati/radeon 驱动程序(因此未安装 fglrx),8GB RAM,WDC WD1002FAEX-0 硬盘(1TB),Asus F1A75-V Evo 主板。Ubuntu 12.04 64 位,配备 KDE4/Plasma。通常或多或少永久打开的应用程序包括 Evolution、Firefox、konsole(内部运行 Midnight Commander,大约 4 个选项卡)和 LibreOffice——偶尔还会打开 Calibre、Gimp 和 Moneyplex(我已经使用了近 20 年的银行软件,该版本在 Hardy 上运行良好)。

编辑: 今天我发现了一个“邪恶的家伙”:KDE4s plasma-desktop。当我执行 时,使用的内存再次高达 5GB killall plasma-desktop && plasma-desktop。这释放了 1.3GB RAM!ps说:

                             RSS    SIZE   VSZ
plasma usage before restart  120988 526472 1300816
plasma usage after restart   92352  495972 1263632

那么这 1.3GB 去哪了?如果把这两个值相加,那么相差就是 96MB,而不是 1.3GB。

而且这只能是一部分,因为仍有 3.7GB 正在使用中(应该少于 2GB)。我在过去 6 天使用多种工具监控了这一点:使用的内存(不是指缓存和缓冲区)缓慢但稳定地增加。即使我不在办公桌前运行任何东西......

至于监控打开文件的进程,我目前使用以下一行代码(我喜欢 shell,尤其是 bash)来获取前 5 名:

echo "$(for pid in $(ls -a /proc|egrep '^([0-9])*$'|sort -n 2>/dev/null); do \
if [ -e /proc/$pid/fd ]; then FHC=$(ls -l /proc/$pid/fd|wc -l); \
if [ $FHC -gt 0 ]; then PNAME="$(cat /proc/$pid/comm)"; \
echo "$FHC files opened by $pid ($PNAME)"; fi; fi; done)"|sort -r -n|head -n5

此处的命令分为 4 行,以便于阅读。目前为止,还没有什么特别的——除了 Skype 不喜欢互联网连接中断。每次断开连接都会导致其打开的文件数略有增加,但并不严重。另一方面,似乎 Plasma 也对此负责:

VFS 使用(2 天)

看到最后文件句柄的下降了吗?这就是 Plasma 重启。

答案1

  1. 打开的文件数量巨大,这说明出现了问题。我猜是某个 KDE 系统守护进程出了问题。

  2. 打开控制台并运行“top”。然后使用 < 和 > 将排序列更改为 VIRT 或 RES,查看哪些程序占用的内存最多。内存泄漏将显示为虚拟内存使用量大幅膨胀,因为一旦指向泄漏内存的指针丢失,它将不会被使用,并将被换出。还要运行“lsof”并查找打开大量文件的进程,因为这似乎确实是文件描述符泄漏。

  3. 追踪程序并报告错误。

答案2

我认为这是正常的系统行为。很可能一切都很好。

您可以阅读这篇精彩的论文(linux ate my ram)来了解 linux 如何管理您的 RAM 以及为什么无需担心:

http://www.linuxatemyram.com/

相关内容