не-интенсивная альтернатива lsof?

12

Мы запускаем кластер Apache Cassandra, где на каждом хосте в каждый момент времени открыто несколько сотен тысяч файлов.

Мы хотели бы иметь возможность получать количество открытых файлов с периодическими интервалами и подавать это число в графит , но когда мы работаем lsofпод collectdним, в итоге уходит несколько минут на завершение работы и в то же время жует чрезмерное количество ЦП ,

Мне интересно, есть ли альтернативные и более дружественные способы получения тех же данных, которые предоставляет lsof, или даже способ запуска lsof, который не будет так сильно загружаться в CPU? (Хотя я предполагаю, что этот последний метод, вероятно, займет гораздо больше времени, чем в настоящее время ... не идеально).

Возможно, ядро ​​поддерживает некоторую переменную где-то, которая содержит количество открытых файлов? Желаемое за действительное?

Обновить:

В réponse на одном из ответов, мы уже используя -bи -nфлаги. Вот полная команда, поскольку у меня это работает под collectd:

sudo lsof -b -n -w | stdbuf -i0 -o0 -e0 wc -l
Майкл Мартинес
источник

Ответы:

12

Вам, вероятно, не нужно разрешать сетевые адреса для сокета, поэтому по крайней мере используйте -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 }'

Benoît
источник
Я всегда получаю - найди: /proc/{{number}}/fd/5': No such file or directory find: / proc / {{number}} / fdinfo / 5 ': нет такого файла или каталога - Q @ Benoît, как мне этого избежать?
Б.Г. Бруно
2
@BrunoBG: попробуй:echo /proc/*/fd/* | wc -w
Оливье Дюлак
Спасибо @OlivierDulac, это было очевидно :-)
Б.Г. Бруно
хорошие предложения, но уже использовали опции -n и -b .... Мне нужно больше предложений
Майкл Мартинес,
1
@OlivierDulac может не работать, если у вас очень большое количество fd.
Бенуа
5

Ты делаешь это неправильно.

Из man proc

   /proc/sys/fs/file-nr

Этот (только для чтения) файл содержит три числа: количество выделенных файловых дескрипторов (т. Е. Количество файлов, открытых в настоящее время); количество свободных файловых дескрипторов; и максимальное количество дескрипторов файлов (т. е. то же значение, что и / proc / sys / fs / file-max). Если количество выделенных файловых дескрипторов близко к максимуму, вам следует рассмотреть возможность увеличения максимума. До Linux 2.6 ядро ​​распределяло файловые дескрипторы динамически, но не освобождало их снова. Вместо этого дескрипторы свободных файлов были сохранены в списке для перераспределения; значение "free file handles" указывает размер этого списка. Большое количество свободных файловых дескрипторов указывает на то, что в прошлом использовался открытый файловый дескриптор. Начиная с Linux 2.6, ядро ​​освобождает дескрипторы освобожденных файлов, и "

Первое значение, если вы кот, который дает вам именно то, что вы есть после того, как он появится.

Для записи, я не смог получить lsofрезультат, соответствующий этому, даже с некоторой степенью фальсификации, но я понял, что так говорит ядро, что оно более авторитетно, чем список, который вы получаете в lsofлюбом случае.

Мэтью Ифе
источник
1
Вот мой Lsof выход: [root@ec2- cassandra101 ~]$ time lsof -b -n -w -l -L | stdbuf -i0 -o0 -e0 wc -l 1018065. Вот что говорит файл-Nr: [root@ec2- cassandra101 ~]$ cat /proc/sys/fs/file-nr 2784 0 3093428. Большое расхождение (1 000 000+ против 2784) связано с тем, что lsofвключает в себя все вещи, с которыми не связан файловый дескриптор: библиотечные файлы, исключительные ситуации и т. Д. Итак, если вас интересуют только файловые дескрипторы, то file-nrэто путь, в противном случае вам нужен lsof или эквивалентный.
Майкл Мартинес
Попробуйте inode-nrвместо этого в том же месте, то.
Мэтью Ифе