Мы проводим Apache Cassandra кластер, где на каждом хосте в любой момент времени открыто несколько сотен тысяч файлов.
Мы хотели бы иметь возможность периодически получать количество открытых файлов и передавать это число в графит, но когда мы бежим lsof
под collectd
, это в конечном итоге занимает несколько минут и тем временем поглощает чрезмерное количество процессора.
Мне интересно, есть ли альтернативные и более удобные способы получения тех же данных, которые предоставляет lsof, или даже способ запуска lsof, который не будет поглощать процессор так заметно? (Хотя я предполагаю, что этот последний метод, вероятно, займет гораздо больше времени, чем сейчас ... не идеально).
Возможно, ядро где-то хранит какую-то переменную, содержащую количество открытых файлов? Принятие желаемого за действительное?
Обновить:
В ответ на один из ответов мы уже используем -b
и -n
флаги. Вот полная команда, так как у меня она работает под collectd
:
sudo lsof -b -n -w | stdbuf -i0 -o0 -e0 wc -l
Вероятно, вам не нужно разрешать сетевые адреса для сокета, поэтому по крайней мере используйте -n
переключатель. Тогда вы также можете пропустить операции блокировки с помощью -b
.
Эти два первых переключателя действительно должны сделать его быстрее.
А потом -l
чтобы избежать разрешения uids. И -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 выделенные ядром файлы обрабатывались динамически, но не освобождали их снова. Вместо этого свободные дескрипторы файлов хранились в списке для перераспределения; значение «свободных дескрипторов файлов» указывает размер этого списка. Большое количество свободных дескрипторов файлов указывает на то, что в прошлом был пик использования открытых дескрипторов файлов. Начиная с Linux 2.6, ядро освобождает дескрипторы файлов, а значение «свободных дескрипторов файлов» всегда равно нулю.
Первое значение, если вы кошка, которая дает вам именно то, что вы есть после того, как она появится.
Для записи я не смог получить lsof
вывод, чтобы соответствовать ему, даже с некоторым количеством подделок, но я так понимаю, если это то, что говорит ядро, его более авторитетным, чем список, который вы получаете из lsof
тем не мение.