我当前的系统: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属于哪个进程。