谁消耗了我所有的文件描述符以及内存?

谁消耗了我所有的文件描述符以及内存?

我当前的系统:14.04.4 LTS(GNU/Linux 3.13.0-85-generic x86_64)

$ free
             total       used       free     shared    buffers     cached 
Mem:      16366288   16090588     275700    4047472    1019652  5253144
-/+ buffers/cache:    9817792    6548496 Swap:      7813116    7308592     504524



$ cat /proc/sys/fs/file-nr
1196103  0   1624594

几个月以来(以及多次更新)我一直遇到这样的问题:在使用我的盒子几天后(每天暂停它),内存使用量和分配的文件描述符的数量突然急剧增加。

突然间,“已提交”内存上升到大约 120 - 160 GB(!)。通常这个值大约等于我的物理 RAM。另一个症状是我的所有 RAM + 交换都用完了。结果是系统无法使用。目前我只能通过重新启动来解决这种情况。关闭 X 后杀死几乎所有进程并不能帮助释放已提交的值。

一个强有力的指标似乎是 /proc/sys/fs/file-nr 中打开文件计数器的值过高——超过 200 万。最近我试图将其限制为 1624594,但唯一的结果是(当然)我没有用完内存,而是用完了 FD。

有了 Munin,我可以看到 FD 和内存使用情况之间存在很强的时间相关性。

我安装了一些 CIFS 共享,我的用户有其 gvfsd-fuse。根 FS 是 ext4。

lsof遍历 /proc/的结果仅列出了 /proc/sys/fs/file-nr 的约 10%。

我怀疑是 MTP 造成的(当我插入我的摩托罗拉手机时),但最近自从上次重启后没有使用 MTP 就又发生了这种情况。

旁注:我有用于视频的 Radeon 驱动程序:

ii  libdrm-radeon1:amd64                                        2.4.64-1~ubuntu14.04.1                        
ii  libdrm-radeon1:i386                                         2.4.64-1~ubuntu14.04.1                        
ii  radeontool                                                  1.6.3-1                                       
ii  xserver-xorg-video-radeon                                   1:7.3.0-1ubuntu3.1  

更新

root:/proc$ (echo -n "0" ; for processid in [0-9]*; do echo -n "+$(ls /proc/$processid/fd/ | wc -l)"; done;echo)|bc
2597
root:/proc$ lsof -n|wc -l
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
84504
root:/proc$ sudo -u mdo lsof -n|wc -l
72170

我怎样才能找出到底是什么消耗了这些 FD 和我的内存?

答案1

这将显示每个进程 ID 的打开文件数:

cd /proc
for processid in [0-9]*
do
    echo "Process ID = $processid: $(ls /proc/$processid/fd/ | wc -l) file descriptors"
done

(使用 保存并执行sudo)。

然后你就可以追踪这个进程ID属于哪个进程。

相关内容