Garbage collection blockiert wegen vollem ZFS storage

Apr 25, 2024
30
5
13
Hi,
ich habe einen pbs mit einer 250 GB System-SSD und einer 2 TB ZFS Storage mit 2 SSDs im mirror-Modus. Die ZFS Storage ist "vollgelaufen", ich konnte zwar ältere Backups "prunen", aber die garbage collection lief nicht mehr, so dass kein Speicherplatz freigegeben wurde und keine weiteren Backups mehr möglich waren; ich löschte die Storage schließlich und legte sie neu an. Jetzt geht wieder alles!

Wie meine Recherchen innerhalb und außerhalb des Forums ergeben hatten, ist das Problem bekannt, aber es gibt keine einfach Lösung. Die garbage collection braucht "etwas" freien Platz auf der storage, wenn der nicht vorhanden ist, gibt es keinen einfachen Weg, den wieder frei zu machen.

Meine Frage ist nun: wie kann ich (außer durch strengeres prunen) verhindern, dass das in Zukunft wieder passiert? Gibt es eine Möglichkeit, Speicherplatz für die garbage collection auf der ZFS storage zu "reservieren", z.B, indem man dorthin ein paar dummy-Files kopiert, die man dann ggf. manuell löschen kann? Gibt es einen Warnmechanismus? Kann die garbage collection irgendwie Speicherplatz auf einer anderen Platte, z.B. der Systemplatte, verwenden? Oder gibt es eine noch bessere Lösung?
 
 
  • Like
Reactions: UdoB
Vielen Dank für die schnelle Hilfe!

Ich werde, wenn das Problem nochmal auftritt, den spa_slop_shift von 5 auf 6 hochsetzen; dass müsste dann (bei 2 TB Speicher) etwa 32 GB freisetzen, was hoffentlich ausreicht. Braucht es dann nach dem Ändern des Parameters einen Neustart?

Die andere beschriebene Methode mit der Reservierung eines Reserve ZFS pools hätte ich wahrscheinlich VOR Neuanlage des "Haupt"-ZFS-pools machen müssen, weil jetzt ja kein Speicherplatz auf den SSDs mehr frei ist. Deswegen lasse ich das jetzt. Falls ich das gemacht hätte: wäre der Reserve-Pool dann "automatisch" von der garbage collection genutzt worden, oder hätte ich den reservierten Speicher "irgendwie" dem Haupt-ZFS-pool zuschlagen müssen?
 
Nun ich lege mir eine ein zfs dataset mit dem Namen Quota an.
Das reserviert mir bei allen meinen System etwas Speicher für "notfälle" und Operationen "am offenen Herzen".
Code:
zfs create rpool/quota
zfs get refreservation rpool/quota
zfs set refreservation=<size> rpool/quota
Z.B. 15% der maximalen ZFS Poolgröße. bei 1000G wären das dann 150G für das Quota.

Und nein das ist "mein" setup und für einen Notfall, und man muss selbst genau wissen, was man mit seinem ZFS Pool macht und was nicht.

Z.B. kann man sich tempörär 100G freimachen, in dem man neu setzt, mit einem um 100G kleineren Wert.
Code:
zfs set refreservation=<size> rpool/quota
 
Falls ich das gemacht hätte: wäre der Reserve-Pool dann "automatisch" von der garbage collection genutzt worden, oder hätte ich den reservierten Speicher "irgendwie" dem Haupt-ZFS-pool zuschlagen müssen?
Nein. PBS weiß davon ja nichts. Du kannst im Notfall entweder die Reserve verringern oder die Reserve ganz löschen. Vielleicht sollte ich das dort ebenfalls dokumentieren.
 
Last edited:
Nun ich lege mir eine ein zfs dataset mit dem Namen Quota an.
Das reserviert mir bei allen meinen System etwas Speicher für "notfälle" und Operationen "am offenen Herzen".
Code:
zfs create rpool/quota
zfs get refreservation rpool/quota
zfs set refreservation=<size> rpool/quota
Z.B. 15% der maximalen ZFS Poolgröße. bei 1000G wären das dann 150G für das Quota.
Lustige Idee.

Wie meine Recherchen innerhalb und außerhalb des Forums ergeben hatten, ist das Problem bekannt, aber es gibt keine einfach Lösung.
Quota finde ich schon ne gute Lösung. Meine PBS-Pools haben immer nur einen guten kleineren Teil des gesamten Pools als Quota, sodass ich hier dynamisch reagieren kann. Macht m.E.n. keinen Sinn, dass ein einzelnes dataset den kompletten Pool lahmlegen kann. Quota willst du eigentlich immer haben inkl. refreservation.
 
  • Like
Reactions: Johannes S
Lustige Idee.


Quota finde ich schon ne gute Lösung. Meine PBS-Pools haben immer nur einen guten kleineren Teil des gesamten Pools als Quota, sodass ich hier dynamisch reagieren kann. Macht m.E.n. keinen Sinn, dass ein einzelnes dataset den kompletten Pool lahmlegen kann. Quota willst du eigentlich immer haben inkl. refreservation.
Jep das ist für das gesamte System von Vorteil. Immer ist etwas Platz da.
Lokal für jedes ZFS Dataset geht das natürlich auch.
 
Last edited:
  • Like
Reactions: Johannes S
Hi,
ich habe einen pbs mit einer 250 GB System-SSD und einer 2 TB ZFS Storage mit 2 SSDs im mirror-Modus. Die ZFS Storage ist "vollgelaufen", ich konnte zwar ältere Backups "prunen", aber die garbage collection lief nicht mehr, so dass kein Speicherplatz freigegeben wurde und keine weiteren Backups mehr möglich waren; ich löschte die Storage schließlich und legte sie neu an. Jetzt geht wieder alles!

Wie meine Recherchen innerhalb und außerhalb des Forums ergeben hatten, ist das Problem bekannt, aber es gibt keine einfach Lösung. Die garbage collection braucht "etwas" freien Platz auf der storage, wenn der nicht vorhanden ist, gibt es keinen einfachen Weg, den wieder frei zu machen.

Meine Frage ist nun: wie kann ich (außer durch strengeres prunen) verhindern, dass das in Zukunft wieder passiert? Gibt es eine Möglichkeit, Speicherplatz für die garbage collection auf der ZFS storage zu "reservieren", z.B, indem man dorthin ein paar dummy-Files kopiert, die man dann ggf. manuell löschen kann? Gibt es einen Warnmechanismus? Kann die garbage collection irgendwie Speicherplatz auf einer anderen Platte, z.B. der Systemplatte, verwenden? Oder gibt es eine noch bessere Lösung?
Am besten immer mit Quota arbeiten.
Der GC kann nicht laufen, da ZFS zum löschen auch Metadaten schreiben muss, braucht man selbst zum löschen erst einmal ein wenig Platz.

Falls das trotzdem noch einmal passiert gibt es eine einfach Lösung, natürlich ohne Garantie, aber musste ich leider schon öfters anwenden, wenn sich jemand mit einem vollen Datastore an mich gewendet hat.
Einfach einen oder zwei Chunk Ordner auf eine andere Disk moven, dann gewinnst du tatsächlich etwas Platz. Dann den GC einmal laufen lassen, vorsich es gibt massiv Fehlermeldungen wegen Missing Chunks. Danach die Chunk Ordner zurück verschieben und dann am besten noch einmal einen Verify laufen lassen.
Machst du einen kleinen Fehler sind die Backups weg, daher keine Garantie.