我当前的系统: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
Run Code Online (Sandbox Code Playgroud)
几个月来(以及多次更新),我遇到了一个问题,即在使用我的机器几天后(每天暂停它)内存使用量和分配的文件描述符数量突然激增。
突然间,“提交的”内存上升到大约 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
Run Code Online (Sandbox Code Playgroud)
更新
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
Run Code Online (Sandbox Code Playgroud)
我怎样才能找出是什么在吃掉所有这些 FD 和我的记忆?
这将显示每个进程 ID 打开的文件数:
cd /proc
for processid in [0-9]*
do
echo "Process ID = $processid: $(ls /proc/$processid/fd/ | wc -l) file descriptors"
done
Run Code Online (Sandbox Code Playgroud)
(保存并使用 执行sudo)。
然后您可以追踪该进程 ID 属于什么。
| 归档时间: |
|
| 查看次数: |
1538 次 |
| 最近记录: |