Не интенсивно использующая процессор альтернатива 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 тем не мение.

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