[TUTORIAL] Protect a PBS datastore on ZFS, so that it does not become completely full

mariol

Proxmox Staff Member
Staff member
Jul 2, 2024
313
102
53
Wien
proxmox.com
Sometimes it can happen, a ZFS pool become 100% full. Since ZFS is a COW (Copy-on-Write FS), it is very difficult to remove data from it because at least enough space must be free to write a timestamp.

To prevent this from happening, you can create a dataset and reserve some storage space (~20 GB). This allows you simply to delete the dataset in the worst case.

Code:
zfs create  <poolname>/reserve
zfs set refreservation=20G reservation=20G  <poolname>/reserve

Delete the dataset in the worst case:
Code:
zfs destroy  <poolname>/reserve
 
I use zfs create -o reservation=100G pool/.reserved-space and also monitor the space usage.
If you have an emergency, as in the space is full, and forgot to do that before then temporarily altering spa_slop_shift might help.
For example
Bash:
# Shows current value. Default is 5
cat /sys/module/zfs/parameters/spa_slop_shift

echo 6 > /sys/module/zfs/parameters/spa_slop_shift
Increase the value if needed. Make sure to revert this to the default/previous value when done.

Here's an example of the reserved percentage you get with different values
Code:
1:  50.000
2:  25.000
3:  12.500
4:  6.250
5:  3.125
6:  1.562
7:  0.781
8:  0.390
9:  0.195
10: 0.097
11: 0.048
12: 0.024
13: 0.012
14: 0.006
15: 0.003
16: 0.001
 
Last edited:
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?
 
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?
Wenn du den Parameter änderst, wird etwas weniger Slopspace reserviert, das bedeutet du bekommst für normale Dateioperationen wie z.B. Löschen, wieder etwas Speicher frei. Nachdem der Paramenter direkt nach Sys geschrieben wird, ist kein Neustart erforderlich. Der Wert wird umgehend angewandt. Wenn dann ZFS bereinigt wurde, bitte wieder zurück stellen. Nach einem Reboot wäre der Wert auch wieder auf Default.

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.
Das kannst du auch gerne später noch erledigten. Aber Speicher hierfür muss natürlich frei sein. Also nach der erfolgreichen Bereinigung mit dem Parameter wie von @Impact beschrieben, kannst du gerne reservieren.

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, du hättest bemerkt das der Zpool voll ist. Mit der Reservierung hast dann die Möglichkeit diese im Notfall zu löschen "zfs destroy XXX" und so den Zpool wieder zur normalen Operationen zu aktivieren. Dann bereinigen und wieder eine neue Reservierung erstellen.

Um dem ganzen generell vorzubeugen empfehle ich ein Monitoringsystem zu verwenden, das die Füllstände überwacht und frühzeitig benachrichtigt, damit es garnicht erst soweit kommen kann.