Мы запускаем кластер Apache Cassandra, где на каждом хосте в каждый момент времени открыто несколько сотен тысяч файлов.
Мы хотели бы иметь возможность получать количество открытых файлов с периодическими интервалами и подавать это число в графит , но когда мы работаем lsof
под collectd
ним, в итоге уходит несколько минут на завершение работы и в то же время жует чрезмерное количество ЦП ,
Мне интересно, есть ли альтернативные и более дружественные способы получения тех же данных, которые предоставляет lsof, или даже способ запуска lsof, который не будет так сильно загружаться в CPU? (Хотя я предполагаю, что этот последний метод, вероятно, займет гораздо больше времени, чем в настоящее время ... не идеально).
Возможно, ядро поддерживает некоторую переменную где-то, которая содержит количество открытых файлов? Желаемое за действительное?
Обновить:
В réponse на одном из ответов, мы уже используя -b
и -n
флаги. Вот полная команда, поскольку у меня это работает под collectd
:
sudo lsof -b -n -w | stdbuf -i0 -o0 -e0 wc -l
/proc/{{number}}/fd/5': No such file or directory find:
/ proc / {{number}} / fdinfo / 5 ': нет такого файла или каталога - Q @ Benoît, как мне этого избежать?echo /proc/*/fd/* | wc -w
Ты делаешь это неправильно.
Из
man proc
Первое значение, если вы кот, который дает вам именно то, что вы есть после того, как он появится.
Для записи, я не смог получить
lsof
результат, соответствующий этому, даже с некоторой степенью фальсификации, но я понял, что так говорит ядро, что оно более авторитетно, чем список, который вы получаете в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
вместо этого в том же месте, то.