Занадто багато відкритих файлів - як знайти винуватця


69

Під час запуску tail -f filenameя отримав таке повідомлення:

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

Це потенційна проблема?

Як діагностувати, що відповідає за всі відкриті файли? У мене є список підозрілих процесів, але якщо вони не виявляться винуватцями, інструкції, які не покладаються на те, щоб знати, який процес перевірити, був би корисним.


1
Ви збільшили кількість доступних дескрипторів файлів через ulimit?
Ігнасіо Васкес-Абрамс

2
@ IgnacioVazquez-Abrams Це може бути корисним іншим користувачам, але мені здається, що лікувати цей симптом, а не хворобу.
Ендрю Грімм

Хоча ви не помиляєтесь, іноді додатки мають законні причини відкриття багатьох файлів.
Ігнасіо Васкес-Абрамс

Відповіді:


71

Ви можете використовувати 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
itadok

1
У мене така ж помилка, і використання ulimit не працює. Команда хвоста -F все ще повертає помилку. Я збільшив ліміт з 1024 до 3000, тому я б уявив, що до цього часу у мене достатньо місця ... Я думаю, мені доведеться перезавантажуватися!
Алексіс Вілке

15
Мені здалося, що рядок ісадока корисний, але я думаю, вам слід спершу сортувати (бо uniqпрацює лише із суміжними лініями), запустити uniq, а потім сортувати ще раз. Отже lsof | awk '{ print $2; }' | sort -rn | uniq -c | sort -rn | head.
Тайлер Колліер

19
Сортування та підрахунок більшості відкритих файлів - це, безумовно, найкраще. Показати назву процесу, а також pid: '' 'lsof | awk '{print $ 2 "" $ 1; } '| сортувати -рн | uniq -c | сортувати -рн | голова -20 '' '
gaoithe

2
@gaoithe, якщо ти поставиш це у відповідь, я з радістю підняю це:)
Метт Бал

23

У випадку, якщо комусь це потрібно ...

ulimit -a

Буде відображено всі поточні обмеження. Конкретно ulimit -n 70000буде встановлено ліміт дескриптора файлу.

Також ...

cat /proc/sys/fs/file-max

Буде відображено / встановлено обмеження ядра, якщо його відредагувати.

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

Набагато детальніше пояснення можна знайти на ...

Як я можу збільшити ліміт відкритих файлів для некорінного користувача?


3
Проблеми існують, щоб ви могли чітко контролювати використання ресурсів у вашій системі. Найкраще збільшувати їх окремо для процесів, які, як відомо, потрібно буде використовувати багато дескрипторів файлів. Тримаючи їх під час тестування, ви знайдете процеси, які з часом можуть витікати дескриптори файлів. Зауважте також, що ручки файлів використовуються для доступу будь-якого пристрою в unix / linux. наприклад, кожен мережевий сокет, відкритий процесом, використовує файлову ручку. Це пояснює, чому ви можете потрапити на "занадто багато відкритих файлів" у випадку звичайних файлів файлової системи, а також будь-яких файлів пристроїв, таких як мережеві з'єднання.
gaoithe
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.