Почему lsof -p и просто lsof возвращают совершенно разные результаты?
В настоящее время я установил лимит открытых файлов в 100000, но lsof сообщает, что он почти исчерпан.
Бег lsof -n | awk '{print $2'} | sort | uniq -c | sort -n
результаты в:
1 PID
90321 3979
Почти такой же результат получают lsof -n | grep 3979 | wc -l
Но работает lsof -n -p 3979 | wc -l
возвращает что-то совершенно другое
3930
Подсчет файлов в /proc/3979/fd/
также возвращает меньший результат.
2 ответа
Я думаю, что в эпоху возникновения этого вопроса существовала ошибочная версия lsof. Это включает в себя Ubuntu Bionic. Проблема с этой версией lsof заключается в том, что она всегда показывает потоковое представление, и это представление нельзя отключить. Версии lsof:
- 4.86 (ubuntu Trusty) по умолчанию отображает представление процесса. -K для резьбового
- В версии 4.89 (ubuntu bionic) по умолчанию отображается многопоточный вид. Не могу выключить.
- В версии 4.91 (debian buster) по умолчанию отображается многопоточное представление. -Ки для процесса
Файловая система /proc всегда была моей любимой:
ls -d /proc/[1-9]*/fd/*|cut -d/ -f3|sort |uniq -c |sort -rn|head
Я посмотрел журналы с dropbox
в моей системе, и я вижу сопоставимые различия.
Когда я смотрю подробно на отдельные журналы, я обнаруживаю, что dropbox
отображается как наличие 400 файлов, открытых с lsof -p
и 23500 открываются с ls ... | grep '^dropbox'
Глядя на длинный список, я обнаружил, что dropbox
имеет 60 потоков, и большинство из базовых 400 файлов сообщается в каждом потоке, что объясняет разницу.
Что я не знаю, так это то, находятся ли файловые дескрипторы в потоках в общей памяти или индивидуально для потоков. Дескрипторы файлов в общей памяти не должны учитываться более одного раза в лимите открытых файлов.
Моя команда для подсчета потоков была:
lsof -n | grep "^dropbox " | awk '{print $3}' | uniq | wc -l
Если ваше приложение ведет себя аналогично, то нижняя цифра является реалистичной.
Обратите внимание, что все цифры являются приблизительными: я проигнорировал, когда строки заголовков включены в счетчики и включение основного PID в счетчики потоков. Поскольку ls
отчеты из разных времен, они никогда не могут быть полностью согласованы.