Не интенсивно использующая процессор альтернатива lsof?
Мы запускаем кластер Apache Cassandra, где на каждом хосте открыто несколько сотен тысяч файлов в любой момент времени.
Мы хотели бы иметь возможность получать количество открытых файлов с периодическими интервалами и подавать это число в графит, но когда мы запускаем lsof
под collectd
В итоге на завершение работы уходит несколько минут, и в то же время происходит излишняя загрузка процессора.
Мне интересно, есть ли альтернативные и более дружественные способы получения тех же данных, которые предоставляет lsof, или даже способ запуска lsof, который не будет так сильно загружаться в CPU? (Хотя я предполагаю, что этот последний метод, вероятно, займет гораздо больше времени, чем в настоящее время... не идеально).
Возможно, ядро поддерживает некоторую переменную где-то, которая содержит количество открытых файлов? Желаемое за действительное?
Обновить:
В ответ на один из ответов мы уже используем -b
а также -n
флаги. Вот полная команда, поскольку у меня это работает под collectd
:
sudo lsof -b -n -w | stdbuf -i0 -o0 -e0 wc -l
2 ответа
Возможно, вам не нужно разрешать сетевые адреса для сокета, поэтому по крайней мере используйте -n
переключатель. Тогда вы также можете пропустить операции блокировки с -b
,
Эти 2 первых переключателя должны действительно сделать это быстрее.
А потом -l
чтобы избежать разрешения идентификаторов. А также -L
чтобы избежать подсчета ссылок. И т. Д. Посмотрите на человека.
В качестве альтернативы, в Linux вы можете создать скрипт для простого подсчета ссылок /proc/<PID>/fd
как это:
find /proc -mindepth 3 -maxdepth 3 -type l | awk -F/ '$4 == "fd" { s++ } END { print s }'
Ты делаешь это неправильно.
От man proc
/proc/sys/fs/file-nr
Этот (только для чтения) файл содержит три числа: количество выделенных файловых дескрипторов (т. Е. Количество файлов, открытых в настоящее время); количество свободных файловых дескрипторов; и максимальное количество дескрипторов файлов (т. е. то же значение, что и /proc/sys/fs/file-max). Если количество выделенных файловых дескрипторов близко к максимуму, вам следует рассмотреть возможность увеличения максимума. До Linux 2.6 ядро распределяло файловые дескрипторы динамически, но не освобождало их снова. Вместо этого дескрипторы свободных файлов были сохранены в списке для перераспределения; значение "free file handles" указывает размер этого списка. Большое количество дескрипторов свободных файлов указывает на то, что в прошлом использовался дескриптор открытых файлов. Начиная с Linux 2.6, ядро освобождает дескрипторы освобожденных файлов, и значение "свободных дескрипторов файлов" всегда равно нулю.
Первое значение, если вы кот, который дает вам именно то, что вы есть после того, как он появится.
Для записи я не мог получить lsof
вывод, чтобы соответствовать ему даже с некоторой суммой фальсификаций, но я собираюсь, если это, то, что говорит ядро, более авторитетно, чем список, из которого вы получаете lsof
тем не мение.