Low-Memory-NAS: Nextcloud genügsam machen

Hallihallo!

Ich betreibe eine Nextcloud 15.x mit Debian auf einem QNAP TS-212, ein NAS mit MIPS-CPU und 248MB - fragt mich nicht, warum es keine 256MB sind, das sind halt die Angaben in htop.

Seit dem letzten Upgrade auf Debian Buster, das ich vor wenigen Tagen durchgeführt habe, ist der Speicherbedarf vom Apache2-Webserver und MariaDB geradezu explodiert. Wo früher ein wenig Luft im Hauptspeicher war und nur ein paar MB des swap-Bereichs belegt waren, ist der Hauptspeicher heute proppenvoll und ca. 500 MB (von 1GB) swap dicht - und das nur, wenn die Maschine idle ist, ich also nicht auf dem Nextcloud-Webinterface herumhantiere.

Laut Nextcloud liegen die minimalen Anforderungen an den Hauptspeicher bei 128MB, empfohlen werden 512. Meine Anforderungen an Nextcloud sind aber wirklich ausgesprochen gering - es gibt einen Nutzer mit 6 Kalendergruppen (die 4 Familienmitglieder, Ferien und Geburtstage) und 3 Adressbüchern. Die werden mit den Handys der Familienmitglieder synchronisiert. Das war’s - mehr verlange ich gar nicht.

Das NAS erfüllt natürlich noch andere Funktionen. Es fungiert als WLAN-Accesspoint (mitsamt DNS & DHCP mittels dnsmasq), sane-server, NFS-server und ein redis-server (warum auch immer?), aber die belegen alle nur Bruchteile des gesamten Speicherbedarfs.

Die 3 großen Klötze sind: Apache2, MariaDB (bzw. mysql) und hin und wieder nextcloud-cron.

Von Apache und MariaDB habe ich nur geringe Ahnung, deswegen bitte ich hier um Hilfe. Es muss doch möglich sein, - z.B. durch deaktivieren von bestimmten Apache-Modulen oder mittels diverser Konfigurationskniffe in den beiden Programmen in den angegebenen Minimalbereich zu kommen, der wieder in den Speicherplatz meines NAS passt…?

Falls mich da jemand unterstützen könnte? Linux-Konsolenkenntnisse sind vorhanden…

Wollte noch etwas ergänzen: Die Nextcloud nutze ich ausschließlich im LAN. Sie hat keine direkte Verbindung zum Internet. Von dem her fallen eventuell auch mehrere Sicherheitsmechanismen unter die potentielle Streichliste…

Okay, nach 3 Tagen Durchrödeln auf der Festplatte hat sich mein NAS beruhigt und funktioniert nun einwandfrei. Der Hauptspeicher wird nunmehr mit lediglich 70MB belastet, der swap mit ~80 MB. Damit ist nun wieder alles in Ordnung. Nichts desto trotz hätte ich es begrüßt, wenn das Update nicht so heftig ausgefallen wäre - immerhin hat das meine IT-Infrastruktur daheim über einen längeren Zeitraum lahm gelegt. Hinzu kommt, dass der verfügbare Speicher aus swap und RAM zwischenzeitlich - hauptsächlich durch Apache2 - komplett in Beschlag genommen wurde und ich auf journalctl -f nachverfolgen konnte, wie der Kernel sich genötigt sah, sich im Speicher durch gezielten Abschuss einiger Programme Platz zu verschaffen. Keine schöne Sache… Besser wäre gewesen, er hätte ein wenig länger gebraucht und dafür alles im RAM erledigt. So hatte ich das Gefühl, dass das NAS sich durch das Aufblähen von Apache2 und das Abschießen anderer Programme in eine Endlosschleife manövriert.

Zu früh gefreut. Gestern bekam ich eine Fehlermeldung von meinem Handy, dass es sich nicht mehr synchronisieren konnte. Ich habe das NAS neu gebootet und seither geht gar nichts mehr. Der Kernel meldet, dass er out-of-memory ist und schießt Prozesse ab. Das System kommt erst zur Ruhe, wenn entweder Apache2 oder MariaDB weg vom Fenster sind. Ich versuche gerade, die Nextcloud in den Maintenance-Mode zu bekommen. Das dauert nun schon 'ne gute Stunde - und wird wahrscheinlich dadurch, dass vorher einer von beiden Hauptprozessen beendet wird, auch abgebrochen.

Habe nun apache2 und mariaDB mittels “systemctl stop [name]” angehalten. Mich hat interessiert, ob die Datenbank überhaupt noch intakt ist. “mysqlcheck -c nextcloud” schreibt ein “OK” hinter jedes table. “mysqlcheck -o --all-databases” habe ich dann auch noch durchlaufen lassen - hat bei anderen Datenbanken funktioniert, aber die nextcloud-Sachen unterstützen die Art von Optimierung nicht. Wenn ich jetzt eine Blick auf htop werfe, dann ist der Speicher von MariaDB schon gut gefüllt. 80MB sind noch frei. Ich fürchte, ich komme beim Start von apache2 wieder in dieselben Probleme…

Laut den Bugs #16860 und #17447 (und etlichen mehr), gab’s wohl ein Problem im DAV-Modul. In meinem Fall darf man wohl spekulieren, dass die Kombination aus Nextcloud <16.0.7 und PHP >7.0 irgendwie ein Speicherleck produziert haben. Ich habe auf die neueste 16er-Version aktualisiert und jetzt konnte ich immerhin meinen Kalender auf den Handys aktualisieren, ohne, dass sie MariaDB und Apache2 ins Nirvana gerissen hätten.
So ganz rund läuft’s aber wohl immer noch nicht. Die Gefahr besteht nach wie vor, dass der kernel “out of memory” wittert und die beiden Dienste ins Nirvana befördert.

Ich hab’s!
Ich hatte einen Bug-Report erstellt:


Die Lösung kam prompt, wenn auch etwas kryptisch

Wer den ganzen Thread liest, kann nachvollziehen, was da genau passiert:

Kurz: Es geht wohl um eine default-Einstellung in PHP, die mehr für richtig dicke Maschinen geeignet ist…
Also: nextcloud/lib/private/Security/Hasher.phpmit Rasos Einstellungen abändern und schon ist alles wieder gut…

Ach, ja - und: Das muss man jetzt nach jedem Upgrade durchführen…
Es wurde zwar angekündigt, dass es eine Einstellungsoption geben soll - ich kann allerdings nur hoffen, dass die default-Einstellung eine Ressourcen-freundliche ist.