SSD Nodes Learn Hosting plans →
Anleitungen Matt ConnorVon Matt Connor · Aktualisiert 2026-08-25

ZFS auf FreeBSD und Linux: Wie viel RAM kostet es?

ZFS bietet Prüfsummen, Snapshots, Replikation und Komprimierung. Erfahren Sie, wie stark der ARC auf einem VPS mit 2 oder 4 GB RAM ins Gewicht fällt.

Was ZFS bietet und was es benötigt

ZFS verwendet auf FreeBSD und Linux inzwischen dieselbe Codebasis, OpenZFS. Daher sind die Funktionen auf beiden Systemen identisch. Ein Server mit ZFS erhält Daten mit Prüfsummen, Snapshots, die bis zu einer Datenänderung keinen zusätzlichen Speicherplatz benötigen, Replikation mit zfs send und Komprimierung, die sich über eine einzelne Eigenschaft aktivieren lässt. Dafür benötigt ZFS Arbeitsspeicher: Der ARC (Adaptive Replacement Cache) belegt standardmäßig einen großen Teil des RAM. Auf einem VPS (Virtual Private Server) mit 2 GB oder 4 GB ist das genau der Arbeitsspeicher, den Ihre Anwendung benötigt.

Dieser Leitfaden bewertet ZFS auf einem gemieteten VPS mit einer oder zwei virtuellen Festplatten. Er bewertet es nicht auf einem Storage-System mit vierzig Laufwerksschächten. Die Funktionen, die unter diesen Bedingungen weiterhin sinnvoll sind, sind Ihre Zeit wert. Die Einschränkungen, die dabei sichtbar werden, sollten Sie kennen, bevor Sie einen Pool erstellen.

OpenZFS unter FreeBSD und Linux: eine Codebasis, zwei Paketierungskonzepte

FreeBSD führt ZFS seit FreeBSD 7.0 im Jahr 2008 im Basissystem, zunächst als experimentelle Funktion. Seit OpenZFS 2.0 im Dezember 2020 bauen FreeBSD und Linux aus demselben Quellbaum. Daher verhalten sich zfs und zpool auf beiden Systemen gleich, und ein auf dem einen System erstellter Pool kann auf dem anderen importiert werden.

Der Grund dafür, dass ZFS unter Linux ein Paket und unter FreeBSD Bestandteil des Basissystems ist, liegt in der Lizenzierung. OpenZFS steht unter der CDDL (Common Development and Distribution License). Der Linux-Kernel steht unter der GPL (General Public License) Version 2. Das Kernel-Projekt betrachtet beide Lizenzen als inkompatibel. Daher wird der ZFS-Code nicht in den Mainline-Linux-Kernel übernommen, und jede Distribution entscheidet selbst, wie sie ihn bereitstellt. FreeBSD hat diesen Konflikt nicht, daher ist ZFS dort einfach vorhanden. Das ist die gesamte praktische Erklärung: ein Unterschied bei der Paketierung, für den Sie keine Position beziehen müssen.

SSD Nodes bietet keine FreeBSD-Images an. Auf einem hier gemieteten Server gilt daher der Linux-Teil dieser Anleitung. Wenn Sie FreeBSD an einem anderen Ort betreiben, erhält ein FreeBSD-Server ZFS, ohne dass Sie ein Modul bauen oder ein Kernel-Upgrade berücksichtigen müssen.

ZFS installieren und einen Pool erstellen

Unter Ubuntu ist das Modul Bestandteil der Kernelpakete. Sie müssen daher nur die Befehle installieren.

sudo apt update
sudo apt install -y zfsutils-linux
zfs version

zfs version gibt zwei Zeilen aus: die Version im Userland und die Version des Kernelmoduls. Eine einzige Zeile bedeutet, dass das Modul nicht geladen wurde. Das Paket befindet sich in der Komponente universe. Diese ist in Ubuntu-Server-Images standardmäßig aktiviert. Wenn apt das Paket nicht findet, führen Sie zuerst sudo add-apt-repository universe aus.

Unter Debian befinden sich die Pakete in der Komponente contrib. Das Modul wird mit DKMS (dynamic kernel module support) auf Ihrem Rechner erstellt. Ergänzen Sie contrib in der Zeile Components: in /etc/apt/sources.list.d/debian.sources. Führen Sie anschließend sudo apt update aus:

sudo apt install -y linux-headers-$(dpkg --print-architecture) zfs-dkms zfsutils-linux

Bei der Installation wird das Modul kompiliert. Dabei wird Building initial module for 6.12.0-... ausgegeben. Dieser Vorgang dauert einige Minuten. Beachten Sie die Konsequenz: Bei jedem Kernel-Upgrade wird das Modul neu erstellt. Wenn der Build fehlschlägt, wird Ihr Pool erst wieder importiert, nachdem Sie das Problem behoben haben.

Unter FreeBSD ist nichts installiert. Aktivieren und starten Sie den Dienst.

sysrc zfs_enable=YES
service zfs start

Erstellen Sie nun den Pool. Prüfen Sie zuerst die stabilen Gerätepfade. /dev/vdb wird in der Reihenfolge der Erkennung vergeben und kann sich ändern, wenn Sie ein weiteres Volume anschließen.

ls -l /dev/disk/by-id/
sudo zpool create -o ashift=12 tank /dev/disk/by-id/virtio-abc123def456
zpool status tank

zpool status sollte state: ONLINE ausgeben. Ihr Gerät muss unter tank aufgeführt sein. ashift=12 legt die kleinste Blockgröße des Pools auf 4 KiB fest. Das passt zu aktuellen SSDs und kann nach der Erstellung nicht geändert werden.

Die meisten gemieteten Images starten von einem ext4-Root-Dateisystem. ZFS ist hier daher ein Datenpool auf einem zweiten Volume und nicht das Root-Dateisystem. Prüfen Sie vor der Erstellung, ob das Gerät tatsächlich das erwartete ist. Die erworbene NVMe-Festplatte zu bestätigen dauert eine Minute. Eine erneute Einrichtung dauert dagegen einen Nachmittag.

Prüfsummen reparieren nur, wenn der Pool Redundanz besitzt

Jeder von ZFS geschriebene Block enthält eine Prüfsumme, und bei jedem Lesevorgang wird sie überprüft. Die Erkennung funktioniert immer. Für eine Reparatur wird eine zweite Kopie benötigt.

Auf einem Pool mit nur einem Datenträger teilt ZFS Ihnen die Wahrheit mit und beendet den Vorgang dort. zpool status -v meldet dies folgendermaßen:

status: One or more devices has experienced an error resulting in data
        corruption.
action: Restore the file in question if possible.  Otherwise restore the
        entire pool from backup.
errors: Permanent errors have been detected in the following files:

        /tank/data/archive.tar

Die beschädigte Datei wird genannt. ext4 hätte diese Bytes kommentarlos zurückgegeben. Schon deshalb ist das nützlich. ZFS kann den Fehler trotzdem nicht beheben, weil es im Pool keine zweite Kopie gibt, aus der der Block wiederhergestellt werden könnte.

Bei einem Mirror wird derselbe Lesevorgang von der intakten Seite bedient, der beschädigte Block wird neu geschrieben, und das Ereignis erscheint in der CKSUM-Spalte von zpool status. Das ist Selbstheilung. Dafür werden zwei Geräte benötigt.

sudo zpool create -o ashift=12 tank mirror /dev/disk/by-id/DISK1 /dev/disk/by-id/DISK2

Auf einem VPS ist der Speicher des Hosts normalerweise bereits redundant, häufig als RAID 10 unter dem Hypervisor. Das schützt Sie vor dem Ausfall eines Laufwerks. Es meldet jedoch nicht, wenn ein Block fehlerhaft zurückgegeben wurde, weil das Array nicht feststellen kann, welche Kopie korrekt ist. ZFS kann das feststellen, weil es die Daten mit einer Prüfsumme vergleicht, die ZFS selbst geschrieben hat.

Wenn Sie eine virtuelle Festplatte haben und eine gewisse Reparaturfähigkeit benötigen, speichert sudo zfs set copies=2 tank/important zwei Kopien jedes Blocks dieses Datasets auf derselben Festplatte. Dadurch verdoppelt sich der von diesem Dataset belegte Speicherplatz. Ein beschädigter Block kann damit überstanden werden. Wenn das gesamte Volume verschwindet, hilft das jedoch nicht.

Ein Scrub liest alle Daten im Pool und überprüft sie.

sudo zpool scrub tank
zpool status tank

Ein fehlerfreier Pool endet mit einer Zeile wie scan: scrub repaired 0B in 00:04:11 with 0 errors. Planen Sie diesen Vorgang regelmäßig ein. Für einen kleinen Pool ist einmal im Monat ausreichend.

systemctl list-unit-files 'zfs-scrub*'
sudo systemctl enable --now zfs-scrub-monthly@tank.timer

Datasets sind die Einheit für Richtlinien

Ein Dataset ist ein Dateisystem innerhalb des Pools. Seine Erstellung ist günstig, daher sollten Sie für jeden Anwendungsfall ein eigenes Dataset anlegen. Eigenschaften werden vom Pool an untergeordnete Datasets vererbt. Sie setzen einen Standard daher einmal und überschreiben ihn nur dort, wo es erforderlich ist. Unter FreeBSD werden Jails üblicherweise so betrieben: ein Dataset pro Jail. Dadurch kann ein einzelnes Jail unabhängig gesichert und zurückgesetzt werden. Das ist ein Teil von dem, was ein Jail von einem Docker-Container unterscheidet.

sudo zfs create tank/data
sudo zfs create tank/pg
sudo zfs set compression=lz4 tank
sudo zfs set atime=off tank
sudo zfs set quota=20G tank/data
sudo zfs set recordsize=16K tank/pg
zfs get -r compression,compressratio,quota tank

Die Komprimierung wird aus Vorsicht häufig deaktiviert. Das ist jedoch der falsche Ansatz. lz4 benötigt nur wenig CPU und reduziert die Datenmenge, die auf die Festplatte geschrieben werden muss. Bei komprimierbaren Daten werden Lese- und Schreibvorgänge dadurch meist schneller. zstd komprimiert stärker und benötigt dafür mehr CPU. Das eignet sich für Logs und Archive, auf die Sie selten zugreifen. Prüfen Sie mit zfs get compressratio tank, welche Ergebnisse tatsächlich erreicht werden. Beachten Sie, dass die Komprimierungsrate nur Daten berücksichtigt, die nach dem Setzen der Eigenschaft geschrieben wurden.

recordsize bezeichnet den größten Block, den ein Dataset schreibt. Der Standardwert ist 128K. Schreibt eine Datenbank 8-KiB-Seiten in 128-KiB-Datensätze, wird aus einem kleinen Schreibvorgang zunächst ein Lesen des gesamten Datensatzes, anschließend eine Änderung und danach ein erneuter Schreibvorgang. Setzen Sie recordsize=16K auf dem Datenbank-Dataset, bevor Sie Daten laden. Die Eigenschaft gilt nur für neu geschriebene Blöcke.

Mit quota verhindern Sie, dass ein einzelnes Dataset den Pool vollständig füllt. Ein ZFS-Pool, der nahezu 100% voll ist, wird langsam und lässt sich nur schwer bereinigen. Lassen Sie daher bewusst freien Speicher als Reserve.

Snapshots kosten nichts, solange sich die Daten nicht ändern

ZFS überschreibt niemals einen aktiven Block. Es schreibt einen neuen Block und aktualisiert die Zeiger. Das bedeutet Copy-on-Write. Ein Snapshot ist ein Vermerk: „Behalte die Blöcke, auf die dieses Dataset jetzt zeigt.“ Daher wird ein Snapshot sofort und ohne zusätzlichen Speicherbedarf erstellt.

sudo zfs snapshot tank/data@2026-08-11
zfs list -t snapshot -o name,used,refer -r tank/data

Die Spalte USED eines Snapshots enthält den Speicherplatz, der ausschließlich von diesem Snapshot belegt wird. Sie beginnt nahe null und wächst, wenn Sie Daten ändern oder löschen. Die alten Blöcke können dann nicht mehr freigegeben werden.

Um eine Datei wiederherzustellen, ist kein Restore-Schritt erforderlich.

ls /tank/data/.zfs/snapshot/
cp /tank/data/.zfs/snapshot/2026-08-11/notes.txt /tank/data/notes.txt

Das Verzeichnis .zfs ist sogar für ls -a verborgen, bis Sie sudo zfs set snapdir=visible tank/data ausführen. Erstellen Sie den Snapshot, bevor Sie ihn benötigen. Ohne Snapshot führt ein versehentliches rm -rf direkt in den ext4-Wiederherstellungspfad, der mit dem Aushängen des Datenträgers beginnt und danach nur noch aufwendiger wird.

Ein Rollback verwirft alles, was seit dem Snapshot geschrieben wurde.

sudo zfs rollback tank/data@2026-08-11

Der Vorgang wird verweigert, wenn neuere Snapshots vorhanden sind. -r löscht diese neueren Snapshots, damit der Vorgang fortgesetzt werden kann. Prüfen Sie den Dataset-Namen zweimal, bevor Sie die Eingabetaste drücken.

Ein Snapshot ist kein Backup. Er befindet sich im selben Pool, auf demselben Volume und auf demselben Server. Ein ausgefallenes Volume oder ein zpool destroy nimmt die Snapshots zusammen mit den Daten mit. Snapshots schützen Sie vor eigenen rm und vor einem fehlerhaften Upgrade. Damit decken sie viele reale Vorfälle ab. Vor Ereignissen, die den Pool selbst betreffen, schützen sie nicht. Die vollständige Erläuterung finden Sie hier: warum ein VPS-Snapshot kein Backup ist.

Senden und Empfangen: Replikation mit einem Befehl

zfs send wandelt einen Snapshot in einen Byte-Stream auf der Standardausgabe um. zfs receive wandelt diesen Stream wieder in einen Dataset um. Die erste Kopie ist eine vollständige Übertragung.

sudo zfs snapshot tank/data@daily-2026-08-11
sudo zfs send tank/data@daily-2026-08-11 | ssh backup.example.com "sudo zfs recv -F backup/data"

Übertragen Sie danach nur die Änderungen zwischen zwei Snapshots.

sudo zfs snapshot tank/data@daily-2026-08-12
sudo zfs send -i tank/data@daily-2026-08-11 tank/data@daily-2026-08-12 | ssh backup.example.com "sudo zfs recv backup/data"

Auf der empfangenden Seite muss der Snapshot, von dem Sie senden, weiterhin vorhanden sein. Ist das nicht der Fall, wird der Empfang mit cannot receive incremental stream: most recent snapshot of backup/data does not match incremental source abgebrochen, weil ZFS keine Basis hat, auf die es die Differenz anwenden kann. Senden Sie von einem Snapshot, den beide Seiten besitzen, oder beginnen Sie erneut mit einer vollständigen Übertragung.

Vergeben Sie die erforderlichen Rechte auf dem Ziel, anstatt remote root zu verwenden: sudo zfs allow -u backupuser create,mount,receive backup/data.

Das ist ein echtes Offsite-Backup mit einer Bedingung. Das entfernte Ende muss ein ZFS-Pool sein, da Object Storage keinen Stream empfangen kann. Wenn Ihr Ziel S3-kompatibler Speicher oder ein einfacher Linux-Host ist, verwenden Sie ein dafür geeignetes Tool. restic-Backups von einem VPS beschreibt diesen Pfad.

Warum verwendet ZFS so viel RAM? Der ARC

Der ARC (Adaptive Replacement Cache) ist der Lesecache von ZFS. Er befindet sich im Kernel-Speicher und nicht im normalen Linux-Seitencache. Deshalb weist free -h ihn nicht unter buff/cache aus. Er erscheint als belegter Speicher. Ein ZFS-System, das nahezu voll aussieht, verfügt in der Regel über einen gefüllten Cache. Das erklärt die meisten Meldungen, dass „ZFS meinen RAM aufgefressen hat“.

Das Standardlimit ist bewusst großzügig bemessen. OpenZFS 2.3 setzt die maximale ARC-Größe auf den größeren Wert aus RAM minus 1 GiB und 5/8 des RAM. OpenZFS 2.2 und frühere Versionen verwendeten unter Linux die Hälfte des RAM. FreeBSD verwendete bereits die neuere Regel. Führen Sie zfs version aus, um zu prüfen, welche Regel auf Ihrem System gilt.

ChartDefault maximum ARC size by instance RAM, from the OpenZFS default rule (GiB)
The data behind this chart
[
  {
    "label": "2 GB VPS",
    "openzfs_2_2_linux_gib": 1,
    "openzfs_2_3_gib": 1.25
  },
  {
    "label": "4 GB VPS",
    "openzfs_2_2_linux_gib": 2,
    "openzfs_2_3_gib": 3
  },
  {
    "label": "8 GB VPS",
    "openzfs_2_2_linux_gib": 4,
    "openzfs_2_3_gib": 7
  },
  {
    "label": "16 GB VPS",
    "openzfs_2_2_linux_gib": 8,
    "openzfs_2_3_gib": 15
  }
]

Diese Werte ergeben sich aus der dokumentierten Standardregel für gängige Instanzgrößen. Es handelt sich nicht um Messwerte eines laufenden Systems. Bei einer Instanz mit 4 GB erlaubt die Regel von 2.3 einen ARC von 3 GiB. Dasselbe System mit 2.2 begrenzt den ARC unter Linux auf 2 GiB. Eine Instanz mit 2 GB erlaubt nach der Regel von 2.3 weiterhin 1.25 GiB. Ihrer Anwendung bleibt der übrige Speicher.

Lesen Sie die tatsächlichen Werte auf Ihrem eigenen Server aus, statt sich auf die Tabelle zu verlassen:

grep -E '^(size|c_max) ' /proc/spl/kstat/zfs/arcstats
arc_summary | head -n 20

Die dritte Spalte enthält Bytes. c_max ist die derzeit geltende Obergrenze, und size ist die aktuell vom ARC belegte Größe.

Der ARC gibt Speicher wieder frei. Der Kernel signalisiert Speicherdruck, und der ARC wird kleiner. Das Problem ist der Zeitpunkt. Die Verkleinerung wird durch diesen Speicherdruck ausgelöst. Ein Prozess, der auf einmal mehrere hundert MiB anfordert, kann daher den OOM-Killer (Out of Memory) auslösen, während der ARC noch Speicher freigibt. Auf einem System mit 2 GB RAM, auf dem eine Datenbank und ein Webserver laufen, ist das kein seltenes Ereignis. Das OpenZFS-Handbuch beschreibt manuelle Änderungen ebenso: Das Herabsetzen des Limits „führt nicht dazu, dass der ARC ohne Speicherdruck schrumpft, der diese Verkleinerung auslöst“.

So begrenzen Sie den ARC auf einem kleinen VPS

Legen Sie zuerst fest, wie viel Arbeitsspeicher die Workload benötigt. Addieren Sie den Bedarf der Datenbank und der Anwendung, lassen Sie eine Reserve für das Betriebssystem und weisen Sie den verbleibenden Speicher dem ARC zu. Bei einer Instanz mit 4 GB, auf der Postgres und eine Webanwendung laufen, sind 512 MiB bis 1 GiB ARC ein sinnvoller Ausgangspunkt.

Setzen Sie den Wert zur Laufzeit in Byte. Dieser Wert entspricht 1 GiB.

echo 1073741824 | sudo tee /sys/module/zfs/parameters/zfs_arc_max

Sorgen Sie dafür, dass die Einstellung einen Reboot übersteht.

echo 'options zfs zfs_arc_max=1073741824' | sudo tee /etc/modprobe.d/zfs.conf
sudo update-initramfs -u

Der Schritt für das initramfs ist wichtig, weil das Modul aus dem initramfs geladen werden kann, bevor das Root-Dateisystem eingehängt ist. In diesem Fall würde es die gerade erstellte Datei nicht einlesen. Prüfen Sie nach dem Reboot den Wert mit der c_max-Zeile aus arcstats.

Zwei Einschränkungen ergeben sich direkt aus dem Handbuch. Sie können den Wert während des laufenden Betriebs nicht wieder auf 0 setzen. Um die Einstellung rückgängig zu machen, müssen Sie die Datei bearbeiten und einen Reboot durchführen. Durch das Verringern des Werts wird ein großer ARC außerdem nicht sofort verkleinert.

Unter FreeBSD wird dasselbe Limit über ein sysctl unter vfs.zfs.arc gesetzt. Führen Sie sysctl vfs.zfs.arc aus, um die aktuellen Werte und den genauen Namen für Ihre Version anzuzeigen. Schreiben Sie den Maximalwert anschließend nach /boot/loader.conf.

Für einen kleinen Server gelten zwei weitere Regeln für den Arbeitsspeicher. Lassen Sie die Deduplizierung deaktiviert, weil die Deduplizierungstabelle im Arbeitsspeicher liegt. Als häufig genannte Faustregel gelten 1 bis 3 GB RAM pro TB eindeutiger Daten. Verwenden Sie außerdem keinen Swap auf einem zvol, also einem aus dem Pool ausgeschnittenen Blockgerät. Das Auslagern über das Dateisystem, das gerade Arbeitsspeicher freigeben soll, kann den Rechner in einen Deadlock bringen. Legen Sie den Swap stattdessen auf einer normalen Partition oder in einer Swap-Datei außerhalb des Pools an.

Wenn ext4 oder XFS mit restic die bessere Lösung ist

ZFS lohnt sich auf einem Server mit ausreichend Arbeitsspeicher und einem zweiten Volume. In allen anderen Fällen ist ein einfaches Dateisystem mit einem zuverlässigen Backup-Tool die bessere Wahl. Wählen Sie ext4 oder XFS, wenn:

  • Die Instanz über 2 GB oder 4 GB RAM verfügt und die Anwendung den gesamten Arbeitsspeicher benötigt.
  • Es nur eine virtuelle Festplatte und keine zweite Kopie gibt. ZFS erkennt dann zwar Fehler, kann sie aber nicht beheben.
  • Ihr Backup-Ziel Object Storage oder ein einfacher Linux-Host ist und dort kein zfs send-Stream empfangen werden kann.
  • Sie Debian mit DKMS verwenden und sich kein Kernel-Upgrade leisten können, nach dem das Modul nicht gebaut wurde.
  • Sie ZFS auf dem Root-Dateisystem benötigen und die Images des Providers nur ext4 anbieten.

Behalten Sie ZFS bei, wenn ein separates Daten-Volume, ausreichend Arbeitsspeicher (ab 8 GB ist komfortabel) und ein Plan vorhanden sind, der Snapshots und zfs send tatsächlich nutzt, statt sie nur zu aktivieren. In allen anderen Fällen deckt ext4 mit restic, das verschlüsselte und deduplizierte Backups auf einen Speicher schreibt, den der Server nicht kontrolliert, den Großteil desselben Bedarfs ab – ohne den zusätzlichen Speicherbedarf.

Fehlerbilder und die dabei angezeigten Meldungen

Der Pool ist nach einem Reboot verschwunden. zpool status gibt no pools available aus. Der Importdienst liest /etc/zfs/zpool.cache. Ein Pool, der in dieser Datei fehlt, wird beim Booten daher nie importiert. sudo zpool import listet die importierbaren Pools auf, sudo zpool import tank stellt den Pool wieder her, und sudo zpool set cachefile=/etc/zfs/zpool.cache tank sorgt dafür, dass dies dauerhaft so bleibt. Ein Pool, der auf einem anderen System nicht sauber exportiert wurde, meldet cannot import 'tank': pool may be in use from other system. sudo zpool import -f tank setzt diese Sperre außer Kraft, sobald Sie sicher sind, dass kein anderer Host den Pool verwendet.

modprobe: FATAL: Module zfs not found in directory /lib/modules/6.12.0-... unter Debian nach einem Kernel-Upgrade. DKMS wurde für den neuen Kernel nicht gebaut. Meist sind die passenden Header nicht installiert. dkms status zeigt, was für welchen Kernel gebaut wurde. sudo apt install -y linux-headers-$(uname -r) führt anschließend sudo dkms autoinstall aus, um es neu zu bauen, und sudo zpool import tank stellt den Pool wieder her.

Der Pool ist voll, obwohl Sie die Dateien gelöscht haben. Gelöschte Daten bleiben auf dem Datenträger, solange ein Snapshot weiterhin auf sie verweist. Deshalb zeigen du und df unterschiedliche Werte. zfs list -o space -r tank teilt die Belegung in USEDDS und USEDSNAP auf. Ein hoher USEDSNAP-Wert ist hier die Ursache. Löschen Sie die alten Snapshots mit sudo zfs destroy tank/data@2026-06-01. Danach wird der Speicherplatz wieder frei.

Die CKSUM-Zähler in zpool status steigen. Unterhalb von ZFS wurden fehlerhafte Daten zurückgegeben. Bei einem Mirror ist der Zähler ein Warnsignal, und der Block wurde repariert. Bei einem Pool mit nur einem Datenträger ist die Datei verloren. zpool status -v nennt die betroffene Datei. Stellen Sie genau diese Datei aus einem Backup wieder her, das nicht in diesem Pool liegt.

Der Server ist langsam und verwendet Swap. Begrenzen Sie den ARC wie oben beschrieben. Führen Sie anschließend arc_summary aus und prüfen Sie die Trefferquote. Ein ARC, der nicht groß genug für den aktiven Datensatz ist, führt dazu, dass jeder Lesezugriff auf den Datenträger geht. An diesem Punkt wäre ein einfaches Dateisystem mit Page Cache die bessere Lösung.

FAQ

Wie viel RAM benötigt ZFS auf einem VPS?

ZFS läuft auf einer Instanz mit 2 GB. Entscheidend ist, wie viel RAM für Ihre Anwendung übrig bleibt. Ohne Anpassungen lässt OpenZFS 2.3 den ARC auf den größeren Wert aus RAM minus 1 GiB und 5/8 des RAM anwachsen. Ein System mit 4 GB kann dem Cache daher 3 GiB zuweisen. Setzen Sie zfs_arc_max auf einen Wert, den Ihre Auslastung entbehren kann. Prüfen Sie den Wert anschließend anhand der Zeile c_max aus /proc/spl/kstat/zfs/arcstats.

Ist ein ZFS-Snapshot ein Backup?

Nein. Ein Snapshot befindet sich im selben Pool wie die Daten. Er übersteht einen fehlerhaften rm und ein fehlgeschlagenes Upgrade. Beim Ausfall des Pools oder der Instanz geht er jedoch ebenfalls verloren. Erstellen Sie daraus ein Backup, indem Sie ihn mit zfs send an eine andere Maschine senden. Alternativ können Sie ein Backup-Tool verwenden, das auf Speicher schreibt, den dieser Server nicht kontrolliert.

Funktioniert ZFS unter FreeBSD und Linux gleich?

Seit OpenZFS 2.0 im Dezember 2020 basieren beide Systeme auf derselben Codebasis. Sie verwenden dieselben Befehle und dasselbe On-Disk-Format. Pools lassen sich zwischen ihnen verschieben. Der Unterschied liegt in der Paketierung. FreeBSD liefert ZFS als Bestandteil des Basissystems aus. Unter Linux entscheidet jede Distribution selbst: Ubuntu integriert das Modul in seine Kernelpakete. Debian erstellt es mit DKMS auf Ihrer Maschine. Deshalb kann ein Kernel-Upgrade dazu führen, dass das Modul fehlt, bis der Neuaufbau erfolgreich abgeschlossen ist.

Kann ZFS eine Beschädigung auf einem VPS mit nur einer Festplatte reparieren?

ZFS erkennt die Beschädigung und nennt die betroffene Datei. Reparieren kann es sie nicht, weil dafür eine zweite Kopie des Blocks erforderlich ist. zfs set copies=2 auf einem Dataset erstellt diese zweite Kopie und benötigt dafür doppelt so viel Speicher. Damit lässt sich ein beschädigter Block behandeln, aber kein verlorenes Volume wiederherstellen. Ein Mirror über zwei Volumes ist die Lösung, die beschädigte Daten tatsächlich reparieren kann.

Verlangsamt die Komprimierung den Server?

lz4 macht den Server normalerweise schneller. Komprimierte Blöcke bedeuten weniger geschriebene und weniger gelesene Bytes. Die CPU-Kosten pro Block sind gering im Vergleich zur eingesparten Festplattenaktivität. Setzen Sie compression=lz4 auf der Pool-Wurzel, damit jedes Dataset diese Einstellung erbt. Prüfen Sie zfs get compressratio tank, sobald reale Daten geschrieben wurden.