可用RAM消失-内存泄漏?


11

在新启动的系统上,free报告有关1.5G已用RAM(总共8G RAM,带有lightdm和血浆桌面的Ubuntu 12.04,启动了一个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

(因此您可以看到,它不是缓冲区或缓存)。如今,这种情况终于以系统完全崩溃而告终:Windows管理器消失了,应用程序“悬空了”(无框架),并且弹出窗口通知我“打开的文件太多”。Syslog报告:

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使用时间为一周

编辑:刚刚从我的监视系统添加了两个图形。有趣的是:每当内存消耗出现“跳跃”时,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。如果有问题,请遵循一些规格:

带有Radeon(tm)HD Graphics的AMD A4-3400 APU,使用开源ati / radeon驱动程序(因此未安装fglrx),8GB RAM,WDC WD1002FAEX-0硬盘(1TB),华硕F1A75-V Evo主板。具有KDE4 / Plasma的Ubuntu 12.04 64位。通常,应用程序或多或少会永久打开,包括Evolution,Firefox,konsole(其中运行Midnight Commander,大约有四个选项卡)和LibreOffice-偶尔还有Calibre,Gimp和Moneyplex(我已经使用了近20年的银行软件,在对Hardy而言效果还不错的版本中)。

编辑: 今天,我发现了一个“邪恶的家伙”:KDE4s等离子桌面。当我执行时,使用的记忆体再次达到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天中使用多种工具进行了监视:已用内存(不是在讨论缓存和缓冲区)缓慢但稳定地增加。即使我不在办公桌前也不做任何事情...

至于监视打开文件的过程,我目前使用以下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天)

看到文件句柄的末尾了吗?那是等离子重启。


是否sudo bash -c 'sync; echo 3 > /proc/sys/vm/drop_caches'清除多余的公羊?您可以使用lsof
Savvas Radevic

另外,您是否尝试过切换桌面管理器?例如lxde(或lubuntu-desktop)?最后,您确定磁盘输出是否正确?您是否检查过磁盘的SMART数据以及使用实时cd从磁盘复制文件到磁盘的速度?
Savvas Radevic

进行检查以检查是否存在泄漏如何检测内存泄漏
Mitch

@medigeek:正如我指出的那样,缓存和缓冲区不是问题。请参阅的输出free。我实际上已经考虑过切换到另一个DE。如果KDE3.5可用,那我还没有选择Plasma。这可能只是暂时的,看是否涉及血浆。
伊兹(Izzy)2012年

@Mitch:我知道memprof将用于已知的进程(我尚未隔离)。确定可以在系统范围内使用吗?而且,正如“打开的文件太多”错误所暗示的那样,对我来说,似乎某个进程正在打开许多文件句柄,而从未释放它们。不知道是否会被memprof捕获。现在,我设置了一个脚本来通过打开的文件捕获前5个进程-希望这会发现邪恶的进程。
伊兹(Izzy)2012年

Answers:


6
  1. 大量打开的文件是出现问题的一个很好的线索。我的猜测是某个KDE系统守护程序。

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

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


我已经尝试为此使用top / htop。麻烦的是,它没有显示关于驻留内存的结果(如上所述,仅一小部分使用的内存可以连接到正在运行的应用程序)。至于虚拟内存,很难解释(即使在启动后,这里使用的虚拟内存总和也高达3TB,即使我的硬盘也无法处理)。因此,例如,Evolution目前使用的是1.9GB VIRT,而使用的总内存总计为1.2GB(不包括缓存和缓冲区)。是的,我的首要目的是追踪程序,以便我可以提交错误……
Izzy 2012年

刚刚从我的监视系统中添加了2张img。看起来“跳跃”总是在一天的同一时间发生(尽管有1个例外)。不幸的是,img并没有提供时间戳来检查cron。顺便说一句:有什么方法可以监视哪个进程打开了多少文件?
伊兹(Izzy)

1
您的猜测是一个很好的猜测。尽管不是守护程序,但它主要是KDE组件:plasma-desktop(请参见上文)。有趣的是:我想通了,然后贴在这里-每天10分钟后,我apt-get update && apt-get upgrade更新了等离子台式机;那些家伙很快(X)现在,我先看一会儿,看看问题是否已解决,然后再宣布。到现在为止,事情看起来很有希望。
Izzy 2012年

看起来仍然稳定。虽然既不lsof也不top向我指出“邪恶的过程”,你的关于KDE守护进程的猜测指出我的麻烦制造者的方向。再次感谢您-我的计算机的正常运行时间现在约为14天,尽管我什至并行运行了VirtualBox,编译等内容,但一切看起来仍然稳定。因此,我认为这已解决,并标记了最接近的匹配项:)
Izzy 2012年

0

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

您可以阅读这篇出色的文章(Linux帮了我的忙),了解了linux如何管理您的ram以及为什么不必担心:

http://www.linuxatemyram.com/


4
哦,我从来没有听说过,如果系统在7天后因“打开的文件过多”错误而崩溃,这是“正常的系统行为”。我运行Linux已有15年了,从未有过。是的,我完全理解Linux如何利用“空闲RAM”(将其用于缓存等)。如上所述:缓存和缓冲区不是这里的问题。我并不是说要使用RAM是有充分理由的-Linux永远不会因为交换的价格而坚持使用缓存。
Izzy 2012年
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.