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 lsof
darunter 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 -b
und -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
/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?echo /proc/*/fd/* | wc -w
Du machst es falsch.
Von
man proc
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
lsof
Ausgabe 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 Sielsof
irgendwie von erhalten.quelle
[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, dasslsof
alle Elemente enthalten sind, denen kein Dateideskriptor zugeordnet ist: Bibliotheksdateien, ausführbare Dateien usw. Wenn Sie also nur an Dateideskriptoren interessiert sind, dannfile-nr
ist der Weg zu gehen, sonst müssen Sie lsof oder gleichwertig.inode-nr
stattdessen am selben Ort.