Слишком много открытых файлов - как найти виновника
При беге tail -f filename
Я получил следующее сообщение:
tail: inotify cannot be used, reverting to polling: Too many open files
Это потенциальная проблема?
Как мне диагностировать, что отвечает за все открытые файлы? У меня есть список подозрительных процессов, но если они не окажутся виновными, инструкции, которые не зависят от знания, какой процесс проверять, будут полезны.
3 ответа
Вы можете использовать lsof, чтобы понять, кто открывает столько файлов. Обычно это (веб) сервер, который открывает так много файлов, но lsof наверняка поможет вам определить причину.
Как только вы поймете, кто плохой парень, вы можете
- убить процесс / остановить программу
- поднять ulimit http://posidev.com/blog/2009/06/04/set-ulimit-parameters-on-ubuntu/
Если вывод lsof довольно большой, попробуйте перенаправить его в файл, а затем откройте файл
Пример (вам может понадобиться Ctrl+C первой команды)
lsof > ~/Desktop/lsof.log
cat ~/Desktop/lsof.log | awk '{ print $2 " " $1; }' | sort -rn | uniq -c | sort -rn | head -20
vim ~/Desktop/lsof.log
На случай, если кому-то еще это понадобится...
ulimit -a
Будет отображать все текущие ограничения. конкретно ulimit -n 70000
установит ограничение дескриптора файла.
Также...
cat /proc/sys/fs/file-max
Будет отображать / устанавливать ограничение ядра, если оно отредактировано.
sudo echo 200000 > /proc/sys/fs/file-max
Более подробное объяснение можно найти на...
Как увеличить лимит открытых файлов для пользователя без полномочий root?
Пока
ulimit
может использоваться для определения того, сколько файлов разрешено открывать для каждого процесса , который может потребоваться для поиска виновника.
@itsadok @Tyler Collier @gaoithe в комментариях к другим ответам подчеркивает, что сортировка и подсчет того, в каком процессе открыто больше всего файлов, - это лучшее, что можно сделать здесь:
sudo lsof | head -1 | awk '{ print "COUNT " $2 " " $1; }' && sudo lsof +c 0 | awk '{ print $2 " " $1; }' | sort -rn | uniq -c | sort -rn | head -20
Команда выше:
- Дает вывод заголовка
- дает список открытых файлов
-
+c 0
опция указывает на вывод полной команды -
awk '{ print $2 " " $1; }'
печатает столбцы PID и COMMAND в результатах - сортирует результаты таким образом, чтобы идентичные записи располагались рядом друг с другом (необходимо для правильной работы)
-
uniq -c
подсчитывает файлы, открытые по PID/команде -
sort -rn
сортирует результаты по количеству -
head -20
показывает 20 лучших файлов, открытых по PID/команде
Примечание. Сюда входят «файлы», которые не учитываются при подсчете ограничений.
Вы можете захотеть изучить еще больше, просмотрев ограничения для PID, количество файлов, открытых для определенного PID, и ограничение
lsof
для подсчета только тех файлов, которые учитываются в пределе — см . https://serverfault.com/a/964752/152562.