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


12

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

Ми хотіли б, щоб мати можливість отримати кількість відкритих файлів через певні проміжки часу і годувати це число в графіт , але коли ми біжимо lsofпід collectd, він закінчує приймати кілька хвилин , щоб закінчити і жувальний непомірну кількість CPU в той же час .

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

Можливо, ядро ​​десь підтримує якусь змінну, яка містить кількість відкритих файлів? Прийняття бажаного за дійсне?

Оновлення:

Відповідаючи на одну з відповідей, ми вже використовуємо прапори -bта -n. Ось повна команда, як у мене вона працює під collectd:

sudo lsof -b -n -w | stdbuf -i0 -o0 -e0 wc -l

Відповіді:


12

Вам, ймовірно, не потрібно вирішувати мережеві адреси для сокета, тому хоча б використовуйте -nкомутатор. Тоді ви також можете так пропустити операції з блокування -b.

Ці 2 перших вимикача дійсно повинні зробити це швидше.

А потім -lуникнути розв’язання уідів. І -Lщоб уникнути підрахунку посилань. І т. Д. Побачте людину lsof .

Крім того, за допомогою Linux ви можете створити сценарій, щоб просто підрахувати такі посилання /proc/<PID>/fd:

find /proc -mindepth 3 -maxdepth 3 -type l | awk -F/ '$4 == "fd" { s++ } END { print s }'


Я завжди отримую - знайдіть: /proc/{{number}}/fd/5': No such file or directory find: / proc / {{number}} / fdinfo / 5 ': Немає такого файлу чи каталогу - Q @ Benoît Як я можу цього уникнути?
БГ Бруно

2
@BrunoBG: спробуйте:echo /proc/*/fd/* | wc -w
Олів'є Дулак

Thx @OlivierDulac, що було очевидним :-)
BG Bruno

хороші пропозиції, але вже використовували параметри -n та -b .... Мені потрібні ще пропозиції
Майкл Мартінес

1
@OlivierDulac може не працювати, якщо у вас дуже велика кількість fd.
Беньот

5

Ви робите це неправильно.

З man proc

   /proc/sys/fs/file-nr

Цей файл (лише для читання) містить три числа: кількість виділених ручок файлу (тобто кількість відкритих файлів); кількість безкоштовних ручок файлів; і максимальну кількість файлових ручок (тобто таке ж значення, як / proc / sys / fs / file-max). Якщо кількість виділених ручок файлів близька до максимальної, слід розглянути можливість збільшення максимуму. До Linux 2.6 ядро, що виділяється файлом, динамічно обробляє, але знову не звільняло їх. Натомість безкоштовні ручки файлів зберігалися у списку для перерозподілу; значення "безкоштовних ручок файлів" вказує розмір цього списку. Велика кількість вільних ручок файлів вказує на те, що минулий пік у використанні відкритих файлових ручок був минулим. Починаючи з 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замість цього місця в тому самому місці.
Метью Іфе
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.