ZFS'de tamamen yeniyim, bu yüzden başlamak için nasıl davrandığına dair bir fikir edinmek için bazı basit kriterler yapacağımı düşündüm. Performansının sınırlarını zorlamak istedim, böylece bir Amazon EC2 i2.8xlarge
örneği sağladım (neredeyse 7 $ / saat, zaman gerçekten para!). Bu örnekte 8 800 GB SSD vardır.
fio
SSD'ler üzerinde bir test yaptım ve aşağıdaki çıktıyı aldım (kesilmiş):
$ 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]
4K rastgele yazma için 57K IOPS. Saygın.
Daha sonra 8'i kapsayan bir ZFS hacmi oluşturdum. İlk başta raidz1
içinde 8 SSD'nin bulunduğu bir vdev vardı , ancak performansın kötü olmasının nedenlerini okudum, bu yüzden dört mirror
vdev ile sonuçlandım :
$ 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 - - - - - -
Kayıt boyutunu 4K olarak ayarladım ve testimi çalıştırdım:
$ 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]
Bu ZFS havuzunda yalnızca 52K IOPS alıyorum. Bu aslında bir SSD'nin kendisinden biraz daha kötü.
Burada neyi yanlış yaptığımı anlamıyorum. ZFS'yi yanlış yapılandırdım mı yoksa ZFS performansının zayıf testi mi?
Not 4.4.5 elrepo çekirdeğine yükseltme yapmama rağmen resmi 64 bit CentOS 7 HVM görüntüsünü kullanıyorum:
$ 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
ZFS'yi burada listelenen zfs deposundan yükledim . zfs
Paketin 0.6.5.5 sürümü var .
GÜNCELLEME : @ ewwhite'ın önerisine göre denedim ashift=12
ve ashift=13
:
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi -o ashift=12 -f
ve
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi -o ashift=13 -f
Bunların hiçbiri bir fark yaratmadı. En son ZFS bitlerini anladığım kadarıyla 4K SSD'leri tanımlamak ve makul varsayılanları kullanmak yeterince akıllı.
Ancak CPU kullanımının arttığını fark ettim. @Tim bunu önerdi ama işten çıkarıldım, ancak CPU'yu fark edecek kadar uzun süre izlemediğimi düşünüyorum. Bu örnekte 30 CPU çekirdeği gibi bir şey var ve CPU kullanımı% 80'e kadar yükseliyor. Aç süreç mi? z_wr_iss
, birçok örneği.
Sıkıştırmanın kapalı olduğunu onayladım, bu yüzden sıkıştırma motoru değil.
Raidz kullanmıyorum, bu yüzden parite hesaplaması olmamalı.
Ben yaptım perf top
ve onu harcanan çekirdek çoğu zaman gösterir _raw_spin_unlock_irqrestore
içinde z_wr_int_4
ve osq_lock
içinde z_wr_iss
.
Şimdi bu performans darboğazında bir CPU bileşeni olduğuna inanıyorum, ancak ne olabileceğini anlamaya daha yakın değilim.
GÜNCELLEME 2 : @beyaz ve diğerlerinin performans belirsizliği yaratan bu ortamın sanallaştırılmış doğası olduğuna dair önerisine göre, ortamdaki dört SSD'ye fio
yayılmış rastgele 4K yazmalarını karşılaştırırdım. Her SSD tek başına ~ 55K IOPS verir, bu yüzden dördünde 240K IO civarında bir yer bekledim. Ne var ne az ya da çok:
$ 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]
Bu açıkça görülüyor olsa da, sanallaştırılmış ortamın IOPS'u gördüğümden çok daha yüksek bir seviyede tutabildiğini gösteriyor. ZFS'nin uygulanmasıyla ilgili bir şey, en yüksek hıza çarpmasını engelliyor. Bunun ne olduğunu anlayamıyorum.