TL; DR
Die Defragmentierungsfunktion von Btrfs ist spezifisch für die Korrektur der Fragmentierung in Ordnermetadaten und Dateiinhalten, während die Balance-Funktion erstellt wurde, um die Datenmenge, die zwischen Laufwerken beim Hinzufügen oder Entfernen eines Laufwerks gemeinsam genutzt wird , " auszugleichen " (daher der Name). Obwohl sie theoretische Überschneidungen aufweisen, stehen sie nicht in direktem Zusammenhang, sodass die Dokumentation die beiden Funktionen nicht miteinander verbindet.
Ausführliche Antwort unten. Beachten Sie natürlich, dass meine lange Antwort in der Hoffnung besteht, dass sie anderen hilft, die nicht den vollständigen Kontext der Probleme haben, mit denen sie konfrontiert sind.
Chunk-Zuordnung
Ein wichtiges Konzept bei btrfs ist die Chunk-Zuweisung. Wenn Sie Daten in btrfs schreiben, werden diese Daten in einen "aktuellen" Block geschrieben, normalerweise 1 GB in Größe 1 . Wenn der "aktuelle" Block voll wird, weist er einen neuen Block zu. Wenn ein vorhandener Block geleert wird, wird sein Speicherplatz für die Neuzuweisung zur Verfügung gestellt, wenn ein neuer Block benötigt wird.
Wenn das Dateisystem mehr als ein Laufwerk mit den Speicherprofilen "dup", "single" oder "raid1" verwendet , zieht es der Chunk-Allokator immer vor, den nächsten neuen Chunk auf den Laufwerken mit dem meisten verfügbaren freien Speicherplatz abzulegen. Dies stellt im Allgemeinen sicher, dass Laufwerke gleichermaßen verwendet werden.
Wie Balance macht seine Sache
Die Balance-Funktion verwendet vorhandene Datenblöcke und schreibt sie neu in den "aktuellen" Block. Wenn ein vorhandener Block auf diese Weise geleert wird, wird er dem Allokator automatisch zur Verfügung gestellt. Wenn der zu entleerende vorhandene Block zunächst nicht voll war (möglicherweise wurden alte Daten im Block gelöscht), ist das Nettoergebnis die Freigabe von Speicherplatz, da der neuere Block mit relevanten Daten "enger gepackt" ist.
Dies ist der Teil, der theoretisch als Teil einer De-Fragmentierungsstrategie verwendet werden könnte , was meiner Meinung nach der Grund ist, warum viele Leute davon ausgehen, dass dies bereits der Fall ist. Natürlich wurde die Balance-Funktion jedoch für einen bestimmten Zweck entwickelt, weshalb der Dateiinhalt nicht berücksichtigt wird . Es wird nur geprüft, ob die Daten, die aus den vorhandenen Blöcken entnommen werden, relevant sind 2, bevor diese Daten in den neuen Block kopiert werden.
Wo kommt der Balance- Teil ins Spiel?
Wenn Sie dem Dateisystem ein neues Laufwerk hinzufügen, tendiert der Allokator zunächst dazu, alle neuen Daten auf das neue Laufwerk zu schreiben, hauptsächlich weil mehr freier Speicherplatz verfügbar ist als auf den vorhandenen Laufwerken. Durch erneutes Schreiben aller Chunks werden alle anfänglich ausgeglichenen Chunks nur auf das neue Laufwerk geschrieben. Sobald es ausgeglichen ist (ausgeglichen wird), werden die restlichen Daten gleichmäßig zwischen den Laufwerken neu zugewiesen.
Typisches Gleichgewichtsszenario:
Ich habe 2x 500 GB Laufwerke mit jeweils 240 GB; Ich füge ein weiteres 500-GB-Laufwerk hinzu. Ich hätte normalerweise:
- Laufwerk a: 240 GB verwendet
- Laufwerk b: 240 GB verwendet
- Laufwerk c: 0 GB verwendet
Ich beginne einen Ausgleich aller Daten. Ungefähr ein Viertel der Bilanz sehe ich wahrscheinlich eine ähnliche Situation wie die folgende:
- Laufwerk a: 180 GB verwendet
- Laufwerk b: 180 GB verwendet
- Laufwerk c: 120 GB verwendet
Bei etwa einem Drittel scheint es ausgeglichen zu sein:
- Laufwerk a: 160 GB verwendet
- Laufwerk b: 160 GB verwendet
- Laufwerk c: 160 GB verwendet
Sie können den Ausgleichsvorgang natürlich an dieser Stelle stoppen, obwohl es Gründe (gut und schlecht) gibt, warum Sie ihn möglicherweise beenden lassen möchten 3 .
Wie Fragmentierung in btrfs geschieht
Btrfs ist eine Kuh ( Copy on Write ) Dateisystem, was bedeutet , dass die Daten nie über geschrieben 4 . Wenn Sie eine vorhandene 100-MB-Datei haben und einen 1-MB-Teil der Datei überschreiben, wird dieser 1-MB-Teil nicht über die vorhandenen Daten auf dem Laufwerk geschrieben. Stattdessen wird es an anderer Stelle im "aktuellen" Block geschrieben. Btrfs verfolgt, wo diese "Fragmente" neuer Daten gespeichert sind. Dies ist am nützlichsten, um Snapshots der Daten zu verwalten, da die alten Daten standardmäßig beibehalten werden. Da SSDs auf sehr ähnliche Weise auch niemals Daten überschreiben, eignet sich dieser CoW-Mechanismus gut dafür, dass SSDs ihre Lebensdauer und Leistung beibehalten können.
Wo Defragment kommt
Unabhängig von den Vorteilen werden einige Dateien sehr häufig überschrieben (normalerweise Datenbankdateien), sodass am Ende Hunderte dieser Fragmente vorhanden sind. Bei SSDs gibt es kurzfristig nur geringe Leistungseinbußen. Bei Spindelantrieben ist der Leistungsverlust jedoch schwerwiegend.
Eine Lösung besteht natürlich darin, die Defragmentierungsfunktion von btrfs zu verwenden. Durch die Defragmentierungsoperation wird der Dateiinhalt im aktuellen Block in der logischen Reihenfolge seines aktuellen Status neu geschrieben, wodurch die Fragmente in einen großen Datensatz von 100 MB anstatt in zahlreiche separate Teile reduziert werden.
Eine alternative Lösung wäre die Verwendung der "nocow" -Funktion speziell für solche Dateien. Die Nocow-Funktion bewirkt, dass die Datei an Ort und Stelle überschrieben wird. Beachten Sie, dass es keine Vorbehalte gibt, 5 6 .
Nochmals Zusammenfassung
Die Waage betrachtet Chunks and Stripes - und kennt den Dateiinhalt nicht wirklich, außer ob Daten in diesen Chunks noch relevant sind oder nicht.
Die Defragmentierungsoperation betrachtet Ordnerdaten und den Inhalt einzelner Dateien und schreibt die Daten so zusammenhängend wie möglich neu. Die Kehrseite sind Snapshots, bei denen die Defragmentierung zu Duplikaten und zusätzlicher Laufwerksnutzung führt.
Anmerkungen:
Obwohl Chunks normalerweise 1 GB groß sind, können sie größer oder kleiner sein. Bei Verwendung von RAID-Typen werden Chunks normalerweise in 1-GB-Vielfachen auf mehrere Laufwerke verteilt. Beispielsweise führen 5 Laufwerke mit raid0 normalerweise zu einem 5-GB-Streifen, der aus 1-GB-Blöcken besteht, die auf jedes Laufwerk geschrieben werden.
Btrfs verwendet "Verweise" auf Dateiinhalte. Wenn ein Teil einer Datei überschrieben wird, "verweist" das Live-Dateisystem auf den Speicherort, an dem diese Daten geschrieben wurden. Ein Schnappschuss kann jedoch immer noch auf den alten Speicherort "verweisen". Wenn kein Snapshot vorhanden ist - oder der alte Snapshot gelöscht wird, bleiben keine "Verweise" übrig, die auf den ursprünglich überschriebenen Inhalt verweisen. Dieser Inhalt wird dann als irrelevant angesehen und nicht mit den anderen relevanten Daten in der Bilanzoperation kopiert.
Unter der Annahme, dass der Speicher das einfache "einzelne" Profil 7 verwendet , werden zu diesem Zeitpunkt alle ersten 160 GB ausgeglichen auf das neue Laufwerk verschoben. Zu diesem Zeitpunkt müssen jedoch noch etwa 320 GB ausgeglichen werden. Der Rest würde gleichmäßig über die Laufwerke verteilt. Bei Spindeln sollten Sie idealerweise nur 160 Chunks ausgleichen, bevor btrfs alle 3 Laufwerke neu ausbalanciert, um eine bessere "Verteilung" der Daten zu erreichen. Bei SSDs wird der Versuch, eine gleichmäßige "Verbreitung" von Daten aufrechtzuerhalten, sehr kompliziert, wahrscheinlich sinnlos und weitaus wahrscheinlicher sehr schlecht für die Lebensdauer der SSDs.
Die Ausnahme ist die "Nocow" -Funktion.
Wenn Snapshots vorhanden sind, führen die Defragmentierung der "Live" -Datei dazu, dass die Snapshots und die "Live" -Datei auf unterschiedliche Datenpositionen auf der Festplatte verweisen, wodurch die Daten dupliziert werden und somit zusätzlichen Speicherplatz beanspruchen. Wenn eine universelle Deduplizierungsfunktion verfügbar wird, ist dies kein so großes Problem.
Die Verwendung von nocow bedeutet, dass btrfs keine Prüfsummen für den Dateiinhalt verwaltet.
Bei den meisten RAID-Typen (RAID1 ist die Ausnahme) ist die "Verteilung" auf die Laufwerke umstritten, da die Streifen normalerweise sowieso auf alle Laufwerke geschrieben werden.