Назад | Перейти на главную страницу

не требующая интенсивного использования процессора альтернатива lsof?

Мы проводим 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 тем не мение.