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.
źródło
Odpowiedzi:
Ta konfiguracja może nie być dostrojona. Istnieją parametry potrzebne zarówno dla pliku /etc/modprobe/zfs.conf, jak i wartości Ashift podczas korzystania z dysków SSD
Spróbuj ashift = 12 lub 13 i przetestuj ponownie.
Edytować:
To wciąż zwirtualizowane rozwiązanie, więc nie wiemy zbyt wiele o sprzęcie bazowym ani o tym, jak wszystko jest ze sobą powiązane. Nie wiem, czy dzięki temu rozwiązaniu uzyskasz lepszą wydajność.
Edytować:
Chyba nie ma sensu próbować optymalizować wystąpienia chmury w ten sposób. Ponieważ gdyby celem była najwyższa wydajność, używałbyś sprzętu, prawda?
Pamiętaj jednak, że ZFS ma wiele dostrajalnych ustawień, a to, co dostajesz domyślnie, nie jest nigdzie blisko twojego przypadku użycia.
Wypróbuj poniższe
/etc/modprobe.d/zfs.conf
i uruchom ponownie. To jest to, czego używam w moich pulach danych SSD dla serwerów aplikacji. Twoje przesunięcie popiołu powinno wynosić 12 lub 13. Benchmark z kompresją = wyłączony, ale użyj kompresji = lz4 w produkcji. Ustaw atime = wyłączony. Domyślnie pozostawiłbym rozmiar rekordu (128 KB).źródło
zfs get compression
. Dedupe też jest wyłączony.Wydaje się prawdopodobne, że czekasz na blokadę mutex jądra Linux, która z kolei może oczekiwać na bufor pierścieniowy Xen. Nie mogę być tego pewien bez dostępu do podobnej maszyny, ale nie jestem zainteresowany płaceniem Amazonowi 7 USD / godzinę za ten przywilej.
Dłuższy zapis jest tutaj: https://www.reddit.com/r/zfs/comments/4b4r1y/why_is_zfs_on_linux_unable_to_fully_utilize_8x/d1e91wo ; Wolałbym, żeby był w jednym miejscu niż w dwóch.
źródło
Sporo czasu poświęciłem na śledzenie tego. Moje szczególne wyzwanie: serwer Postgres i chcę używać ZFS do objętości danych. Podstawą jest XFS.
Przede wszystkim moje próby mówią mi, że
ashift=12
to źle. Jeśli jest jakaś magicznaashift
liczba, nie jest to 12. Używam0
i uzyskuję bardzo dobre wyniki.Eksperymentowałem również z wieloma opcjami ZFS, a te, które dają mi poniższe wyniki to:
atime=off
- Nie potrzebuję czasów dostępuchecksum=off
- Rozbieram się, nie lustrocompression=lz4
- Wydajność jest lepsza przy kompresji (kompromis procesora?)exec=off
- To dotyczy danych, a nie plików wykonywalnychlogbias=throughput
- Czytaj na stronach internetowych, to jest lepsze dla Postgresrecordsize=8k
- Rozmiar bloku 8k właściwy dla PGsync=standard
- próbował wyłączyć synchronizację; nie widziałem wiele korzyściMoje poniższe testy wykazują lepszą wydajność niż XFS (proszę o komentarz, jeśli zobaczysz błędy w moich testach!).
W tym kroku moim kolejnym krokiem jest wypróbowanie Postgresa na systemie plików 2 x EBS ZFS.
Moja konkretna konfiguracja:
EC2:
m4.xlarge
instancjaEBS:
gp2
woluminy 250 GBjądro: Linux [...] 3.13.0-105-generic # 152-Ubuntu SMP [...] x86_64 x86_64 x86_64 GNU / Linux *
Najpierw chciałem przetestować surową wydajność EBS. Korzystając z odmiany
fio
powyższego polecenia, wymyśliłem inkantację poniżej. Uwaga: używam bloków 8k, ponieważ to, co przeczytałem, pisze PostgreSQL:Surowa wydajność woluminu EBS wynosi
WRITE: io=3192.2MB
.Teraz testujemy XFS za pomocą tego samego
fio
polecenia:Naszym punktem odniesienia jest
WRITE: io=3181.9MB
; bardzo zbliżone do prędkości dysku.Teraz na ZFS
WRITE: io=3181.9MB
jako odniesienie:Zauważ, że działało to lepiej niż XFS
WRITE: io=4191.7MB
. Jestem prawie pewien, że jest to spowodowane kompresją.W przypadku kopnięć dodam drugi tom:
Z drugim tomem
WRITE: io=5975.9MB
, więc ~ 1.8X pisze.Trzeci tom daje nam
WRITE: io=6667.5MB
, więc ~ 2.1X pisze.I daje nam czwarty tom
WRITE: io=6552.9MB
. W przypadku tego typu instancji wygląda to tak, jakbym prawie zamknął sieć EBS dwoma woluminami, zdecydowanie trzema, i nie jest lepiej z 4 (750 * 3 = 2250 IOPS).* Z tego filmu upewnij się, że używasz jądra linuksa w wersji 3.8+, aby uzyskać wszystkie zalety EBS.
źródło
WRITE: io=
; to nie prędkość, to ilość danych zapisanych w tym czasie. Związane z prędkością tylko do testów, które mają ustalony czas pracy, ale dla zachowania spójności z innymi benchmarkach lepiej skupić się na IOPS,iops=
. W twoim przypadku wyniki są podobne. Prawdopodobnie mógłbyś być znacznie lepszy, jeśli użyjesz zainicjowanych woluminów IOPS EBS i większej instancji. Sprawdź na tej stronie oczekiwane limity EBS według wielkości instancji. Tylko uważaj, opłaty EBS szybko się sumują, jeśli nie jesteś ostrożny!/etc/modules.d/zfs.conf
. Kolejne pytanie brzmi: jaka jest odpowiednia liczba iopsów dla instancji ec2. Patrząc na stronę, do której się odwołujesz, jest to wciąż trudne i nie widzę tak dobrej wydajności, jak stan dokumentów.