Closed simonerni closed 9 years ago
Wie jedes andere Dateisystem auch, benötigt ZFS eine Methode zur Verwaltung von freiem und belegtem Speicherplatz. Wäre es nicht möglich würde aufgrund des Copy On Write Verfahrens der Pool-Speicher sehr schnell voll sein, da jede einzelne Änderung zu einer Neuallokierung führt.
ZFS teilt jedes virtuelle Device (vdef) in mehrere hundert Regionen ein. Diese werden Metaslab genannt. Jede Metaslab hat eine eigene Space Map, in der sämtliche Allokierungen und Freigaben von Speicher in zeitlicher Reihenfolge (wie in einer Log Datei) gespeichert sind. Dies gewährleistet auch bei nicht sequentiellem Löschen eine sehr schnelle Bearbeitung.
Sollte ZFS freien Speicherplatz zum Schreiben benötigen, wird die spacemap einer Metaslap gelesen. Die Auswahl der Metaslab geschieht nach verschiedenen Kriterien. Ein Hauptkriterium ist die größe des freien Speicherplatzes. Zusätzlich beachtet ZFS die Position der Blöcke auf der Festplatte, da weiter außen liegenden Blöcke eine höhere Bandbreite haben. Die gewählte Spacemap wird dann in einen binären Suchbaum (AVL Baum) umgewandelt und im Speicher abgelegt. Anhand dieses Suchbaumes kann nun sehr einfach aneinander hängender Speicher in dieser Region der Festplatte gefunden werden. Zusätzlich wird die existierende Spacemap für spätere Zugriffe optimiert.
Die Spacemaps müssen bei Erstellung eines Pools nicht initialisiert werden, da eine leere Spacemap einem Bereich ohne Allokierungen und Freigaben entspricht. Da wie in einer Logdatei immer nur am Ende der Map angehängt wird, lassen sich Änderungen sehr schnell durchführen.
Sollte eine Spacemap komplett gefüllt werden, wird dies durch einen einzelnen Eintrag festgehalten. Hierdurch schrumpft die Größe der Spacemap sehr stark, so dass mehr Speicher für Nutzdaten zur Verfügung steht.
Quelle: http://www.fh-wedel.de/~si/seminare/ws08/Ausarbeitung/02.zfs/funktionen.html#n20b
ZFS "Bei Änderungen werden nie Datenblöcke überschrieben".
@alexander-suter