Behebung des Matrix Synapse-Fehlers „Zu viele offene Dateien“ unter systemd

Matrix Synapse kann normal starten und dann keine Verbindungen mehr annehmen, die Meldung „Zu viele offene Dateien“ ausgeben oder unter Last scheinbar hängen bleiben. Bei einer systemd-Installation sollte zunächst das vom laufenden Synapse-Prozess geerbte Dateideskriptorlimit überprüft werden. Änderungen an der Shell ulimitoder der PAM-Datei haben in der Regel keinen Einfluss auf das Limit eines von systemd gestarteten Dienstes.

Die folgenden Schritte gelten für einen Linux-Host, auf dem Synapse als systemd-Dienst ausgeführt wird. Die Unit kann beispielsweise `synapse.com`, `synapse.com` oder einen paketspezifischen Namen tragen matrix-synapse.service. matrix-synapse@.serviceÜberprüfen Sie die tatsächliche Unit, bevor Sie die Befehle kopieren. Falls Synapse in Docker, Kubernetes oder einem anderen Container ausgeführt wird, lesen Sie bitte den separaten Abschnitt weiter unten.

Was bedeutet „Zu viele geöffnete Dateien“?

Linux begrenzt die Anzahl offener Dateideskriptoren pro Prozess. Ein Deskriptor kann auf eine Datei, einen Socket, eine Pipe oder eine andere Ressource verweisen; Netzwerkverbindungen verbrauchen daher ebenfalls Deskriptoren. Erreicht ein Prozess sein Limit, kann der Versuch, einen weiteren Deskriptor zu öffnen oder zu akzeptieren, fehlschlagen EMFILE. Linux verfügt außerdem über ein separates systemweites Limit für die Dateitabelle: Eine Erschöpfung dieses Limits kann ebenfalls zu einem Fehler führen ENFILE. Die Erhöhung des Limits eines einzelnen Synapse-Dienstes behebt einen systemweiten Mangel nicht.

Die offiziellen Administrations-FAQs von Synapse weisen darauf hin, dass hohe Verbindungs- und Föderationsaktivität viele Dateihandles belegen kann und dass eine Erschöpfung dazu führen kann, dass der Server keine neuen TCP-Verbindungen mehr annimmt. In den Richtlinien wird empfohlen, das Limit auf mindestens 4.096 zu erhöhen, da ältere Standardwerte wie 1.024 oder 256 üblich sind. Dieser Wert dient als Mindestanforderung zur Fehlerbehebung in der beschriebenen Situation und ist keine allgemeingültige Kapazitätsempfehlung für jeden Heimserver. Überprüfen Sie zunächst das effektive Limit und die tatsächliche Nutzung.

Die Dokumentation zu den Linux-Befehlen `getrlimit` und `prlimit` beschreibt die prozessspezifischen Soft- und Hardlimits. Auch Synapse bietet eine soft_file_limitentsprechende Einstellung; die Synapse-Konfigurationsreferenz gibt als Standardwert Null an, dass Synapse das Softlimit auf das maximal verwendbare Hardlimit setzt.

1. Prüfen Sie das Gerät und diagnostizieren Sie den Fehler.

Ermitteln Sie zunächst den tatsächlichen Dienstnamen. Bei vielen Paketinstallationen lautet er matrix-synapse.service, aber gehen Sie nicht von diesem Namen aus, wenn Ihre Installation eine benutzerdefinierte Einheit oder Worker verwendet.

systemctl list-units --type=service --all | grep -i synapse
systemctl status matrix-synapse.service --no-pager
journalctl -u matrix-synapse.service --since "30 minutes ago" --no-pager

Suchen Sie nach der genauen Fehlerursache, dem Zeitpunkt ihres Auftretens und ob sie während einer Lastspitze, bei Aktivitäten des Verbundsystems oder nach einem Neustart auftritt. Überprüfen Sie anschließend den von systemd aktuell gemeldeten Grenzwert:

systemctl show matrix-synapse.service -p LimitNOFILE -p MainPID

LimitNOFILEZeigt das vom Dienstmanager konfigurierte Limit an; es handelt sich nicht um die Anzahl der aktuell geöffneten Deskriptoren. Ein Shell-Befehl wie dieser ulimit -nmeldet lediglich das Limit der aktuellen Shell und ist kein Beweis für das Limit des Dienstes.

2. Erhöhen Sie das systemd-Dienstlimit mit einem Drop-in

Verwenden Sie ein systemd-Drop-in, damit Paketaktualisierungen keine Bearbeitung der Vendor-Unit-Datei erfordern. Der folgende Wert ist ein Beispiel und keine Garantie für optimale Leistung auf jedem Server. Wählen Sie einen Grenzwert, der über der beobachteten Spitzenlast liegt, und prüfen Sie die Kompatibilität von Anwendung und Abhängigkeiten, bevor Sie einen ungewöhnlich hohen Wert festlegen.

sudo systemctl edit matrix-synapse.service

Fügen Sie dies unter dem neuen Drop-in des Editors hinzu:

[Service]
LimitNOFILE=65536

Speichern und beenden, anschließend systemd neu laden und Synapse während eines geeigneten Wartungsfensters neu starten:

sudo systemctl daemon-reload
sudo systemctl restart matrix-synapse.service
systemctl show matrix-synapse.service -p LimitNOFILE

Ein einzelner LimitNOFILEWert legt sowohl die weiche als auch die harte Grenze für den Dienst in systemd fest. Das systemd-Handbuch erlaubt auch ein soft:hardPaar. Die weiche Grenze darf die harte Grenze nicht überschreiten. Bevor Sie einen sehr hohen Wert wählen, lesen Sie die Dokumentation zu systemd.exec , die auf Kompatibilitätsprobleme für Programme hinweist, die die alte select(2)Schnittstelle mit Deskriptoren über 1023 verwenden. Gehen Sie nicht davon aus, dass jede Bibliothek oder jedes Plugin in Ihrer Umgebung jede beliebige Grenze unterstützt.

3. Überprüfen Sie die Synapse-eigenen Einstellungen und Worker-Dienste.

Wenn Ihre Synapse-Konfiguration explizit soft_file_limiteinen niedrigen Wert festlegt, kann die Anwendungseinstellung den Soft Limit unter dem systemd-Limit halten. Suchen Sie in den aktiven Konfigurationsdateien und der zugehörigen Konfiguration nach diesem Schlüssel. Entfernen Sie entweder eine unnötige Überschreibung oder setzen Sie den Wert bewusst; der dokumentierte Standardwert Null weist Synapse an, den Soft Limit auf das verfügbare Hard Limit anzuheben.

Bei einer Bereitstellung mit mehreren Prozessen ist jeder Worker ein separater Prozess und kann von einer separaten Unit oder Template-Instanz gestartet werden. Die Erhöhung des Limits des Hauptdienstes beweist nicht automatisch, dass jeder Worker das vorgesehene Limit hat. Überprüfen Sie die tatsächlichen Worker-Unit-Namen systemctl list-unitsund wenden Sie anschließend das entsprechende Drop-in für jeden Dienst an, der es benötigt.

Ebenso wenig regeln Einstellungen in /etc/security/limits.confder Login-Shell ulimitim Allgemeinen einen Systemdienst, der direkt von systemd gestartet wird. Ändern Sie in diesem Fall das Ressourcenlimit der Unit und überprüfen Sie es für den Prozess, der tatsächlich von systemd gestartet wurde.

4. Wenn Synapse in einem Container ausgeführt wird

Eine systemd-Überschreibung auf Hostebene für einen anderen Dienst ändert nicht automatisch das Dateideskriptorlimit eines Containers. Konfigurieren Sie die Container-Laufzeitumgebung oder die Orchestrierungsschicht. Bei Docker Compose unterstützt die Dienstdefinition die Konfiguration pro Container ulimits; ein Beispiel:

services:
  synapse:
    ulimits:
      nofile:
        soft: 65536
        hard: 65536

Die Zahl dient nur zur Veranschaulichung; die Größe sollte anhand der Nutzung und der Limits des Hosts angepasst werden. Die Compose-Servicereferenz von Docker beschreibt die ulimitsEinstellung. Ab Docker Engine 29 beschreiben die Versionshinweise von Docker eine Änderung des Standard-nofile-Limits in Verbindung mit containerd 2.1.5: Container erhalten nun 1.024 statt der bisherigen 1.048.576. Falls das Problem nach einem Engine-Upgrade auftritt, überprüfen Sie das effektive Containerlimit und legen Sie das benötigte ulimit explizit in der Bereitstellungskonfiguration fest. Weitere Informationen finden Sie in den Versionshinweisen zu Docker Engine 29 und in der Docker-Run-Referenz .

5. Überprüfen Sie das Limit des laufenden Synapse-Prozesses.

Überprüfen Sie nach dem Neustart die Prozesslimits, nicht nur die Konfiguration von systemd. Ermitteln Sie die Haupt-PID und prüfen Sie die vom Kernel gemeldeten Limits:

PID=$(systemctl show --property=MainPID --value matrix-synapse.service)
grep "Max open files" "/proc/$PID/limits"
find "/proc/$PID/fd" -mindepth 1 -maxdepth 1 | wc -l

Wenn die Haupt-PID null ist oder zu einem Wrapper anstatt zu Synapse gehört, identifizieren Sie den Synapse-Prozess in der Cgroup des Dienstes und überprüfen Sie stattdessen dessen PID. Die Deskriptoranzahl ist eine Momentaufnahme; wiederholen Sie die Messung unter repräsentativer Last. Stellen Sie sicher, dass „Maximale Anzahl offener Dateien“ Ihren beabsichtigten Soft- und Hardlimits entspricht, die Anzahl deutlich unter dem Softlimit bleibt und der Fehler im Journal nicht mehr gemeldet wird.

Steigt die Anzahl der Anfragen weiter an, bis der neue Grenzwert erreicht ist, verzögert das Limit möglicherweise nur den Fehler. In den Synapse-FAQs wird darauf hingewiesen, dass hängende oder langsame Anfragen bei der Untersuchung von Dateihandle-Erschöpfung relevant sein können. Überprüfen Sie die zugehörigen Protokolle und die Anfrageverarbeitung, vergleichen Sie die Anzahl der Deskriptoren im Zeitverlauf und untersuchen Sie mögliche Speicherlecks oder unerwartet persistente Verbindungen, anstatt das Limit blindlings weiter zu erhöhen.

Wenn eine Erhöhung des Limits pro Dienstleistung nicht ausreicht

Wenn Protokolle einen systemweiten Dateitabellen-Erschöpfungsfehler melden ENFILE, überprüfen Sie die Nutzung auf dem gesamten Host und bei anderen Diensten. Eine Änderung pro Dienst LimitNOFILEerhöht die systemweite Kernelkapazität nicht. Vermeiden Sie Änderungen an globalen Kernelgrenzen, ohne den Fehler zu bestätigen und die Auswirkungen auf den gesamten Host zu verstehen. Wenn die gemeldete Grenze des Dienstes nach dem Laden einer neuen Einheit weiterhin niedrig ist, führen Sie `systemd install` aus, systemctl cat matrix-synapse.serviceum zu bestätigen, dass die neue Einheit geladen wurde, überprüfen Sie den Namen der Einheit, laden Sie systemd neu und starten Sie die richtige Einheit neu.

Schneller Selbsttest

  • Konnten Sie die genaue Synapse-Einheit oder den Container identifizieren, der den Fehler protokolliert?
  • Wird systemctl showder vorgesehene Grenzwert für diese Einheit gemeldet?
  • Werden /proc/<Synapse-PID>/limitsnach dem Neustart die vorgesehenen Soft- und Hard-Limits angezeigt?
  • Liegt die Anzahl der Deskriptoren unter dem weichen Grenzwert bei normaler Spitzenlast?
  • Werden die Einstellungen für Arbeitseinheiten und Container gegebenenfalls separat geprüft?
  • Ist der Fehler behoben oder steigt die Nutzung weiter in Richtung des neuen Höchstwertes?

Wenn alle Prozessprüfungen erfolgreich sind und der Fehler im repräsentativen Datenverkehr nicht mehr auftritt, funktioniert die Änderung des systemd-Limits. Falls sich weiterhin Deskriptoren ansammeln oder das System einen globalen Mangel meldet, sollten Sie die Ursache weiter untersuchen, anstatt ein höheres Limit als endgültige Lösung zu betrachten.

Quellen

Einen Kommentar hinterlassen

Hohe CPU-Auslastung in Jitsi Meet auf Client-Browsern beheben

Hohe CPU-Auslastung in Jitsi Meet auf Client-Browsern beheben

Diagnostizieren Sie CPU-Spitzen im Jitsi Meet-Browser und reduzieren Sie die Clientlast, indem Sie Videokacheln, Kameraeffekte, Browsergrafiken und Host-Einstellungen überprüfen.

Wie man Jitsi Videobridge-Metriken mit Prometheus und Grafana überwacht

Wie man Jitsi Videobridge-Metriken mit Prometheus und Grafana überwacht

Verfolgen Sie den Status von Jitsi Videobridge, die Konferenzlast und den Datenverkehr mit dem integrierten Prometheus-Endpunkt und analysieren und visualisieren Sie die Daten anschließend in Grafana.

So konfigurieren Sie einen benutzerdefinierten Domänennamen für Jitsi Meet Docker

So konfigurieren Sie einen benutzerdefinierten Domänennamen für Jitsi Meet Docker

Konfigurieren Sie eine benutzerdefinierte Domain für Jitsi Meet Docker mit DNS, PUBLIC_URL, HTTPS, Let's Encrypt, Firewall-Ports, NAT-Einstellungen und Ende-zu-Ende-Verifizierung.

Behebung des Zimbra-Administrationskonsolenfehlers 404 (Nicht gefunden) nach SSL-Erneuerung

Behebung des Zimbra-Administrationskonsolenfehlers 404 (Nicht gefunden) nach SSL-Erneuerung

Beheben Sie 404-Fehler in der Zimbra-Administrationskonsole nach der SSL-Erneuerung, indem Sie die korrekte URL und den Port, das Proxy-Routing, den Dienststatus, die bereitgestellten Zertifikate und die Protokolle überprüfen.

Nextcloud-Warnung „Der PHP OPcache ist nicht ordnungsgemäß konfiguriert“ beheben

Nextcloud-Warnung „Der PHP OPcache ist nicht ordnungsgemäß konfiguriert“ beheben

Erfahren Sie, wie Sie die PHP OPcache-Konfigurationswarnung von Nextcloud diagnostizieren und beheben können, indem Sie die aktive PHP SAPI, Größenbeschränkungen, Kommentare und Revalidierungseinstellungen überprüfen.

Behebung von Kopano-Datenbankmigrationsfehlern nach einem MySQL-Versionsupgrade

Behebung von Kopano-Datenbankmigrationsfehlern nach einem MySQL-Versionsupgrade

Beheben Sie Probleme bei der Migration der Kopano-Datenbank nach einem MySQL- oder MariaDB-Upgrade, indem Sie Backups, Serverversionen, SQL-Modi, Zeichensatz, Schemastatus und Protokolle überprüfen.

So konfigurieren Sie die LDAP- und Active Directory-Authentifizierung in Nextcloud

So konfigurieren Sie die LDAP- und Active Directory-Authentifizierung in Nextcloud

Verbinden Sie Nextcloud mit LDAP oder Active Directory über sichere Transportwege, Benutzer- und Gruppenfilter, Anmeldeattribute und einen getesteten Rollout.

Android-Benachrichtigungen ohne Google-Dienste reparieren: UnifiedPush-Anleitung

Android-Benachrichtigungen ohne Google-Dienste reparieren: UnifiedPush-Anleitung

Beheben Sie Probleme mit Element-Android-Benachrichtigungen auf Google-freien Telefonen durch die Konfiguration von UnifiedPush, Android-Berechtigungen, Akkueinstellungen und zuverlässigen Verifizierungstests.

Beheben Sie die Nextcloud-Warnung „Datenbank enthält nicht alle Indizes“.

Beheben Sie die Nextcloud-Warnung „Datenbank enthält nicht alle Indizes“.

Die Warnung bezüglich fehlender Datenbankindizes in Nextcloud lässt sich mit dem offiziellen Befehl `occ` beheben. Sichern Sie Ihre Daten vorher, überprüfen Sie die Änderungen in der Vorschau, führen Sie die Reparatur durch und prüfen Sie das Ergebnis.

So konfigurieren Sie Single Sign-On (SSO) mit Keycloak in Element Web

So konfigurieren Sie Single Sign-On (SSO) mit Keycloak in Element Web

Konfigurieren Sie Keycloak SSO für Element Web, indem Sie OIDC mit Synapse verbinden, die genaue Callback-URL festlegen, Benutzeransprüche zuordnen und den Logout testen.