Слишком много открытых файлов - как найти виновника

При беге tail -f filenameЯ получил следующее сообщение:

tail: inotify cannot be used, reverting to polling: Too many open files

Это потенциальная проблема?

Как мне диагностировать, что отвечает за все открытые файлы? У меня есть список подозрительных процессов, но если они не окажутся виновными, инструкции, которые не зависят от знания, какой процесс проверять, будут полезны.

3 ответа

Вы можете использовать lsof, чтобы понять, кто открывает столько файлов. Обычно это (веб) сервер, который открывает так много файлов, но lsof наверняка поможет вам определить причину.

Как только вы поймете, кто плохой парень, вы можете

Если вывод 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.

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