Zu viele offene Dateien - wie finde ich den Täter?

69

Beim Laufen tail -f filenamebekam ich folgende Meldung:

tail: inotify cannot be used, reverting to polling: Too many open files

Ist das ein potentielles Problem?

Wie diagnostiziere ich, was für alle geöffneten Dateien verantwortlich ist? Ich habe eine Liste mit verdächtigen Prozessen, aber wenn sich herausstellt, dass sie nicht die Schuldigen sind, sind Anweisungen, die nicht darauf beruhen, zu wissen, welcher Prozess zu überprüfen ist, nützlich.

Andrew Grimm
quelle
1
Haben Sie die Anzahl der über verfügbaren Dateideskriptoren erhöht ulimit?
Ignacio Vazquez-Abrams
2
@ IgnacioVazquez-Abrams Das mag für andere Benutzer hilfreich sein, aber für mich würde es sich anfühlen, das Symptom und nicht die Krankheit zu behandeln.
Andrew Grimm
Während Sie sich nicht irren, haben Apps manchmal legitime Gründe dafür, dass viele Dateien geöffnet sind.
Ignacio Vazquez-Abrams

Antworten:

72

Sie können lsof verwenden, um zu verstehen, wer so viele Dateien öffnet. Normalerweise ist es ein (Web-) Server, der so viele Dateien öffnet, aber lsof hilft Ihnen sicherlich dabei, die Ursache zu identifizieren.

Sobald Sie verstehen, wer der Bösewicht ist, können Sie

Wenn die Ausgabe von lsof sehr umfangreich ist, leiten Sie sie in eine Datei um und öffnen Sie die Datei

Beispiel (möglicherweise müssen Sie Ctrl+ Cden ersten Befehl eingeben)

lsof > ~/Desktop/lsof.log
cat ~/Desktop/lsof.log | awk '{ print $2 " " $1; }' | sort -rn | uniq -c | sort -rn | head -20
vim ~/Desktop/lsof.log
Andrea Olivato
quelle
37
Für die Faulen:lsof | awk '{ print $2; }' | uniq -c | sort -rn | head
Itsadok
1
Ich habe den gleichen Fehler erhalten und ulimit funktioniert nicht. Der Befehl tail -F gibt weiterhin den Fehler zurück. Ich habe das Limit von 1024 auf 3000 erhöht, damit ich mir vorstellen kann, dass ich bis dahin genug Platz habe ... Ich denke, ich müsste neu starten!
Alexis Wilke
15
Ich fand die Zeile von itsadok hilfreich, aber ich denke, Sie sollten zuerst sortieren (da uniqnur mit benachbarten Zeilen funktioniert), uniq ausführen und dann erneut sortieren. Also lsof | awk '{ print $2; }' | sort -rn | uniq -c | sort -rn | head.
Tyler Collier
19
Das Sortieren und Zählen der meisten geöffneten Dateien ist definitiv das Beste. Prozessnamen und pid anzeigen: '' 'lsof | awk '{print $ 2 "" $ 1; } '| sort -rn | uniq -c | sort -rn | head -20 '' '
gaoithe
2
@gaoithe, wenn Sie das in eine Antwort setzen, werde ich es gerne befürworten:)
Matt Ball
23

Für den Fall, dass jemand anderes es braucht ...

ulimit -a

Zeigt alle aktuellen Grenzwerte an. Speziell ulimit -n 70000wird das Dateideskriptorlimit festgelegt.

Ebenfalls...

cat /proc/sys/fs/file-max

Zeigt / setzt das Kernel-Limit, wenn es bearbeitet wird.

sudo echo 200000 > /proc/sys/fs/file-max

Eine ausführlichere Erklärung finden Sie unter ...

Wie erhöhe ich das Limit für geöffnete Dateien für einen Benutzer ohne Rootberechtigung?

kervin
quelle
3
ulimits gibt es, damit Sie die Ressourcennutzung in Ihrem System genau kontrollieren können. Es ist am besten, sie für Prozesse, von denen Sie wissen, dass sie viele Dateideskriptoren verwenden müssen, einzeln zu erhöhen. Wenn Sie sie beim Testen eng halten, finden Sie Prozesse, bei denen im Laufe der Zeit möglicherweise Dateideskriptoren verloren gehen. Beachten Sie auch, dass Dateihandles für jeden Gerätezugriff unter Unix / Linux verwendet werden. Beispielsweise verwendet jeder von einem Prozess geöffnete Netzwerk-Socket ein Datei-Handle. Das erklärt, warum Sie bei normalen Dateisystemdateien sowie bei Gerätedateien wie Netzwerkverbindungen die Option "zu viele offene Dateien" auswählen können.
Gaoithe