在新启动的系统上,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/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 也会达到峰值。刚刚发现这一点——它让我想起了指向 X 本身的另一个指标:通常当我返回我的机器并解锁屏幕时,我发现有什么东西在我的 CPU 上做着繁重的工作。用 检查top
,结果总是/usr/bin/X :0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch -background none
。
经过这么长的解释之后,我终于有疑问了:
- 可能的原因有哪些?
- 我如何才能更好地识别所涉及的流程/应用程序?
- 可以采取什么步骤来避免这种行为——除了 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 也对此负责:
看到最后文件句柄的下降了吗?这就是 Plasma 重启。
答案1
打开的文件数量巨大,这说明出现了问题。我猜是某个 KDE 系统守护进程出了问题。
打开控制台并运行“top”。然后使用 < 和 > 将排序列更改为 VIRT 或 RES,查看哪些程序占用的内存最多。内存泄漏将显示为虚拟内存使用量大幅膨胀,因为一旦指向泄漏内存的指针丢失,它将不会被使用,并将被换出。还要运行“lsof”并查找打开大量文件的进程,因为这似乎确实是文件描述符泄漏。
追踪程序并报告错误。
答案2
我认为这是正常的系统行为。很可能一切都很好。
您可以阅读这篇精彩的论文(linux ate my ram)来了解 linux 如何管理您的 RAM 以及为什么无需担心: