ZFS auf Linux/ ashift

Aus Wikibooks
Zur Navigation springen Zur Suche springen

ashift[Bearbeiten]

Was ist ashift?[Bearbeiten]

Fü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 an (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?[Bearbeiten]

user@host> zpool get ashift <POOLNAME>
NAME      PROPERTY  VALUE   SOURCE
drifters  ashift    0       default

Wie setzt man den Wert von ashift?[Bearbeiten]

Der 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?[Bearbeiten]

Die 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:

ZFS ashift 1.svg

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.