Кто ест все мои файловые дескрипторы и, следовательно, память?

Моя текущая система: 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).

Затем вы можете отследить, к чему принадлежит этот идентификатор процесса.

Другие вопросы по тегам