Ich bin völlig neu in ZFS, also dachte ich zuerst, ich würde ein paar einfache Benchmarks machen, um ein Gefühl dafür zu bekommen, wie es sich verhält. Ich wollte die Grenzen seiner Leistung erweitern, also habe ich eine Amazon EC2- i2.8xlarge
Instanz bereitgestellt (fast 7 US-Dollar pro Stunde, Zeit ist wirklich Geld!). Diese Instanz verfügt über 8 SSDs mit 800 GB.
Ich habe fio
die SSDs selbst getestet und die folgende Ausgabe erhalten (abgeschnitten):
$ sudo fio --name randwrite --ioengine=libaio --iodepth=2 --rw=randwrite --bs=4k --size=400G --numjobs=8 --runtime=300 --group_reporting --direct=1 --filename=/dev/xvdb
[trimmed]
write: io=67178MB, bw=229299KB/s, iops=57324, runt=300004msec
[trimmed]
57K IOPS für zufällige 4K-Schreibvorgänge. Seriös.
Ich habe dann ein ZFS-Volume erstellt, das sich über alle 8 erstreckt. Zuerst hatte ich einen raidz1
vdev mit allen 8 SSDs, aber ich habe gelesen, warum dies für die Leistung schlecht ist . Am Ende hatte ich also vier mirror
vdevs, wie folgt:
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi
$ sudo zpool list -v
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
testpool 2.91T 284K 2.91T - 0% 0% 1.00x ONLINE -
mirror 744G 112K 744G - 0% 0%
xvdb - - - - - -
xvdc - - - - - -
mirror 744G 60K 744G - 0% 0%
xvdd - - - - - -
xvde - - - - - -
mirror 744G 0 744G - 0% 0%
xvdf - - - - - -
xvdg - - - - - -
mirror 744G 112K 744G - 0% 0%
xvdh - - - - - -
xvdi - - - - - -
Ich stellte die Aufzeichnungsgröße auf 4K ein und führte meinen Test durch:
$ sudo zfs set recordsize=4k testpool
$ sudo fio --name randwrite --ioengine=libaio --iodepth=2 --rw=randwrite --bs=4k --size=400G --numjobs=8 --runtime=300 --group_reporting --filename=/testpool/testfile --fallocate=none
[trimmed]
write: io=61500MB, bw=209919KB/s, iops=52479, runt=300001msec
slat (usec): min=13, max=155081, avg=145.24, stdev=901.21
clat (usec): min=3, max=155089, avg=154.37, stdev=930.54
lat (usec): min=35, max=155149, avg=300.91, stdev=1333.81
[trimmed]
Ich erhalte nur 52.000 IOPS für diesen ZFS-Pool. Das ist eigentlich etwas schlimmer als eine SSD selbst.
Ich verstehe nicht, was ich hier falsch mache. Habe ich ZFS falsch konfiguriert oder ist dies ein schlechter Test für die ZFS-Leistung?
Hinweis Ich verwende das offizielle 64-Bit-CentOS 7 HVM-Image, obwohl ich auf den elrepo-Kernel 4.4.5 aktualisiert habe:
$ uname -a
Linux ip-172-31-43-196.ec2.internal 4.4.5-1.el7.elrepo.x86_64 #1 SMP Thu Mar 10 11:45:51 EST 2016 x86_64 x86_64 x86_64 GNU/Linux
Ich habe ZFS aus dem hier aufgelisteten ZFS-Repository installiert . Ich habe Version 0.6.5.5 des zfs
Pakets.
UPDATE : Per @ ewwhite's Vorschlag habe ich versucht ashift=12
und ashift=13
:
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi -o ashift=12 -f
und
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi -o ashift=13 -f
Beides machte keinen Unterschied. Soweit ich weiß, sind die neuesten ZFS-Bits intelligent genug, um 4K-SSDs zu identifizieren und angemessene Standardeinstellungen zu verwenden.
Mir ist jedoch aufgefallen, dass die CPU-Auslastung stark ansteigt. @Tim schlug dies vor, aber ich lehnte es ab, aber ich glaube, ich habe die CPU nicht lange genug beobachtet, um es zu bemerken. In dieser Instanz befinden sich etwa 30 CPU-Kerne, und die CPU-Auslastung steigt auf bis zu 80%. Der hungrige Prozess? z_wr_iss
viele Instanzen davon.
Ich habe bestätigt, dass die Komprimierung deaktiviert ist, es handelt sich also nicht um die Komprimierungsengine.
Ich verwende kein Raidz, daher sollte es nicht die Paritätsberechnung sein.
Ich habe eine gemacht perf top
und es zeigt den größten Teil der Kernel-Zeit, die _raw_spin_unlock_irqrestore
in z_wr_int_4
und osq_lock
in verbracht wurde z_wr_iss
.
Ich glaube jetzt, dass dieser Leistungsengpass eine CPU-Komponente hat, obwohl ich nicht näher dran bin, herauszufinden, was das sein könnte.
UPDATE 2 : Per @ewwhite und dem Vorschlag anderer, dass es die virtualisierte Natur dieser Umgebung ist, die zu Performance-Unsicherheiten führt, habe ich fio
zufällige 4K-Schreibvorgänge verglichen, die auf vier der SSDs in der Umgebung verteilt sind. Jede SSD für sich gibt ~ 55K IOPS, so dass ich ungefähr 240K IOs für vier von ihnen erwartet habe. Das ist mehr oder weniger was ich habe:
$ sudo fio --name randwrite --ioengine=libaio --iodepth=8 --rw=randwrite --bs=4k --size=398G --numjobs=8 --runtime=300 --group_reporting --filename=/dev/xvdb:/dev/xvdc:/dev/xvdd:/dev/xvde
randwrite: (g=0): rw=randwrite, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=8
...
randwrite: (g=0): rw=randwrite, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=8
fio-2.1.5
Starting 8 processes
[trimmed]
write: io=288550MB, bw=984860KB/s, iops=246215, runt=300017msec
slat (usec): min=1, max=24609, avg=30.27, stdev=566.55
clat (usec): min=3, max=2443.8K, avg=227.05, stdev=1834.40
lat (usec): min=27, max=2443.8K, avg=257.62, stdev=1917.54
[trimmed]
Dies zeigt deutlich, dass die Umgebung, auch wenn sie virtualisiert ist, die IOPS viel besser aushält als ich sie sehe. Etwas an der Art und Weise, wie ZFS implementiert wird, hindert es daran, die Höchstgeschwindigkeit zu erreichen. Ich kann einfach nicht herausfinden, was das ist.