Nicht-CPU-intensive Alternative zu lsof?


12

Wir führen einen Apache Cassandra- Cluster aus, in dem auf jedem Host zu einem bestimmten Zeitpunkt einige hunderttausend Dateien geöffnet sind.

Wir möchten in der Lage sein, in regelmäßigen Abständen eine Anzahl von offenen Dateien abzurufen und diese Anzahl in Graphit zu überführen , aber wenn wir lsofdarunter laufen collectd, dauert es in der Zwischenzeit ein paar Minuten, bis eine übermäßige Menge an CPU fertiggestellt und aufgebraucht ist .

Ich frage mich, ob es eine alternative und freundlichere Methode gibt, um die gleichen Daten zu erhalten, die von lsof bereitgestellt werden, oder sogar eine Methode, um lsof auszuführen, die die CPU nicht so deutlich belastet? (Obwohl ich davon ausgehe, dass die Fertigstellung dieser letzteren Methode wahrscheinlich viel länger dauern würde, als dies derzeit der Fall ist ... nicht ideal).

Vielleicht verwaltet der Kernel irgendwo eine Variable, die die Anzahl der geöffneten Dateien enthält? Wunschdenken?

Aktualisieren:

Als Antwort auf eine der Antworten verwenden wir bereits die Flags -bund -n. Hier ist der vollständige Befehl, unter dem ich ihn ausgeführt habe collectd:

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

Antworten:


12

Sie müssen die Netzwerkadressen für den Socket wahrscheinlich nicht auflösen, verwenden Sie also am wenigsten den -nSwitch. Dann möchten Sie vielleicht auch so Sperrvorgänge mit überspringen -b.

Diese 2 ersten Schalter sollten es wirklich schneller machen.

Und dann -l, um zu vermeiden, Uids aufzulösen. Und -Lum das Zählen von Links zu vermeiden. Usw. Siehe den Mann lsof .

Alternativ können Sie unter Linux ein Skript erstellen, um die Links einfach /proc/<PID>/fdwie folgt zu zählen :

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


Ich bekomme immer - find: /proc/{{number}}/fd/5': No such file or directory find: / proc / {{number}} / fdinfo / 5 ': Keine solche Datei oder kein solches Verzeichnis - F @ Benoît wie kann ich das vermeiden?
BG Bruno

2
@BrunoBG: Versuchen Sie:echo /proc/*/fd/* | wc -w
Olivier Dulac

Thx @OlivierDulac das war eine offensichtliche :-)
BG Bruno

gute Vorschläge, aber ich habe bereits die Optionen -n und -b verwendet .... Ich brauche weitere Vorschläge
Michael Martinez

1
@OlivierDulac funktioniert möglicherweise nicht, wenn Sie eine sehr große Anzahl von fd haben.
Benoît

5

Du machst es falsch.

Von man proc

   /proc/sys/fs/file-nr

Diese (schreibgeschützte) Datei enthält drei Nummern: die Anzahl der zugewiesenen Dateihandles (dh die Anzahl der derzeit geöffneten Dateien); die Anzahl der freien Dateihandles; und die maximale Anzahl von Dateihandles (dh derselbe Wert wie / proc / sys / fs / file-max). Wenn die Anzahl der zugewiesenen Dateihandles nahe am Maximum liegt, sollten Sie das Maximum erhöhen. Vor Linux 2.6 behandelte der Kernel die zugewiesenen Dateien dynamisch, gab sie jedoch nicht wieder frei. Stattdessen wurden die freien Datei-Handles zur Neuzuweisung in einer Liste gespeichert. Der Wert "freie Dateihandles" gibt die Größe dieser Liste an. Eine große Anzahl freier Dateihandles weist darauf hin, dass die Verwendung offener Dateihandles in der Vergangenheit einen Spitzenwert erreicht hat. Seit Linux 2.6 gibt der Kernel die Zuordnung von freigegebenen Dateihandles auf und "

Der erste Wert, wenn Sie eine Katze sind, die Ihnen genau das gibt, was Sie sind, nachdem es auftaucht.

Für die Aufzeichnung konnte ich nicht die lsofAusgabe erhalten, um sie sogar mit etwas Betrug zusammenzubringen, aber ich erfahre, wenn das ist, was der Kern sagt, ist es maßgeblicher als die Liste, die Sie lsofirgendwie von erhalten.


1
Hier ist mein lsof Ausgang: [root@ec2- cassandra101 ~]$ time lsof -b -n -w -l -L | stdbuf -i0 -o0 -e0 wc -l 1018065. Hier ist , was Datei-nr sagt: [root@ec2- cassandra101 ~]$ cat /proc/sys/fs/file-nr 2784 0 3093428. Die große Diskrepanz (1.000.000+ gegenüber 2784) ist auf die Tatsache zurückzuführen, dass lsofalle Elemente enthalten sind, denen kein Dateideskriptor zugeordnet ist: Bibliotheksdateien, ausführbare Dateien usw. Wenn Sie also nur an Dateideskriptoren interessiert sind, dann file-nrist der Weg zu gehen, sonst müssen Sie lsof oder gleichwertig.
Michael Martinez

Versuchen Sie es inode-nrstattdessen am selben Ort.
Matthew Ife
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.