ZFS auf Linux/ ashift
ashift
BearbeitenWas ist ashift?
BearbeitenFür einen performanten Zugriff auf die Hardware muss ZFS die Größe der Sektoren der Festplatte (physical block size) kennen. ZFS fragt die Festplatten danach. Fällt die Antwort falsch oder unverständlich aus, muss der Administrator korrigierend eingreifen, damit die Performance nicht leidet, indem er den Wert der ZFS-Variablen "ashift" manuell setzt. ashift gibt die Sektor-Größe in Byte als log2 (4096 = 212) an [1] .
Auch wenn der Wert für ashift beliebig unpassend gewählt ist, leidet die Zuverlässigkeit in keinem Fall.
Moderne Platten haben eine physikalische Sektorgröße von 4096 Byte, alte von 512 Byte. Es wird aber auch noch mit (irreführenden) logischen Sektorgrößen gearbeitet, die von der gesuchten physikalischen abweichen.
Wie ermittelt man die physikalische Sektorgröße?
Bearbeiten[lsblk] kann die Infos über die Platten, u.a. auch die gesuchte physikalische Sektorgröße (PHY-SEC), auslesen:
user> sudo lsblk -o NAME,MOUNTPOINT,PHY-SEC
NAME MOUNTPOINT PHY-SEC
sda 4096
├─sda1 4096
└─sda9 4096
...
sdar 4096
├─sdar1 4096
└─sdar9 4096
sdas 512
├─sdas1 [SWAP] 512
├─sdas2 / 512
└─sdas3 /NOBACKUP 512
Wie ermittelt man den aktuellen Wert von ashift?
Bearbeitenuser@host> zpool get ashift <POOLNAME>
NAME PROPERTY VALUE SOURCE
drifters ashift 0 default
Wie setzt man den Wert von ashift?
BearbeitenDer Wert für ashift kann nur beim Anlegen eins Pools bzw. beim Hinzufügen weiterer vdevs gesetzt werden.
user@host> zpool create -o ashift=12 <POOLNAME> <VDEVS>
Wie wirkt sich der Wert von ashift auf die Performance aus?
BearbeitenDie zulässigen Werte reichen von 512 B bis 8 KiB. Um andere Einflüsse während des Benchmarks auszuschließen, wurde ein Pool angelegt, der nur aus einer einzelnen Festplatte besteht. Zur Vermeidung von parallelen Zugriffen, wurde fio in diesem Test nur mit einem Job ausgeführt. Um Caching-Effekten zu verhindern, wurden trotzdem 1000 GiB Daten geschrieben. Die für den Test verwendete Festplatte nutzt das AF und arbeitet mit einer physischen Sektorgröße von 4 KiB. In nachfolgendem Diagramm sind die Ergebnisse der Benchmarks zu sehen:
Die Lesegeschwindigkeiten liegen bei allen Blockgrößen etwa auf dem gleichen Niveau. Grund dafür sind die Caching-Funktionalitäten der Festplatten-Controller, die immer den gesamten Sektor, aus dem zuletzt gelesen wurde, zwischenspeichern. Da dieser bei der Verwendung kleiner Blockgrößen nicht mehrfach gelesen werden muss, können ähnliche Geschwindigkeiten erreicht werden. Beim Vergleich der Schreibgeschwindigkeiten ist mit steigender Blockgröße eine Zunahme zu erkennen. Während sie bei einer Blockgröße von 512 B bei 98 MiB/s liegt, steigt sie bei Anpassung an die Sektorgröße der Festplatte (4 KiB) auf 128 MiB/s an. Dieser Effekt entsteht durch das mehrfache Schreiben von Sektoren bei Verwendung zu kleiner Blockgrößen. Der Benchmark zeigt eindeutig, dass eine Anpassung der physischen Blockgröße an die Sektorgröße der Festplatten optimale Geschwindigkeiten gewährleistet. Eine weitere Erhöhung der Größe bringt keine spürbare Geschwindigkeitssteigerung.
Darüber hinaus kann den Ergebnissen die maximal mögliche Lese- bzw. Schreibgeschwin- digkeit einer einzelnen Festplatte des Testsystems entnommen werden. Diese liegt bei etwa 160 bzw. 130 MiB/s und kann zum Vergleich mit verschiedenen zpool -Konfigurationen herangezogen werden.