Entlastet btrfs auch Dateien defragmentieren?

9

btrfs filesystem balanceDefragmentiert dies beim Ausführen implizit Dateien? Ich könnte mir vorstellen, dass Balance einfach jeden Dateibereich separat neu zuweist, wobei die vorhandene Fragmentierung erhalten bleibt.

Es gibt einen FAQ-Eintrag: "Was macht" balance "?" , was in diesem Punkt unklar ist:

btrfs filesystem balance ist eine Operation, bei der einfach alle Daten und Metadaten im Dateisystem erfasst und an einer anderen Stelle auf den Datenträgern neu geschrieben werden, wobei sie unterwegs den Allokatoralgorithmus durchlaufen. Es wurde ursprünglich für Dateisysteme mit mehreren Geräten entwickelt, um Daten gleichmäßiger auf die Geräte zu verteilen (dh ihre Nutzung auszugleichen). Dies ist besonders nützlich, wenn Sie einem nahezu vollständigen Dateisystem neue Geräte hinzufügen.

Aufgrund der Funktionsweise des Gleichgewichts hat es auch einige nützliche Nebenwirkungen:

  • Wenn viele zugewiesene, aber nicht verwendete Daten oder Metadatenblöcke vorhanden sind, kann ein Saldo einen Teil des zugewiesenen Speicherplatzes zurückfordern. Dies ist der Hauptgrund für die Ausführung eines Guthabens auf einem Dateisystem mit einem Gerät.
  • Auf einem Dateisystem mit beschädigter Replikation (z. B. einem RAID-1-FS mit einer toten und entfernten Festplatte) wird der FS gezwungen, die fehlende Kopie der Daten auf einem der derzeit aktiven Geräte neu zu erstellen, wodurch die RAID-1-Fähigkeit des wiederhergestellt wird Dateisystem.
pauldoo
quelle

Antworten:

9

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:

  1. 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.

  2. 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.

  3. 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.

  4. Die Ausnahme ist die "Nocow" -Funktion.

  5. 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.

  6. Die Verwendung von nocow bedeutet, dass btrfs keine Prüfsummen für den Dateiinhalt verwaltet.

  7. 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.

zaTricky
quelle
Wow, tolle Antwort. Ich sehe, dass es einen ernsthaften Mangel an benutzerrelevanten BTRFS-Informationen in Büchern oder Ähnlichem gibt (im Gegensatz zu ZFS), was zu seinem anhaltend schlechten Ruf beizutragen scheint. Hast du einen Blog oder mehr gute Sachen wie diese?
Andrew Keech
1
Vielen Dank! Ich sollte dort wirklich mehr aktuelle Inhalte einbringen. : - | Die Zeit hat schmerzlich gefehlt: dogma.swiftspirit.co.za
zaTricky
6

Vielleicht hilft es, den Quellcode des Befehls zu betrachten

Bevorzugen btrfs balance start

Der Befehl 'btrfs filesystem balance' ist veraltet. Verwenden Sie stattdessen den Befehl 'btrfs balance start'.

Und dann auf der Befehlszeichenfolge

"btrfs [filesystem] balance start [options] <path>",
"Balance chunks across the devices",
"Balance and/or convert (change allocation profile of) chunks that",
"passed all filters in a comma-separated list of filters for a",
"particular chunk type.  If filter list is not given balance all",
"chunks of that type.  In case none of the -d, -m or -s options is",
"given balance all chunks in a filesystem."

Ich könnte es noch einmal betrachten, aber ich kann keine Verweise auf die Defragmentierung der Strukturen oder der ioctl () -Aufrufe sehen. Es gibt also keine explizite Defragmentierung.

Es wird lediglich von einem Ort an einen anderen kopiert und dabei der Standard-Allokator verwendet. Von hier genommen

Abhängig von der Zweckzuweisung und dem Zuweisungsmodus sucht der Algorithmus entweder direkt nach einem kontinuierlichen Umfang des freien Raums in jeder geeigneten Zuordnungsgruppe (eine Gruppe in btrfs entspricht einem oben beschriebenen Block

Abhängig vom Zuweisungsmodus, dem freien Speicherplatz auf dem Gerät usw. können Sie also sagen, dass btrfs so zuweist, dass keine Defragmentierung erforderlich ist. Was Sie als eine Form der impliziten Defragmentierung betrachten könnten.

HTH

Benutzer
quelle
3

Balance funktioniert auf Chunk-Ebene; In Chunks implementiert Btrfs die Raid-Redundanz. Es macht nichts auf der Btree-Ebene und defragmentiert nicht.

Gabriel
quelle
0

Wenn Sie Medien mit hoher Zugriffslatenz verwenden, zählt die Reibung unabhängig vom verwendeten Dateisystem immer. Eine Suche bleibt eine Suche, pediod.

user203842
quelle
3
Wenn Sie nicht vom SSD-Laufwerk auf die Daten zugreifen, bedeutet dies überhaupt nichts.
Matt
1
Das beantwortet die Frage nicht.
Karl Richter
-2

Die Defragmentierung wird überbewertet. Sicher, bei einem FAT16 macht es einen echten Unterschied, aber in den meisten Fällen bei nichts Modernem. Durch die Neuverteilung wird die Organisation Ihres Dateisystems verbessert, und die Dateien werden weniger fragmentiert.

Ronald Pottol
quelle
6
Fragmentierung ist für ext2 / 3/4, xfs, jfs usw. kein wirkliches Problem, kann aber für btrfs ein erhebliches Problem sein. Siehe btrfs.wiki.kernel.org/index.php/Gotchas die „Dateien mit viel Random Writes sagt stark fragmentiert werden kann (10000 + Ausdehnungen) verursacht trashing auf HDDs und übermäßige Mehr zweite Spitzen von CPU - Last auf Systemen mit einem SSD oder große Menge ein RAM. " Dies ist keine Übertreibung, selbst für häufige Anwendungsfälle (Dateien, die mit Bittorrent, SQLite-Datenbanken usw. heruntergeladen wurden).
Nemequ
2
Die Defragmentierung kann selbst bei moderneren Dateisystemen einen großen Unterschied bewirken, insbesondere wenn das Laufwerk auf einer herkömmlichen Festplatte voll wird. Einige Dateisysteme handhaben es besser als andere und einige Dateitypen sind schlechter als andere. Slack Space, unmöglich zu optimierende Szenarien, Lese- / Schreib-Caches, Readahead, Anwendungsoptimierung usw. verbergen vieles davon. Die meisten Menschen müssen sich darüber keine Sorgen machen und sollten sich nur Sorgen machen, wenn sie tatsächlich ein ernstes Problem haben, das durch Fragmentierung verursacht werden könnte.
jgmjgm