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

При запуске tail -f filename, я получил следующее сообщение:

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

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

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

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

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

  • завершите процесс/остановите программу
  • поднимите ульмит

Если вывод из lsof довольно большой, попробуйте перенаправить его в файл, а затем откройте файл

Пример (возможно, вам придется Ctrl+C первая команда)

lsof > ~/Desktop/lsof.logcat ~/Desktop/lsof.log | awk '{ print $2 " " $1; }' | sort -rn | uniq -c | sort -rn | head -20vim ~/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

Вышеприведенная команда:

  • Выдает на выходе заголовок
  • lsof выдает список открытых файлов
  • +c 0 опция инструктирует lsof для печати полной команды
  • awk '{ print $2 " " $1; }' выводит столбец PID и COMMAND в результатах
  • sort -rn сортирует результаты таким образом, чтобы идентичные записи находились рядом друг с другом (необходимо для uniq -c для правильной работы)
  • uniq -c подсчитывает файлы, открытые с помощью PID/command
  • sort -rn сортирует результаты по количеству
  • head -20 показывает 20 лучших файлов, открытых с помощью PID/command

Примечание: При этом будут учитываться "файлы", которые не учитываются в ограничениях

Возможно, вы захотите продолжить расследование, просмотрев ограничения для PID, количество файлов, открытых для определенного PID, и ограничение lsof чтобы подсчитывать только те файлы, которые относятся к пределу - см. https://serverfault.com/a/964752/152562.

@IgnacioVazquez-Abrams Это может быть полезно для других пользователей, но для меня это было бы похоже на лечение симптома, а не болезни.

Увеличили ли вы количество файловых дескрипторов, доступных через ulimit?

По теме: Ubuntu - слишком много открытых файлов?

Хотя вы не ошибаетесь, иногда у приложений есть законные причины для открытия большого количества файлов.