Saya benar-benar baru untuk ZFS, jadi untuk mulai dengan saya pikir saya akan melakukan beberapa tolok ukur sederhana di atasnya untuk merasakan bagaimana perilakunya. Saya ingin mendorong batas kinerjanya jadi saya menyediakan contoh Amazon EC2 i2.8xlarge
(hampir $ 7 / jam, waktu benar-benar adalah uang!). Mesin virtual ini memiliki 8 800GB SSD.
Saya melakukan fio
tes pada SSD sendiri, dan mendapat output berikut (dipangkas):
$ 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 untuk penulisan acak 4K. Terhormat.
Saya kemudian membuat volume ZFS yang mencakup semua 8. Awalnya saya punya satu raidz1
vdev dengan semua 8 SSD di dalamnya, tapi saya membaca tentang alasan ini buruk untuk kinerja, jadi saya berakhir dengan empat mirror
vdev, seperti:
$ 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 - - - - - -
Saya menetapkan ukuran rekaman ke 4K dan menjalankan pengujian saya:
$ 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]
Saya hanya mendapatkan 52K IOPS di kumpulan ZFS ini. Itu sebenarnya sedikit lebih buruk daripada satu SSD itu sendiri.
Saya tidak mengerti apa yang saya lakukan salah di sini. Sudahkah saya mengkonfigurasi ZFS secara tidak benar, atau ini merupakan tes kinerja ZFS yang buruk?
Catatan Saya menggunakan gambar 64-bit CentOS 7 HVM resmi, meskipun saya telah memutakhirkan ke kernel 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
Saya menginstal ZFS dari repo zfs yang tercantum di sini . Saya memiliki versi 0.6.5.5 dari zfs
paket.
UPDATE : Per @ ewwhite's saran saya mencoba ashift=12
dan ashift=13
:
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi -o ashift=12 -f
dan
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi -o ashift=13 -f
Tak satu pun dari ini membuat perbedaan. Dari apa yang saya mengerti bit ZFS terbaru cukup pintar mengidentifikasi SSD 4K dan menggunakan default yang masuk akal.
Namun saya perhatikan bahwa penggunaan CPU sangat tinggi. @ Tim menyarankan ini tetapi saya menolaknya tetapi saya pikir saya tidak menonton CPU cukup lama untuk memperhatikan. Ada sekitar 30 core CPU dalam hal ini, dan penggunaan CPU meningkat hingga 80%. Proses lapar? z_wr_iss
, banyak contohnya.
Saya mengonfirmasi kompresi mati, jadi ini bukan mesin kompresi.
Saya tidak menggunakan raidz, jadi seharusnya tidak menjadi perhitungan paritas.
Saya melakukan perf top
dan itu menunjukkan sebagian besar waktu kernel dihabiskan di _raw_spin_unlock_irqrestore
dalam z_wr_int_4
dan osq_lock
di z_wr_iss
.
Saya sekarang percaya ada komponen CPU untuk bottleneck kinerja ini, meskipun saya tidak lebih dekat untuk mencari tahu apa itu mungkin.
UPDATE 2 : Per @ewwhite dan saran orang lain bahwa itu adalah sifat tervirtualisasi dari lingkungan ini yang menciptakan ketidakpastian kinerja, saya menggunakan fio
benchmark acak 4K yang tersebar di empat SSD di lingkungan. Setiap SSD dengan sendirinya memberikan ~ 55K IOPS, jadi saya berharap sekitar 240K IO di empat dari mereka. Itu kurang lebih yang saya dapatkan:
$ 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]
Ini jelas menunjukkan lingkungan, meskipun tervirtualisasi, dapat mempertahankan IOPS jauh lebih tinggi dari apa yang saya lihat. Sesuatu tentang cara ZFS diimplementasikan adalah menjaganya agar tidak mencapai kecepatan tertinggi. Aku hanya tidak tahu apa itu.