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

69

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

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

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

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

Эндрю Гримм
источник
1
Вы увеличили количество файловых дескрипторов, доступных через ulimit?
Игнасио Васкес-Абрамс
2
@ IgnacioVazquez-Abrams Это может быть полезно для других пользователей, но для меня это было бы похоже на лечение симптомов, а не болезни.
Эндрю Гримм
Хотя вы не ошибаетесь, иногда приложения имеют законные причины для открытия многих файлов.
Игнасио Васкес-Абрамс

Ответы:

72

Вы можете использовать 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
Андреа Оливато
источник
37
Для ленивых:lsof | awk '{ print $2; }' | uniq -c | sort -rn | head
садок
1
Я получил ту же ошибку, и использование Ulimit не работает. Команда tail -F по-прежнему возвращает ошибку. Я увеличил лимит с 1024 до 3000, чтобы представить, что к тому времени у меня будет достаточно места ... Думаю, мне придется перезагрузиться!
Алексис Уилке
15
Мне показалась полезной строка из itadok, но я думаю, что сначала нужно отсортировать (потому что uniqработает только со смежными строками), запустить uniq, а затем снова выполнить сортировку. Так lsof | awk '{ print $2; }' | sort -rn | uniq -c | sort -rn | head.
Тайлер Коллиер
19
Сортировка и подсчет большинства открытых файлов определенно является лучшим решением. Показать имя процесса, а также pid: '' 'lsof | awk '{print $ 2 "" $ 1; } '| сортировать -rn | uniq -c | сортировать -rn | голова -20 '' '
gaoithe
2
@gaoithe, если вы добавите это в ответ, я с радостью его опишу:)
Мэтт Болл
23

На случай, если кому-то еще это понадобится ...

ulimit -a

Будет отображать все текущие ограничения. В частности, ulimit -n 70000будет установлен предел дескриптора файла.

Также...

cat /proc/sys/fs/file-max

Будет отображать / устанавливать ограничение ядра, если оно отредактировано.

sudo echo 200000 > /proc/sys/fs/file-max

Более подробное объяснение можно найти на ...

Как увеличить лимит открытых файлов для пользователя без полномочий root?

Kervin
источник
3
Есть ограничения, так что вы можете держать жесткий контроль над использованием ресурсов в вашей системе. Лучше всего увеличивать их по отдельности для процессов, которые, как вы знаете, должны использовать множество файловых дескрипторов. Придерживая их во время тестирования, вы обнаружите процессы, которые могут со временем утекать файловые дескрипторы. Также обратите внимание, что файловые дескрипторы используются для доступа к любому устройству в unix / linux. например, каждый сетевой сокет, открытый процессом, использует дескриптор файла. Это объясняет, почему вы можете нажать «слишком много открытых файлов» в случае обычных файлов файловой системы, а также любых файлов устройств, таких как сетевые подключения.
Gaoithe