# Fragmentierung (Dateisystem)

Unter Fragmentierung (Fragment = Bruchstück) versteht man die verstreute Speicherung von logisch zusammengehörigen Datenblöcken des Dateisystems auf einem Datenträger, was als Spezialfall der allgemeinen Speicherfragmentierung betrachtet werden kann. Bei Speichermedien mit sequentiellem Zugriff wie beispielsweise Festplatten kann Fragmentierung zu einer spürbaren Verlangsamung der Lese- und Schreibvorgänge führen.
Unter Defragmentierung versteht man die mit speziellen Programmen durchführbare Neuordnung von fragmentierten Datenblöcken auf dem Speichermedium, so dass logisch zusammengehörige Datenblöcke möglichst aufeinanderfolgend auf dem Datenträger abgelegt werden. Dies kann den sequentiellen Zugriff beschleunigen und damit die Arbeitsgeschwindigkeit des gesamten Systems erhöhen.

## Entstehung

Ein Datenträger (auf dem Lesen und Schreiben erlaubt ist) ist kein statisches Gebilde, sondern es finden dauernd Lese-, Schreib- und Löschoperationen statt. Manche Operationen geben Speicherplatz wieder frei, manche benötigen neuen Speicherplatz. Dieses dauernde Freigeben und erneute Belegen von Speicherblöcken führt dazu, dass sich zum einen die unbenutzten Speicherblöcke auf dem Datenträger verteilen (Freispeicherfragmentierung) und zum anderen die logisch zusammenhängenden Datenblöcke von Dateien und Metadateien nicht mehr hintereinander auf dem Datenträger abgespeichert werden (Dateifragmentation). Eine weitere Ursache von Fragmentierung ist das Verlängern schon bestehender Dateien.
Vereinfacht ausgedrückt: Wenn das Betriebssystem eine Datei auf dem Speichermedium ablegen will, kann es vorkommen, dass diese nicht zusammenhängend, sondern verstreut auf dem Datenträger gespeichert wird. Einige Dateisysteme prüfen nicht, ob die Daten innerhalb des freien Speicherplatzes zusammenhängend abgelegt werden können, sondern beginnen den Speichervorgang einfach in dem ersten freien Speicherplatzbereich. Es kommt jedoch nicht selten vor, dass dieser Speicherbereich nicht groß genug ist, um die gesamte Datei aufzunehmen. In diesem Fall beschreibt das Dateisystem den ersten freien Speicherbereich, bis dieser voll ist, und legt den restlichen Teil der Datei wiederum im nächsten freien Speicherbereich ab.
Im folgenden Diagramm wird dieser Vorgang veranschaulicht:
| Vorgang | Speicherblock | Speicherblock | Speicherblock | Speicherblock | Speicherblock | Speicherblock |
| Vorgang | 1 | 2 | 3 | 4 | 5 | 6 |
| Datei file.odt entsteht | file.odt | frei | frei | frei | frei | frei |
| Datei film.avi entsteht | file.odt | film.avi | film.avi | film.avi | frei | frei |
| file.odt wird größer | file.odt (1/2) | film.avi | film.avi | film.avi | file.odt (2/2) | frei |
| nach der Defragmentierung | file.odt | file.odt | film.avi | film.avi | film.avi | frei |

## Arten

Es gibt mehrere Arten der Fragmentierung (auch wenn mit Fragmentierung meist die Intrafile-Fragmentierung gemeint ist):
* Intrafile-Fragmentierung ist das Verteilen von Nutzdateien auf dem Datenträger, so dass kleine zusätzliche Verzögerungszeiten beim sequentiellen Lesen von Dateien auftreten können.
* Interfile-Fragmentierung ist das Verteilen von Dateien und Metadateien, die normalerweise nacheinander gelesen werden. Sie spielt vor allem beim korrelierten Lesen vieler kleiner Dateien eine Rolle (zum Beispiel Verzeichnisse mit vielen kleinen Bildern).
* Metafile-Fragmentierung ist das Fragmentieren von Verzeichnissen, Blockbelegungstabellen und ähnlichen Metainformationen.
* Fragmentierung des unbenutzten Speicherplatzes; sie stellt selbst keinen Nachteil für den Zugriff auf Dateien dar, ist aber eine der Ursachen für die Entstehung von Fragmentierung (Neuanlegen von Dateien).

## Auswirkungen

Beim Lesen und Schreiben von fragmentierten Daten kann es je nach Beschaffenheit des Speichermediums zu Geschwindigkeitseinbußen kommen. Bei modernen Dateisystemen (ReiserFS, XFS, NTFS) kommt es zusätzlich zu einer Vergrößerung der Metadaten, die beschreiben, wo sich die Daten auf dem Speichermedium befinden.
Am Beispiel einer Festplatte lässt sich die negative Auswirkung der Fragmentierung besonders gut verdeutlichen: Beim Lesen einer fragmentierten Datei, die überall verstreut auf der Magnetscheibe der Festplatte abgelegt ist, muss der Lesekopf der Festplatte in kurzen Abständen sehr oft und über längere Strecken hinweg auf der Magnetscheibe neu positioniert werden. Dies bewirkt viele kleine Verzögerungen, die sich im Bereich von einigen Millisekunden bewegen. Je nach Größe der Datei, Fragmentierungsgrad und Zugriffszeit der Festplatte können sich diese Verzögerungen über den gesamten Lesevorgang zu einer spürbaren Verlangsamung summieren.
Im Gegensatz dazu existieren auch andersartige Speichermedien, die ohne bewegte Teile auskommen und damit nicht von mechanisch begründeten Verzögerungen bei Lese- und Schreiboperationen betroffen sind. Dazu gehören unter anderem Datenträger, die auf Speicherchips (vornehmlich Flash-Speicher) aufbauen, beispielsweise USB-Sticks, Speicherkarten oder SSDs. Nur teilweise von diesem Problem betroffen sind Hybridfestplatten, die sowohl Magnetplatten als auch Speicherchips zum dauerhaften Ablegen von Daten nutzen.
Jedoch können auch derartige Speichermedien von einem fragmentierten Dateisystem verlangsamt werden. Aufgrund der anderen internen Organisation des Speichers sind die Auswirkungen einer Fragmentierung abhängig von Gerät und Hersteller jedoch sehr unterschiedlich und können nicht mit einer Festplatte verglichen werden. Der Controller dieser Speichermedien legt die Daten je nach Modell mitunter nicht in der physischen Reihenfolge auf den Speicherchips ab, die vom Dateisystem abgebildet wird, denn da sich Speicherchips nicht beliebig oft beschreiben lassen, muss beispielsweise das häufige Schreiben auf dieselbe physische Adresse mittels wear leveling vermieden werden. Dadurch lässt sich keine verlässliche Aussage bezüglich der Auswirkung von Fragmentierung auf Flash-Speichermedien treffen. Sicher ist jedoch, dass sich das Durchführen einer Defragmentierung negativ auf die Lebensdauer von Flash-Speichermedien auswirkt, da diese nicht unbegrenzt oft beschreibbar sind.

## Vermeiden und Verringern

Es gibt verschiedene Strategien, um die Fragmentierung eines Dateisystems zu reduzieren. Diese Strategien sind primär auf Festplatten als verwendete Datenträger bezogen und könnten sich bei anderen Speichermedien nicht oder nur wenig vorteilhaft auswirken.
Bei allen Arten von Dateisystemen bewirkt ein Freilassen von 5 bis 20 Prozent des Speicherplatzes ein Verringern der Fragmentierung. Je voller ein Dateisystem belegt ist, desto wahrscheinlicher tritt auch Fragmentierung auf, da die freien Bereiche immer kleiner werden. Sobald eine Datei abgelegt werden soll, die größer ist als die größte „Lücke“, ist eine kontinuierliche Speicherung nicht mehr möglich und sie fragmentiert zwangsläufig.

### Vermeiden von Fragmentierung

Ein probates Mittel ist das Trennen von Programmen und von Nutzerdaten. Das Dateisystem macht dazu keinen Unterschied, jedoch entstehen Fragmente bei Nutzerdaten fortlaufend und bei Programmen mit jedem Update. Eine Trennung erfordert also das Verteilen auf verschiedene Partitionen. Dazu gibt es passende Hilfsmittel, insbesondere für das Verlagern der Nutzerdaten. Im Ergebnis wird auch das Defragmentieren der Partitionen weniger Zeit erfordern.

### Parametrieren der Partitionen

Einfache Maßnahmen sorgen für eine geringere Fragmentierung entsprechend dem Volumen der verschiedenen Dateiklassen.
* geschicktes Verteilen von Betriebssystem, Verzeichnisbäumen und Nutzdaten über die Festplatten mittels geeigneter Software
* Verwendung einer höheren Blockgröße des Dateisystems (dabei wird jedoch mitunter Speicherplatz verschwendet)

### Parametrieren der Applikationen und der Systemdienste

Weitere Maßnahmen beziehen sich auf die Parametrierung der Applikationen:
* Preallocation (man reserviert vorsorglich schon Blöcke, obwohl diese noch nicht benötigt werden)
* Spätes Festlegen der zu benutzenden Speicherblöcke (late allocation) statt sofortigen Festlegens (early allocation)
* mehrstufige Allozierungssysteme (Zerlegung einer Festplatte in Cluster, Blockgruppen, Blöcke).

## Fragmentierungsgrad eines Dateisystems

Es gibt verschiedene Möglichkeiten, die Fragmentierung eines Dateisystems anzugeben:
* Verhältnis der Lese- oder Schreib-Geschwindigkeit des fragmentierten (realen) Dateisystems gegenüber einem nichtfragmentierten (optimalen) Dateisystem
* Verhältnis der Zahl der fragmentierten Dateien zur Gesamtanzahl der Dateien
* Verhältnis des durch fragmentierte Dateien belegten Speicherplatzes zum gesamten belegten Speicherplatz
* Verhältnis des durch fragmentierte Dateien belegten Speicherplatzes zum gesamten vorhandenen Speicherplatz
* Anzahl der zusammenhängenden Blöcke zur Gesamtanzahl der belegten Blöcke
* Anzahl der zusammenhängenden Blöcke zur Gesamtanzahl der vorhandenen Blöcke.
Die durch unterschiedliche Verfahren bestimmten Fragmentierungsgrade sind nicht vergleichbar; nicht einmal durch gleiche Verfahren bestimmte Fragmentierungen sind vergleichbar, weil die realen Auswirkungen bei vielen Verfahren weiterhin von Blockgröße, durchschnittlicher Dateigröße sowie Geschwindigkeit und interner Speicherorganisation des Mediums abhängen.
Darüber hinaus ist der Fragmentierungsgrad allein nicht eine verlässliche Messgröße für die Performance eines Dateisystems. Zum einen liegt das daran, dass in einigen Dateisystemen auch die Metadaten fragmentiert werden können, bei anderen jedoch nicht. (Die MFT in NTFS ist zum Beispiel davon betroffen.) Zum anderen verfügen verschiedene Dateisysteme über verschiedene Mechanismen, um den Performanceeinbruch bei vorhandener Fragmentierung zu vermindern.
Das Dateisystem extended filesystem von Linux implementiert mehrere Mechanismen, um Fragmentierung zu reduzieren. Dazu gehört das Zusammenfassen von Blöcken zu Blockgruppen. Dateien werden dann möglichst gleichmäßig auf Blockgruppen verteilt. Dadurch entsteht eine gleichmäßige Verteilung von Dateien (und freien Bereichen) auf dem Speichermedium. Im Gegensatz zu FAT werden nun Dateien immer in möglichst schlecht passende freie Bereiche gelegt, also kleine Dateien in große Lücken, um auf Größenänderungen der betreffenden Dateien ohne Verluste reagieren zu können. Hinter jeder Datei versucht ext2 auch genug Platz zu lassen, so dass kleinere Größenänderungen von Dateien nicht prompt zu einer Fragmentierung führen. Dieser Mechanismus wurde durch Extents in ext4 weiter verbessert. Durch die Verteilung der Daten über den kompletten nutzbaren Bereich fällt im Serverbetrieb die Fragmentierung weniger ins Gewicht als beim Lesen im „Burst“-Modus. So ordnen moderne Festplatten-Scheduler die Lese- oder Schreibanforderungen derart, dass Suchzeiten (z. B. des Schreib-Lese-Kopfes der Platte) minimal werden.
Eine weitergehende Reduzierung von Fragmenten erhält man unter anderem durch das Dateisystem XFS, welches Schreiboperationen verzögert (delayed write) und im RAM möglichst komplett zwischenspeichert. Bei kleinen Dateien ist so die komplette Dateigröße dem Dateisystem bekannt, bevor die Datei auf den Datenträger geschrieben wird. So kann XFS eine optimale Stelle für die Datei finden. Passt die Datei nicht komplett in das RAM, wird natürlich schon vorher begonnen den Puffer auf den Datenträger zu schreiben.
Bei der Beurteilung der Fragmentierung von Dateisystemen muss man zwischen Durchsatz und Performance unterscheiden: Performance ist die Datenrate, die ein Anwender mit einem einzelnen Prozess maximal vom Dateisystem (in MB/s) erreichen kann. Durchsatz ist die Datenrate, die das Dateisystem über alle Anwender und Prozesse (mit mehreren, konkurrierenden IO-Anfragen) summiert liefern kann. In Multitasking- bzw. Multiuser-Systemen ist der Durchsatz oft sehr viel größer als die Performance. Das Betriebssystem Linux hat Algorithmen, die den Durchsatz, nicht die Performance des Systems erhöhen. Starke Fragmentierung wirkt sich stärker auf die Performance aus. Bei Systemen mit vielen konkurrierenden Anfragen an das Dateisystem wird eine (größere) Datei ohnehin nicht in einem Stück gelesen, es werden gleichzeitig auch andere Anfragen getätigt.

## Defragmentierung

Je nach Dateisystem gibt es verschiedene Methoden zur Defragmentierung. Während es vor allem für ältere Dateisysteme tatsächlich keine hauseigenen Wege zur Defragmentierung gibt, sind für moderne Dateisysteme Defragmentierprogramme verfügbar.
Folgende Methoden sind üblich:

### Kopieren der Daten auf eine leere Partition

    Diese Methode ist aufwändiger, aber zuverlässiger. Da jede Datei einzeln kopiert wird, werden auf der Quellpartition alle Teile der Datei zusammengesetzt, welche auf der Zielpartition in aufeinanderfolgenden Speicherblöcken gespeichert werden. Alternativ können die Dateien in ein Archiv auf derselben Partition gespeichert werden; die Originaldateien werden anschließend gelöscht und das Archiv wieder ausgepackt. Der Nachteil ist der doppelte Speicherplatzbedarf in Form einer zusätzlichen Partition bzw. von freiem Platz auf der Partition. Dafür ist diese Möglichkeit bei jedem Dateisystem anwendbar.

### Nutzung von Defragmentierprogrammen

    Dabei muss man zwischen Offline- und Onlinedefragmentierung unterscheiden. Bei ersterer darf das Dateisystem nicht eingebunden sein. Damit ist es zum Beispiel nicht möglich, die Systempartition eines laufenden Systems zu defragmentieren. Bei der Onlinedefragmentierung besteht dieses Problem in der Regel nicht. Ein Beispiel für ein Dateisystem, das Onlinedefragmentierung unterstützt, ist XFS, welches mit dem Programm xfs_fsr defragmentiert werden kann.

### Unter Windows

Neue Fragmentierung tritt unter den verschiedenen autonomen Systemdiensten fortlaufend auf. Jedes Systemupdate erzeugt zahlreiche neue Fragmente. Das Defragmentieren sollte daher wiederholt werden, wenn die Systemleistung nach Updates oder nach Neuinstallationen großer Applikationspakete, beispielsweise Office-Paketen, erheblich sinkt.

#### MS-DOS-basierte Betriebssysteme (historisch)

Unter MS-DOS wurden Dateiverzeichnis und Dateiinhalt nicht getrennt. Daher wurde ein Defragmentieren nur durch Schreiben an anderem Ort erreicht. Das Programm defrag.exe wurde mit MS-DOS Version 6 eingeführt und war eine eingeschränkte lizenzierte Version von Norton SpeedDisk. Es konnte – wie die Vollversion von SpeedDisk – in bestimmten Fällen zu einer wesentlichen Geschwindigkeitssteigerung auf den damals üblichen Computern (386/486) führen. Der Computer musste sich nach der Defragmentierung nicht mehr einzelne Bruchstücke einer Datei über die gesamte Festplatte zusammensuchen. Dieses Phänomen konnte bei diesen älteren Computern sogar „mitverfolgt“ werden, indem die Festplattengeräusche analysiert wurden (Klackern von einer zur anderen Seite, später: durchgängiges Rattern).
Defrag.exe unter DOS erlaubte bis zu Windows Me (die letzte Version von DOS-basiertem Windows, siehe Windows 9x) ein genaues visuelles Verfolgen dieses Vorgangs. Beispielsweise wurden Blöcke von Dateien zunächst im Lesezugriff grün markiert, eine freie Stelle auf der Festplatte gesucht und zum Schreiben rot unterlegt. Wurde keine genügend große freie Stelle innerhalb des Bearbeitungssegments gefunden, wanderten die Daten zumeist an das Ende der Festplatte. Nach dem Freiräumen wurde ebendieser Block wieder verschoben.
Unter DOS waren auch Programme von Fremdanbietern (Norton, Digital Research) verbreitet (DISKOPT.EXE/DSKSPEED.EXE). Gemeinsam ist den Defragmentierungsprogrammen, dass sie optional eine Sortierung nach Dateiname, -größe oder -datum anbieten, die sich aber nicht oder kaum auf die Effizienz des Dateisystems auswirken. Je nach gewählter Option (z. B. Sortierung nach Änderungsdatum oder nach bestimmten Dateinamenserweiterungen) lassen sich bestimmte Systemdateien an den Anfang der Partition verschieben, sodass dieser Bereich kaum noch von erneuter Fragmentierung betroffen ist. Dadurch kann sich der Prozess der künftigen Fragmentierung verlangsamen und die Systemperformance bleibt länger stabil.

#### NT-basierte Betriebssysteme

Mit dem neuen Dateisystem NTFS werden das Dateiverzeichnis und die Dateiinhalte getrennt geschrieben. Das Defragmentieren verläuft daher in mehreren Phasen für die Verzeichnisse (Folder) und Dateien (Files). Ein erkennbarer Zeitgewinn tritt zuerst ein, wenn die Dateiverzeichnisse defragmentiert werden. Das ist mit Produkten von Fremdanbietern möglich.
1995 lizenzierte Executive Software den Windows-NT-Quelltext und veröffentlichte auf dessen Basis im April das Defragmentierungsprogramm Diskeeper für Windows NT 3.5, später auch für den Nachfolger Windows NT 3.51. Dies verursachte jedoch große Probleme, sobald der Anwender ein Service Pack installierte, worauf sich Microsoft entschied, mit Executive Software zusammenzuarbeiten, um eine standardisierte API zur Defragmentierung in Windows NT 4.0 zu integrieren. Zwar war diese undokumentiert und Windows NT 4.0 hatte kein Defragmentierungsprogramm im Lieferumfang, aber zahlreiche Drittanbieter veröffentlichten Defragmentierungsprogramme für Windows NT.
Windows 2000 enthält ein Defragmentierungsprogramm von Microsoft. Eine genaue Vorgehensweise des Programms ist allerdings im Vergleich zu Windows 9x nur noch pauschal für die gesamte Festplatte sichtbar. Einzelne bearbeitete Dateien werden zwar in der Statusleiste angezeigt, jedoch wird intern nur ein Timer verwendet, der den Fortschritt anzeigt. Mit Windows Vista wurde die grafische durch eine prozentuale Anzeige ersetzt.
Windows 7 defragmentiert sich bei geringer Systemauslastung von Zeit zu Zeit selbsttätig. Messungen zufolge bewirkt dies eine spürbare Performanceverbesserung während des Hochfahrens und während des Betriebs.

### Unter macOS

Die von macOS verwendeten Dateisysteme APFS und HFS+, historisch auch HFS, sind so ausgelegt, dass sie den größten freien Speicherblock auf der Festplatte suchen in dem eine Datei gespeichert werden soll. Erst wenn eine Datei nicht in den größten freien Speicherblock passt, wird die Datei aufgeteilt (fragmentiert) und der noch nicht geschriebene Teil wird in einem weiteren Block gespeichert.

### Unter Unix und Linux

Es wird gelegentlich behauptet, dass unixoide Betriebssysteme keine Defragmentierung benötigen würden. Entstanden ist diese Behauptung aus dem Inhalt der Masterarbeit A Fast Filesystem for UNIX von Bill Joy, Samuel Leffler und Kirk McKusick. Die dort gemachten Aussagen beziehen sich jedoch nur auf das UFS, das in der Tat auch bei extrem ungünstiger Nutzung nicht merklich an Geschwindigkeit verliert, und sind nicht generell auf andere Dateisysteme übertragbar.
Wie im Abschnitt „Vermeiden und Verringerung von Fragmentierung“ erwähnt, sind in den verwendeten Dateisystemen zwar Gegenmaßnahmen implementiert, dennoch tritt Fragmentierung in der Praxis auf. Auch existieren diverse Programme zur Defragmentierung unter Unix und ähnlichen Betriebssystemen.

### Werkzeuge

Unter Windows-NT-Betriebssystemen ab Windows 2000 steht nur Administratoren der mitgelieferte Defragmentierer zur Verfügung, normalen Benutzern wird der Zugriff verwehrt. Im Vergleich zu Fremdprodukten verfügt der auf Diskeeper basierende Defragmentierer jedoch nur über einen eingeschränkten Funktionsumfang.
Ab Windows 7 läuft standardmäßig einmal wöchentlich der Windows-eigene Defragmentier-Dienst im Hintergrund. Dieser kann auch deaktiviert werden, wenn der Einsatz anderer Programme bevorzugt wird.
Im Freewarebereich sind beispielsweise Ultimate Defrag, MyDefrag und Defraggler bekannt. Sie unterstützen eine Fragmentierung nach verschiedenen Kriterien, was erhebliche Laufzeit erspart.
Die unter Linux und Unix-Varianten verwendeten Dateisysteme beugen der Fragmentierung zumeist vor, deshalb wird weniger Wert auf die Defragmentierung gelegt. Dennoch sind solche Dateisysteme nicht gegen Fragmentierung resistent. ext2 kann durch defrag, XFS mit Hilfe von xfs_fsr defragmentiert werden.
Andere populäre Dateisysteme wie beispielsweise ReiserFS und ext3/ext4 stellen solche Programme zum Defragmentieren nicht zur Verfügung. Die einzige Lösung zum Defragmentieren stellt das Kopieren auf eine leere Partition dar (s. o.).
Zur Defragmentierung des von Apple in macOS verwendeten HFS+ läuft im Hintergrund ein Defragmentierungsprogramm, das dem Benutzer keinerlei Ausgabe präsentiert und die Defragmentierung bei Festplattenzugriffen automatisch unterbricht, so wie es Microsoft auch bei Windows Vista realisiert hat.