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?