ZFS auf Linux/ Die richtige Poolkonfiguration
Die richtige Poolkonfiguration
[Bearbeiten]Um die richtige Poolkonfiguration zu ermitteln, muss man folgende Zielgrößen in Einklang bringen:
- Redundanz/Fehlertoleranz
- Performance
- Overhead
Striping ohne Redundanzen
[Bearbeiten]Benchmarks mit verschieden großen Pools ohne Redundanzen haben gezeigt, dass die Geschwindigkeit nicht wie zu erwarten linear zur Anzahl der vdevs steigt. Mit zunehmender Größe des Pools nimmt die Transferrate pro Festplatte kontinuierlich und gleichmäßig ab. Während die Schreibgeschwindigkeit bis zu einer Größe von 24 vdevs jeweils nahezu identisch bzw. sogar höher als die Leserate ist, sinkt diese anschließend schneller.
-
Geschwindigkeiten verschiedener Poolgrößen (Striping)
-
Geschwindigkeiten verschiedener Poolgrößen pro vdev (Striping)
RAID-Z2 Konfigurationen
[Bearbeiten]Mit steigender Größe weist das RAID-Z2 schlechtere Schreibgeschwindigkeiten auf. Konfigurationen mit mehreren kleinen RAID-Z2s erreichen deutlich höhere Geschwindigkeiten. Folgende Diagramme zeigen Pools, die aus unterschiedlich vielen RAID-Z2s bestehen und jeweils den gleichen nutzbaren Speicher ausweisen:
-
Geschwindigkeiten verschiedener RAID-Z2-Konfigurationen
-
Geschwindigkeiten verschiedener RAID-Z2-Konfigurationen
Bis zu einer Größe von 8 vdevs pro RAID-Z2 können keine spürbaren Geschwindigkeitsverluste im Vergleich zum Pool ohne Paritätsinformationen festgestellt werden. Die CPU-Auslastung liegt bei allen Konfigurationen bei ca. 75%. Tests mit noch größeren Pools zeigten, dass es sich dabei nicht um den begrenzenden Faktor handelt. Mit zunehmender Größe der RAID-Zs steigt allerdings die Auslastung der CPU beim Lesen, während die Geschwindigkeit sogar sinkt.
Die optimale Konfiguration liegt deshalb bei etwa 8 vdevs pro RAID-Z2.
Die besten RAID-Z2-Konfigurationen
[Bearbeiten]Zum Vergleich wurden die zwei optimalen RAID-Z2-Konfigurationen für 40 Festplatten getestet. Da die Komprimierung zusätzlich zur Berechnung der Paritäten des RAID-Z2 für eine hohe Belastung der CPU sorgt, wurden Benchmarks mit LZ4 und deaktivierter Komprimierung durchgeführt. Für realistische Bedingungen wurden die Pools vor jedem Test mit zufälligen Schreibzugriffen zu 60% gefüllt.
Da die Geschwindigkeiten nahezu identisch sind und bei der Konfiguration aus 4 RAID-Z2s im Verhältnis weniger Festplatten für Paritäten benötigt werden, kann diese durchaus zum Einsatz kommen.
Vergleich verschiedener Poolkonfigurationen
[Bearbeiten]Folgende Konfigurationen wurden getestet:
- Striping: 20 Festplatten ohne Paritäten
- Spiegelpaare: 20+20 Festplatten paarweise gespiegelt; Spiegelpaare sind durch Striping verbunden
- RAID-Z1: 20+1 Festplatten im RAID-Z1-Verbund
- RAID-Z2: 20+2 Festplatten im RAID-Z2-Verbund
- RAID-Z3: 20+3 Festplatten im RAID-Z3-Verbund
Folgende Geschwindigkeiten konnten dabei ermittelt werden:
Die drei RAID-Z Konfigurationen zeigen mit zunehmender Anzahl an Paritätsinformationen eine schlechtere Schreibgeschwindigkeit. Eine Ursache für die verhältnismäßig schlechte Schreibgeschwindigkeit ist die Größe der erstellten RAID-Zs. Da die Integrität der Daten ausschließlich anhand der Prüfsummen bestätigt wird, liegen die Lesegeschwindigkeiten der verschiedenen RAID-Z-Level auf demselben Niveau. Die dennoch etwas niedrigere Leserate, als beim reinen Striping, ist der dynamischen Breite der Stripes eines RAID-Z geschuldet, wodurch deren exakte Position immer erst ermittelt werden muss.
Da bei den Spiegelpaaren alle Daten redundant auf zwei verschiedenen Festplatten abgelegt werden, kann im Vergleich zum Pool ohne Paritäten eine 37 % höhere Lesegeschwindigkeit erzielt werden. Diese Erhöhung wird erreicht, indem später benötigte Daten vorausschauend vom Spiegelpartner gelesen werden. Da die Daten gleichmäßig über die Spiegelpaare verteilt werden und das vorausschauende Lesen damit nicht ganz trivial ist, wurde nicht die theoretisch mögliche Verdopplung der Geschwindigkeit erreicht.
Tabellarische Übersichten
[Bearbeiten]Mit Hilfe der folgenden beiden Tabellen kann man die richtige Poolkonfiguration für gegebene Anforderungen finden.
Die 1. Tabelle entstammt der ZFS-BSD-Literatur [1], was ihre Anwendbarkeit auf Linux-Umgebungen nicht schmälert:
Konfiguration | IOPS Lesen | IOPS Schreiben | MB/s Lesen | MB/s Schreiben | Verfügbarer Speicherplatz | Fehlertoleranz |
Stripe | 250 | 250 | 100 | 100 | 1TB(100%) | keine |
2x Stripe | 500 | 500 | 200 | 200 | 2 TB (100%) | keine |
1x2 Platten Spiegel | 500 | 250 | 200 | 200 | 1 TB (50%) | 1 |
1x3 Platten Spiegel | 750 | 250 | 300 | 100 | 1 TB (33%) | 2 |
1x3 Platten RAID-Z1 | 250 | 250 | 200 | 200 | 2 TB (66%) | 1 |
2x2 Platten Spiegel | 1000 | 500 | 400 | 200 | 2 TB (50%) | 2 (1 pro VDEV) |
1x4 Platten RAID-Z1 | 250 | 250 | 300 | 300 | 3 TB (75%) | 1 |
1x4 Platten RAID-Z2 | 250 | 250 | 200 | 200 | 2 TB (50%) | 2 |
1x5 Platten RAID-Z1 | 250 | 250 | 400 | 400 | 4 TB (80%) | 1 |
1x5 Platten RAID-Z2 | 250 | 250 | 300 | 300 | 3 TB (60%) | 2 |
1x5 Platten RAID-Z3 | 250 | 250 | 200 | 200 | 2 TB (40%) | 3 |
3x2 Platten Spiegel | 1500 | 750 | 600 | 300 | 3 TB (50%) | 3 (1 pro VDEV) |
2x3 Platten Spiegel | 1500 | 500 | 600 | 200 | 2 TB (33%) | 4 (2 pro VDEV) |
1x6 Platten RAID-Z1 | 250 | 250 | 500 | 500 | 5 TB (83%) | 1 |
1x6 Platten RAID-Z2 | 250 | 250 | 400 | 400 | 4 TB (66%) | 2 |
1x6 Platten RAID-Z3 | 250 | 250 | 300 | 300 | 3 TB (50%) | 3 |
6x2 Platten Spiegel | 3000 | 1500 | 1200 | 600 | 6 TB (50%) | 6 (1 pro VDEV) |
4x3 Platten Spiegel | 3000 | 1000 | 1200 | 400 | 4 TB (33%) | 8 (2 pro VDEV) |
1x12 Platten RAID-Z1 | 250 | 250 | 1100 | 1100 | 11 TB (92%) | 1 |
2x6 Platten RAID-Z1 | 500 | 500 | 1000 | 1000 | 10 TB (83%) | 2 (1 pro VDEV) |
3x4 Platten RAID-Z2 | 750 | 750 | 900 | 900 | 9 TB (75%) | 3 (1 pro VDEV) |
1x12 Platten RAID-Z2 | 250 | 250 | 1000 | 1000 | 10 TB (83%) | 2 |
2x6 Platten RAID-Z2 | 500 | 500 | 800 | 800 | 8 TB (66%) | 4 (2 pro VDEV) |
1x12 Platten RAID-Z3 | 250 | 250 | 900 | 900 | 9 TB (75%) | 3 |
2x6 Platten RAID-Z3 | 500 | 500 | 600 | 600 | 6 TB (50%) | 6 (3 pro VDEV) |
18x2 Platten Spiegel | 9000 | 4500 | 3600 | 1800 | 18 TB (50%) | 18 (1 pro VDEV) |
12x3 Platten Spiegel | 9000 | 3000 | 3600 | 1200 | 12 TB (33%) | 24 (2 pro VDEV) |
1x36 Platten RAID-Z2 | 250 | 250 | 3400 | 3400 | 34 TB (94%) | 2 |
2x18 Platten RAID-Z2 | 500 | 500 | 3200 | 3200 | 32 TB (89%) | 4 (2 pro VDEV) |
4x9 Platten RAID-Z2 | 1000 | 1000 | 2800 | 2800 | 28 TB (78%) | 8 (2 pro VDEV) |
6x6 Platten RAID-Z2 | 1500 | 1500 | 2400 | 2400 | 24 TB (66%) | 12 (2 pro VDEV) |
Die 2. Tabelle fasst eigene Messungen auf der beschriebenen Linux-Plattform zusammen [2]:
Konfiguration | MB/s Lesen | MB/s Schreiben | Verfügbarer Speicherplatz | Fehlertoleranz | ||
1x Stripe | 160 | 130 | 100% | keine | ||
8x Stripe | 1334 | 1339 | 100% | keine | ||
16x Stripe | 2300 | 2375 | 100% | keine | ||
20x Stripe | 2702 | 2643 | 100% | keine | ||
24x Stripe | 3052 | 2882 | 100% | keine | ||
32x Stripe | 3753 | 3207 | 100% | keine | ||
40x Stripe | 3989 | 3613 | 100% | keine | ||
20x2 Platten Spiegel | 3696 | 2162 | 50% | 20 | ||
1x21 Platten RAID-Z1 | 2281 | 1822 | 95% | 1 | ||
1x8 Platten RAID-Z2 | 818 | 930 | 75% | 2 | ||
8x5 Platten RAID-Z2 | 3060 | 2934 | 60% | 16 | ||
4x8 Platten RAID-Z2 | 2931 | 2924 | 75% | 8 | ||
2x14 Platten RAID-Z2 | 2594 | 2136 | 86% | 4 | ||
1x22 Platten RAID-Z2 | 2211 | 1698 | 91% | 2 | ||
1x26 Platten RAID-Z2 | 2369 | 1277 | 92% | 2 | ||
1x23 Platten RAID-Z3 | 2209 | 1431 | 87% | 3 |