Linux/Software-RAID/Alignment
RAID-Alignment ist kurze Beschreibung
Beschreibung
- Datenträger, RAID-Verbunde und Dateisysteme fassen Daten jeweils für sich in Blöcke zusammen, bevor sie gespeichert werden.
- Diese Blöcke haben im Allgemeinen alle unterschiedliche Größen.
- Ein Beispiel für das Lesen einer sehr kleinen Datei:
- Das Dateisystem möchte einen einzelnen 4 KiB großen Block lesen
- Das RAID muss dafür den oder die 512 KiB großen RAID-Blöcke (bei RAIDS oft Chunks genannt) laden, in denen der Dateisystem-Block abgelegt ist.
- Die Datenträger müssen dafür wiederum alle 512 Byte großen Blöcke (hier meist Sektoren genannt) laden, die am entsprechenden RAID-Block beteiligt sind.
- Im Idealfall muss also das RAID nur einen 512 KiB Block laden und die Datenträger dafür 1024 Blöcke (512 KiB = 512 B * 1024).
- Dafür müssen diese geschachtelten Blöcke jedoch aufeinander ausgerichtet sein.
- Im schlechtesten Fall könnte ein Dateisystem-Block kurz vor dem Ende eines RAID-Blocks liegen, so dass für einen Dateisystem-Block zwei RAID-Blöcke geladen werden müssen.
- Analog könnte ein RAID-Block auch 1025 anstatt 1024 Datenträger-Blöcke belegen, falls er mitten in einem Datenträger-Block anfängt.
- Das Lesen eines Dateisystem-Blocks würde damit im schlechtesten Fall das Laden von 2050 Datenträger-Blöcken erfordern.
- Dies führt zu dramatischen Performance-Einbußen schon beim Lesen.
- Da beim Schreiben oft auch zuerst die vorherigen Daten gelesen werden müssen, sind die Einbußen beim Schreiben noch stärker.
- Daher sollte bei der Verwendung von Blockgeräten immer auf das Alignment, also die Ausrichtung der verschiedenen Block-Arten aufeinander, geachtet werden:
- Der erste Dateisystem-Block eines RAID-Blocks sollte genau am Anfang des RAID-Blocks beginnen.
- Ein RAID-Block sollte genau am Anfang eines Datenträger-Blocks beginnen.
- Die Größe der RAID-Blöcke sollte ein ganzzahliges Vielfaches der Dateisystem-Blöcke sein.
- Die Größe der RAID-Blöcke sollte ein ganzzahliges Vielfaches der Datenträger-Blöcke sein.
- Partitionen sollten auf Sektorgrenzen der Datenträger ausgerichtet sein, wie im Abschnitt Partitionierung beschrieben.
- Dem Dateisystem sollten Informationen zum unterliegenden RAID bereitgestellt werden, um seine Blöcke passend auszurichten.
- Falls noch weitere Schichten zwischen Dateisystem und Datenträger verwendet werden, z. B. bei Kryptografie, muss auch bei diesen auf das Alignment geachtet werden.
- Das Dateisystem möchte einen einzelnen 4 KiB großen Block lesen
Anwendung
- Datenträger, RAID-Verbunde und Dateisysteme fassen Daten jeweils für sich in Blöcke zusammen, bevor sie gespeichert werden.
- Diese Blöcke haben im Allgemeinen alle unterschiedliche Größen.
- Um eine optimale Performance zu erzielen, sollten die Größen aufeinander abgestimmt sein.
- Dafür muss zunächst die sog. Chunk Size, also die Datenmenge, die in einem einzelnen Schreibvorgang geschrieben wird, bekannt sein.
Ermittlung der Chunk Size
# mdadm -D /dev/md0 | grep "Chunk Size" Chunk Size : 512K
Bei einem RAID 5 mit Standardeinstellungen. Es werden also 512 KiB Chunks verwendet.
Änderung der Chunk Size
- Chunk Size auf 64 KiB ändern.
- Macht nur Sinn, wenn auf dem RAID hauptsächlich sehr kleine Dateien geschrieben bzw. gelesen werden sollen.
# mdadm --grow -c 64 /dev/md0
Berechnung des Alignments
- Hieraus können, zusammen mit der Anzahl der Partitionen und des RAID-Levels, die Dateisystem-Parameter berechnet werden.
- Am einfachsten geht das mittels eines Raid-Stride-Calculators.
- Alternativ können die Parameter auch von Hand ermittelt werden.
- block-size - Die Größe der Dateisystemblöcke in Bytes. Heutzutage werden fast ausschließlich 4096 Byte (4 KiB) Blöcke verwendet.
- stride-size - Die Chunk Size umgerechnet in Dateisystemblöcke. Bei 512 KiB Chunk Size mit 4 KiB Blöcken ergibt sich 512 KiB/ 4 KiB = 128.
- stripe-width - Die Größe eines Datenstreifens, also die Menge an Blöcken, die geschrieben wird, wenn ein voller Chunk auf jedes Laufwerk geschrieben wird. Diese berechnet sich aus stride-size * Anzahl der effektiv nutzbaren Partitionen. Bei einem RAID 5 über 4 Partitionen ergibt sich hier 128 * 3 = 384.
- Details zur Anzahl der effektiv nutzbaren Partitionen findet man im Artikel RAID.
Sind die Parameter ermittelt, wird das Dateisystem erstellt:
# mkfs.ext4 -b 4096 -E stride=128,stripe-width=384 /dev/md0