Kurzanleitungen/Howtos

Syncthing-Probleme und wie man sie beheben kann

11.04.2019

Synchronisieren

Die Software Syncthing synchronisiert (im besten Fall) unauffällig im Hintergrund Dateien zwischen mehreren Standorten. Um die Analyse un Behebung von zwei Problemen (wiederkehrende Syncthing-Abstürze nach kurzer Zeit und erreichtes Offene-Dateien-Limit) soll es in dieser Kurzanleitung gehen.

Ausführen und Ausgabe lesen

Normalweise wird Syncthing per systemd gestartet. Um die Fehleranalyse zu vereinfachen, sollte man das (wiederholte Neu-)Starten allerdings temporär stoppen:

systemctl stop Syncthing@<Syncthing-Benutzer>
Nun kann Syncthing per Hand (ohne systemd) als der Benutzer ausgeführt werden, unter dem es normalerweise ausgeführt wird:
/usr/bin/Syncthing -no-browser -no-restart -logflags=0
Die Status- und Fehlermeldungen erscheinen nun direkt in der Konsole.

Wiederkehrende Syncthing-Abstürze: Datenbank neu anlegen

Wenn Syncthing innerhalb von wenigen Minuten immer wieder abstürzt, kann es an einer fehlerhaften Datenbank liegen. Hinweise darauf können sein:

  • In der Weboberfläche steht ein niedriger Minutenwert unter "Betriebszeit".
  • Die Weboberfläche ist immer wieder kurz nicht verfügbar oder weist mit einer Fehlermeldung auf Probleme hin.
  • Im "syslog" stehen Einträge, die einen Neustart von Syncthing festhalten:
    grep -i Syncthing /var/log/syslog | grep restart
  • Sollte dieses Fehlverhalten vorliegen, so kann man versuchen, die Datenbank mit Informationen zu allen geteilten Dateien (als Syncthing-Benutzer) neu zu erstellen:
    /usr/bin/Syncthing -reset-database
    Die Neuerstellung kann je nach Dateimenge mehrere Stunden dauern.

    Offene-Dateien-Limit erhöhen

    Weist Syncthing in der Weboberfläche darauf hin, daß das Limit für geöffnete Dateien erreicht ist, so kann dies zu Verbindungsabbrüchen führen. Vereinfacht ausgedrückt gibt es zwei Limits, wovon das eine die Anzahl von geöffnete Dateien für das ganze System und das andere für jeden Prozeß festlegen. Für Syncthing ist der zweite entscheidend, wobei der erstere natürlich darüberliegen sollte. Die Anzahl von geöffnete Dateien für das ganze System ermittelt man folgendermaßen:

    ulimit -Hn
    Für Syncthing kann der Prozeß-Wert (in der Zeile mit "Max open files") beim Ausführen des folgenden Befehls anbgefragt werden:
    cat /proc/$(ps -A | grep Syncthing | awk '{print($1)}')/limits
    Um den maximal erlaubten Prozeß-Wert herauszufinden, kann man sich mit folgendem Befehl (hier testweise z.B. auf 65536) herantasten:
    prlimit -n65536 -p $(ps -A | grep Syncthing | awk '{print($1)}')
    Hinweise: Auf einem Raspbian Stretch lag dieser bei 1048576.

    Ähnlich geht man beim Systemwert vor (hier testweise z.B. 131072):

    sysctl -w fs.inotify.max_user_watches=131072
    sysctl -w fs.file-max=131072
    Zum dauerhaften Speichern der Werte (Variablenwerte "GLOBAL_MAX_FILES" und "PROCESS_MAX_FILES" ggf. anpassen) werden diese mit folgendem Skript an den richtigen Stellen im System verankert:
    GLOBAL_MAX_FILES=1048576
    PROCESS_MAX_FILES=65536
    
    sed -i -e '/fs.inotify.max_user_watches/d' -e '/fs.file-max/d' /etc/sysctl.conf
    
    echo "
    fs.inotify.max_user_watches=$GLOBAL_MAX_FILES
    fs.file-max=$GLOBAL_MAX_FILES
    " >> /etc/sysctl.conf
    
    for f in /etc/systemd/system.conf /etc/systemd/user.conf
    do
    	sed -i '/DefaultLimitNOFILE/d' "$f"
    	echo "DefaultLimitNOFILE=$PROCESS_MAX_FILES" >> "$f"
    done
    Nach einem Systemneustart sollten die beiden Limits korrekt gesetzt sein.

Achtung! Achtung! Die folgenden Anweisungen richten sich ausschließlich an fachkundige Personen. Bei jedem Schritt kann es zum kompletten Datenverlust kommen. Alle Angaben ohne Gewähr! Die Anweisungen, Skripte, etc. sind ausschließlich für Lernzwecke auf Lernsystemen und nicht für Produktivumgebungen bestimmt!