免费RAM消失 – 内存泄漏?

在一个刚刚启动的系统上,有关1.5G的free报告使用了RAM(总共8G RAM,带有lightdm和等离子桌面的Ubuntu 12.04,一个konsole窗口启动)。 让我使用的应用程序运行,它仍然消耗不超过2G。 但是,让系统运行几天后,越来越多的可用内存消失 – 没有显示在已使用的应用程序列表中:而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 

(所以你可以看到,它不是缓冲区或缓存)。 今天终于结束了系统完全崩溃:Windows管理器消失了,应用程序“挂在空中”(无框架) – 还有一个弹出窗口通知我“太多打开的文件”。 Syslog报告:

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

所以我关闭了我能够关闭的应用程序,并使用Ctrl-Alt-backspace杀死了X. 在尝试使用failsafeX之后,X试图再次出现,但由于无法再检测到其配置而无法执行此操作。 所以我使用Ctrl-Alt-F2切换到控制台,捕获了我能想到的所有信息(vmstat,free,smem, proc/meminfo ,lsof, 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 hdd(1TB),华硕F1A75-V Evo主板。 Ubuntu 12.04 64位,带KDE4 / Plasma。 应用程序通常或多或少地永久打开包括Evolution,Firefox,konsole(内置Midnight Commander,大约4个标签)和LibreOffice – 偶尔还有Calibre,Gimp和Moneyplex(我已经使用了近20年的银行软件,在一个在Hardy上做得很好的版本)。

编辑:今天我找到了一个“邪恶的家伙”:KDE4s等离子桌面。 当我使用killall plasma-desktop && plasma-desktop时,使用的内存再次高达5GB。 这释放了1.3GB内存! 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天里使用了几种工具对此进行了监控:使用过的内存(不是缓存和缓冲区)缓慢但稳定地增加。 即使我不在我的办公桌前运行任何东西……

至于使用打开文件监控进程,我目前使用以下1-liner(我喜欢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不喜欢破坏互联网连接。 每次断开都会导致其打开文件略有增加,但没有什么戏剧性的。 另一方面,似乎等离子也对此负责:

VFS使用(2天)

最后看到文件句柄的下拉? 那是等离子重启。

  1. 大量的打开文件是一个很好的线索,出了问题。 我的猜测是一些KDE系统守护进程。

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

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

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

你可以阅读这篇精彩的论文(linux吃了我的ram)来了解linux如何管理你的ram以及为什么没有必要担心:

http://www.linuxatemyram.com/