Jestem zupełnie nowy w ZFS, więc na początek pomyślałem, że zrobię kilka prostych testów porównawczych, aby poczuć, jak się zachowuje. Chciałem przekroczyć granice jego wydajności, więc przygotowałem i2.8xlarge
instancję Amazon EC2 (prawie 7 USD / godzinę, czas to naprawdę pieniądze!). Ta instancja ma 8 800 GB dysków SSD.
Zrobiłem fio
test na samych dyskach SSD i uzyskałem następujące dane wyjściowe (przycięte):
$ 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]
57 000 IOPS dla losowych zapisów 4K. Poważny.
Następnie utworzyłem wolumin ZFS obejmujący wszystkie 8. Na początku miałem jeden raidz1
vdev ze wszystkimi 8 dyskami SSD, ale czytałem o powodach, dla których jest to niekorzystne z punktu widzenia wydajności, więc skończyłem z czterema mirror
vdevami, takimi jak:
$ 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 - - - - - -
Ustawiłem rozmiar rekordu na 4K i uruchomiłem test:
$ 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]
W tej puli ZFS otrzymuję tylko 52 KB IOPS. To właściwie nieco gorzej niż sam dysk SSD.
Nie rozumiem, co robię źle tutaj. Czy źle skonfigurowałem ZFS, czy jest to zły test wydajności ZFS?
Uwaga: Używam oficjalnego 64-bitowego obrazu CentOS 7 HVM, chociaż zaktualizowałem do jądra elrepo 4.4.5:
$ 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
Zainstalowałem ZFS z wymienionego tutaj repozytorium zfs . Mam wersję 0.6.5.5 zfs
pakietu.
AKTUALIZACJA : Zgodnie z sugestią @ ewwhite próbowałem ashift=12
i ashift=13
:
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi -o ashift=12 -f
i
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi -o ashift=13 -f
Żadne z nich nie miało znaczenia. Z tego, co rozumiem, najnowsze bity ZFS są wystarczająco inteligentne do identyfikowania dysków SSD 4K i używania rozsądnych ustawień domyślnych.
Zauważyłem jednak, że użycie procesora gwałtownie wzrasta. @Tim zasugerował to, ale odrzuciłem to, ale myślę, że nie obserwowałem procesora wystarczająco długo, aby to zauważyć. W tym przypadku jest około 30 rdzeni procesora, a użycie procesora wzrasta aż o 80%. Głodny proces? z_wr_iss
, wiele jego przypadków.
Potwierdziłem, że kompresja jest wyłączona, więc nie jest to silnik kompresji.
Nie używam raidz, więc nie powinno to być obliczanie parzystości.
Zrobiłem perf top
i to widać przez większość czasu spędzonego w jądra _raw_spin_unlock_irqrestore
w z_wr_int_4
i osq_lock
w z_wr_iss
.
Teraz uważam, że w tym wąskim gardle jest element procesora, choć nie jestem bliżej zastanowienia się, co to może być.
AKTUALIZACJA 2 : Zgodnie z sugestią @ewwhite i innych, że to zwirtualizowana natura tego środowiska powoduje niepewność wydajności, użyłem fio
do testowania losowych zapisów 4K rozproszonych na czterech dyskach SSD w środowisku. Każdy dysk SSD sam daje ~ 55 000 operacji we / wy, więc spodziewałem się około 240 000 operacji we / wy na czterech z nich. To mniej więcej to, co mam:
$ 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]
To wyraźnie pokazuje, że środowisko, choć może być zwirtualizowane, może utrzymać IOPS znacznie wyżej niż to, co widzę. Coś w sposobie implementacji ZFS uniemożliwia mu osiągnięcie maksymalnej prędkości. Po prostu nie mogę zrozumieć, co to jest.