Layer 8Ehrlicher Tech-Support
BetriebssystemSchweregrad: LästigToo many open files

Linux: Too many open files

Ein Programm bricht mit „Too many open files“ ab. Es ist kein Speicherproblem, sondern ein Limit — und das lässt sich sauber und dauerhaft anheben.

Aufwand:
ca. 20 Min.

Das Symptom

Ein Server, eine Datenbank oder ein Skript läuft eine Weile normal und bricht dann mit der Meldung Too many open files ab. Oft passiert es unter Last, wenn viele Verbindungen gleichzeitig hereinkommen. Neustarten hilft kurz, dann kommt der Fehler wieder.

Die „Layer 8“-Wahrheit

In Linux ist fast alles eine Datei — auch jede offene Netzwerkverbindung und jede Pipe. Damit ein einzelnes außer Kontrolle geratenes Programm nicht das ganze System lahmlegt, darf jeder Prozess nur eine begrenzte Zahl solcher „Dateien“ gleichzeitig offen halten. Wird diese Grenze erreicht, verweigert der Kernel das Öffnen der nächsten — und genau das meldet dieser Fehler.

Die Versuchung ist groß, das Limit einfach hochzuschrauben. Manchmal ist das richtig, etwa bei einem gut ausgelasteten Webserver. Oft aber steckt ein Programmierfehler dahinter, dass ein Programm seine Verbindungen nicht schließt und Deskriptoren „leckt“ — dann verzögert ein höheres Limit den Absturz nur. Und eine Falle wartet zum Schluss: Für systemd-Dienste gilt die klassische limits.conf nicht; dort muss das Limit in die Unit selbst.

Die echte, verifizierte Lösung

1000 % faktenbasiert. Jeder Befehl ist real, jeder Pfad existiert. Schritt für Schritt:

  1. 1.

    Das aktuelle Limit ansehen

    Jeder Prozess darf nur eine begrenzte Zahl an Dateien gleichzeitig geöffnet halten — dazu zählen auch Netzwerkverbindungen. Das aktuelle weiche Limit der Sitzung zeigt:

    ulimit -n
    
  2. 2.

    Prüfen, wer die Deskriptoren hält

    Bevor man das Limit blind erhöht: Vielleicht schließt ein Programm seine Verbindungen nicht sauber (ein Deskriptor-Leck). Für einen laufenden Prozess lässt sich zählen, wie viele Dateien er offen hält:

    ls /proc/$(pgrep -n programm)/fd | wc -l
    
  3. 3.

    Das Limit für die Sitzung testweise anheben

    Für einen schnellen Test in der aktuellen Shell das weiche Limit hochsetzen. Der Schalter -S sorgt dafür, dass nur das weiche Limit geändert wird; ohne ihn setzt die Bash weiches und hartes Limit zugleich. Das gilt nur bis zum nächsten Abmelden und eignet sich zum Ausprobieren:

    ulimit -Sn 65535
    
  4. 4.

    Das Limit dauerhaft setzen

    Dauerhaft gehört die Grenze in die Konfiguration, für normale Anmeldungen in /etc/security/limits.conf. Vorher mit ulimit -Hn das harte Limit ansehen: Liegt es schon über dem gewünschten Wert, genügt die soft-Zeile. Eine hard-Zeile mit kleinerem Wert würde das harte Limit sonst senken:

    # hartes Limit ansehen:
    ulimit -Hn
    # in /etc/security/limits.conf:
    * soft nofile 65535
    # nur, wenn ulimit -Hn weniger als 65535 zeigt:
    * hard nofile 65535
    
  5. 5.

    Für systemd-Dienste gilt limits.conf nicht

    Wichtig: Dienste, die von systemd gestartet werden, ignorieren limits.conf. Dort gehört das Limit in die Unit-Datei (Abschnitt [Service]), danach systemctl daemon-reload und den Dienst neu starten. Vorher lohnt der Blick in die Handbuchseite systemd.exec(5): Sie rät von LimitNOFILE= ausdrücklich ab („Do not use.“), weil das harte Limit heute schon bei 524288 liegt und Programme ihr weiches Limit selbst bis dorthin anheben sollen. Ein einzelner Wert wie LimitNOFILE=65535 setzt weiches und hartes Limit gleich und senkt das harte damit sogar. Wer das weiche Limit trotzdem anheben muss, nimmt die Form weich:hart und lässt das harte stehen. Über 1024 nur, wenn das Programm kein select(2) benutzt, denn das funktioniert laut Handbuch nicht mit Deskriptoren über 1023:

    [Service]
    LimitNOFILE=65535:524288
    

Häufige Fragen (FAQ)

?Was zählt als offene Datei?

Mehr, als der Name vermuten lässt: Neben echten Dateien auch jede Netzwerkverbindung, jeder Socket und jede Pipe. Ein Server mit vielen gleichzeitigen Verbindungen erreicht das Limit deshalb, ohne eine einzige Datei im üblichen Sinn geöffnet zu haben.

?Ich habe das Limit in limits.conf erhöht, der Dienst scheitert trotzdem. Warum?

Weil limits.conf für Dienste unter systemd nicht gilt. Dort zählt LimitNOFILE= in der Unit-Datei, gefolgt von daemon-reload und einem Neustart des Dienstes – und zwar in der Form weich:hart, damit das harte Limit nicht unter die heutige Voreinstellung von 524288 sinkt. Das ist eine typische Falle bei diesem Fehler – die Einstellung wirkt, nur eben nicht dort, wo man sie gemacht hat.

Belege

Diese Seite ist gegen die folgenden Primärquellen geprüft – Hersteller, Standard oder Gesetzestext. Wer es nicht glaubt, muss es nicht: Da steht, wo es nachzulesen ist.

Zuletzt geprüft am . Dokumentation altert – ein Datum daneben ist der einzige ehrliche Umgang damit.

Auch zu finden unter

Verwandte Fehler

OSLästigOut of memory: Killed process

Linux: Prozess wurde vom OOM-Killer beendet

Ein Dienst verschwindet ohne Absturzmeldung? Bei Speichermangel beendet der Kernel selbst Prozesse. Das Protokoll verrät, wen es traf und warum.

OSLästigUnit is masked

systemctl: Unit is masked

systemctl startet den Dienst nicht: 'Unit is masked'. Die Unit ist auf /dev/null verlinkt. So machst du sie mit unmask wieder startbar.