Почему 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 отчеты из разных времен, они никогда не могут быть полностью согласованы.

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