Кто ест все мои файловые дескрипторы и, следовательно, память?
Моя текущая система: 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 ГБ (!). Обычно это значение находится в моей физической памяти. Еще один симптом заключается в том, что все мои RAM + swap израсходованы. В результате получается непригодная система. Пока я могу исправить эту ситуацию только перезагрузкой. Уничтожение почти всех процессов после выключения X не помогло высвободить зафиксированное значение.
Сильным показателем является неоправданно высокое значение счетчика открытых файлов в /proc/sys/fs/file-nr - оно превышает 2 миллиона. В последнее время я пытался ограничить это до 1624594, но единственный результат (конечно), что у меня не заканчивается память, а вместо этого FDs.
Имея Munin, я вижу сильную временную корреляцию между FD и использованием памяти.
У меня установлено несколько общих ресурсов CIFS, и у моего пользователя есть gvfsd-fuse. Root FS - это ext4.
Результат lsof
и обходить /proc/ list только около 10% /proc/sys/fs/file-nr.
Я подозревал, что причиной является MTP (когда я подключаю свой телефон Motorola), но недавно это произошло без использования MTP с момента последней перезагрузки.
Sidenote: У меня есть драйверы 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
).
Затем вы можете отследить, к чему принадлежит этот идентификатор процесса.