Das Dateisystem Ext3 tunen

Seite 7: "Fragmentierung"

Inhaltsverzeichnis

Stellt man unter Linuxern die Frage nach einem Defragmentier-Tool für Linux, hat das einen ähnlichen Effekt wie der Ruf „Jehova“ in Monty Pythons „Das Leben des Brian“: „Braucht man nicht“, „Ext3 fragmentiert nicht“, „so etwas gibt es nur bei Windows“ – das etwa ist, was man in Newsgroups und Hilfeforen zu lesen kriegt.

Wenn man sich mit Ext3 und Fragmentierung beschäftigt, gilt es zunächst zwischen zwei sehr verschiedenen Dingen zu unterscheiden: der bereits erwähnten internen und der externen Fragmentierung. Letzteres bezeichnet Dateien, deren Datenblöcke nicht hintereinander liegen, sondern über die Platte verstreut sind, was beim sequenziellen Lesen und Schreiben der Daten mehr zeitraubende Kopfbewegungen erfordert als nötig. Interne Fragmentierung kostet „nur“ Speicherplatz, externe Fragmentierung hingegen Performance.

Auf dem IMAP-Server, der jede Mail in einer eigenen Datei ablegt, sind die freien Bereiche in vielen Blockgruppen stark fragmentiert.

Ext3 ist ziemlich gut darin, externe Fragmentierung zu verhindern und die Kopfbewegungen zu minimieren – so versucht das Dateisystem beispielsweise, für neu angelegte Dateien einen Bereich von acht freien Blöcken vorzubelegen. Zudem sorgt der Schreib-Cache dafür, dass Daten, die eine Anwendung etappenweise wegschreibt, in einem Rutsch und damit häufig auch am Stück auf die Platte geschrieben werden. Bei Dateien, die langsam wachsen – etwa Verzeichnisse, die sich nach und nach füllen –, hilft das freilich nicht; und auch, wenn immer wieder Dateien unterschiedlicher Größe angelegt und gelöscht werden und so zwangsweise kleine Belegungslöcher mit freien Blöcken entstehen, lässt sich Fragmentierung nicht vermeiden.

Beim Kampf gegen die Fragmentierung kommt dem Dateisystem zudem eine andere Optimierungsstrategie in die Quere: die Lokalität von Daten und Metadaten, die über die Blockgruppen erreicht werden soll. Da Ext3 die Dateien in einem Verzeichnis bevorzugt in der gleichen Blockgruppe ablegt, kann es zu Fragmentierung kommen, obwohl eigentlich noch viel zusammenhängender freier Platz auf der Platte ist. Die gelegentlich zu lesende Behauptung, Ext3 fragmentiere erst, wenn das Dateisystem zu 80 oder 90 Prozent gefüllt ist, stimmt daher nur bedingt: Je nach Nutzung kann es auch auf einem Dateisystem mit reichlich freiem Platz zu Fragmentierung kommen.

So fanden wir auf einem intensiv genutzten IMAP-Server, der alle Mails als eigene Dateien ablegt, in vielen Blockgruppen eine heftige Zersplitterung der freien Bereiche – obwohl von insgesamt 1,4 TByte Plattenplatz noch über 900 GByte frei waren.

Der Fragmentierungsgrad lässt sich mit mit dem Tool dumpe2fs überprüfen, das – ohne Optionen aufgerufen – für jede Blockgruppe die Fragmentierung der freien Bereiche ausgibt. Idealerweise sollte sich in jeder Blockgruppe ein großer zusammenhängender Bereich mit freien Blöcken befinden; je mehr kleine Bereiche mit freien Blöcken, desto höher das Risiko, dass neu angelegte Dateien in dieser Gegend auf mehrere Fragmente verteilt werden. Im schlimmsten Fall sind die freien Blöcke einzeln über die Blockgruppe verteilt. Dumpe2fs kann ohne Risiko auch über gemountete Dateisysteme laufen, allerdings kann es dabei zu Inkonsistenzen kommen – beispielsweise können die zusammenfassenden Statistiken, die dumpe2fs zunächst für jede Blockgruppe ausgibt, weniger oder mehr freie Blöcke anzeigen, als danach einzeln aufgelistet werden.

Da der Output von dumpe2fs bei Hunderten oder Tausenden von Blockgruppen sehr unübersichtlich wird, haben wir das Perl-Skript eval_dumpe2fs geschrieben, das die Ausgabe von dumpe2fs einliest und eine zusammenfassende Statistik ausgibt. Das Skript erwartet, dass dumpe2fs seine Meldungen auf Englisch ausgibt; daher muss auf lokalisierten Linux-Systemen die Variable $LANG gesetzt werden:

LANG=C dumpe2fs DEVICE | eval_dumpe2fs

Das Skript gibt für jede Blockgruppe aus, auf wie viele Bereiche mit mindestens zwei Blöcken („chunks“) und einzelne Blöcke die freien Blöcke verteilt sind und wie groß ein freier Bereich im Durchschnitt ist („avg. chunk size“). Kritische Werte werden dabei fett gedruckt. Eine Statistik am Ende fasst zusammen, wie viele Blockgruppen wie stark zersplittert sind.

Dumpe2fs zeigt auch an, wie viele Inodes in jeder Blockgruppe noch frei sind – bei sehr vielen kleinen Dateien können die Inodes einer Blockgruppe aufgebraucht sein, bevor alle Blöcke belegt sind. Das schadet der Performance zwar erst einmal nicht, aber wenn die Inodes in zu vielen Blockgruppen ausgehen, kann Ext3 die Lokalität von Daten und Metadaten nicht mehr gewährleisten. Und wenn alle Inodes in einem Dateisystem aufgebraucht sind, können dort keine Dateien mehr gespeichert werden – egal, wie viele freie Blöcke es noch gibt.