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.
sumber
Jawaban:
Pengaturan ini mungkin tidak disetel dengan baik. Ada parameter yang diperlukan untuk file /etc/modprobe/zfs.conf dan nilai ashift saat menggunakan SSD
Coba ashift = 12 atau 13 dan tes lagi.
Edit:
Ini masih merupakan solusi tervirtualisasi, jadi kami tidak tahu terlalu banyak tentang perangkat keras yang mendasarinya atau bagaimana semuanya saling berhubungan. Saya tidak tahu bahwa Anda akan mendapatkan kinerja yang lebih baik dari solusi ini.
Edit:
Saya kira saya tidak melihat titik mencoba mengoptimalkan contoh cloud dengan cara ini. Karena jika kinerja puncak adalah tujuannya, Anda akan menggunakan perangkat keras, bukan?
Tapi ingat bahwa ZFS memiliki banyak pengaturan yang bisa diatur, dan apa yang Anda dapatkan secara default tidak mendekati kasus penggunaan Anda.
Coba yang berikut di Anda
/etc/modprobe.d/zfs.conf
dan reboot. Itu yang saya gunakan di kumpulan data SSD untuk server aplikasi. Ashift Anda harus 12 atau 13. Tolok ukur dengan kompresi = mati, tetapi gunakan kompresi = lz4 dalam produksi. Set atime = off. Saya akan meninggalkan recordsize sebagai default (128K).sumber
zfs get compression
. Dedupe mati juga.Sepertinya Anda sedang menunggu di kunci mutex kernel Linux yang pada gilirannya mungkin menunggu di buffer cincin Xen. Saya tidak bisa memastikan ini tanpa akses ke mesin yang serupa, tapi saya tidak tertarik membayar Amazon $ 7 / jam untuk hak istimewa itu.
Tulisan yang lebih panjang ada di sini: https://www.reddit.com/r/zfs/comments/4b4r1y/why_is_zfs_on_linux_unable_to_fully_utilize_8x/d1e91wo ; Saya lebih suka berada di satu tempat daripada dua.
sumber
Saya telah menghabiskan banyak waktu untuk mencoba melacaknya. Tantangan spesifik saya: server Postgres dan saya ingin menggunakan ZFS untuk volume datanya. Baseline adalah XFS.
Pertama dan terutama, cobaan saya mengatakan itu
ashift=12
salah. Jika adaashift
angka ajaib , bukan 12. Saya menggunakan0
dan saya mendapatkan hasil yang sangat bagus.Saya juga telah bereksperimen dengan banyak opsi zfs dan yang memberi saya hasil di bawah ini adalah:
atime=off
- Saya tidak perlu waktu akseschecksum=off
- Saya menelanjangi, tidak mirroringcompression=lz4
- Performa lebih baik dengan kompresi (cpu tradeoff?)exec=off
- Ini untuk data, bukan yang dapat dieksekusilogbias=throughput
- Baca di jalinan ini lebih baik untuk Postgresrecordsize=8k
- Ukuran blok 8k khusus PGsync=standard
- mencoba mematikan sinkronisasi; tidak melihat banyak manfaatTes saya di bawah ini menunjukkan lebih baik daripada kinerja XFS (beri komentar jika Anda melihat kesalahan dalam pengujian saya!).
Dengan ini langkah saya selanjutnya adalah mencoba Postgres yang berjalan pada sistem file 2 x EBS ZFS.
Setup spesifik saya:
EC2:
m4.xlarge
contohEBS:
gp2
volume 250GBkernel: Linux [...] 3.13.0-105-generik # 152-Ubuntu SMP [...] x86_64 x86_64 x86_64 GNU / Linux *
Pertama, saya ingin menguji kinerja EBS mentah. Menggunakan variasi dari
fio
perintah di atas, saya datang dengan mantra di bawah ini. Catatan: Saya menggunakan blok 8k karena itulah yang saya baca tulis PostgreSQL adalah:Kinerja mentah untuk volume EBS adalah
WRITE: io=3192.2MB
.Sekarang, menguji XFS dengan
fio
perintah yang sama :Garis dasar kami adalah
WRITE: io=3181.9MB
; sangat dekat dengan kecepatan disk mentah.Sekarang, ke ZFS dengan
WRITE: io=3181.9MB
sebagai referensi:Perhatikan, ini dilakukan lebih baik daripada XFS
WRITE: io=4191.7MB
. Saya cukup yakin ini karena kompresi.Untuk tendangan, saya akan menambahkan volume kedua:
Dengan volume kedua
WRITE: io=5975.9MB
,, jadi ~ 1.8X tulisan.Volume ketiga memberi kita
WRITE: io=6667.5MB
, jadi ~ 2.1X menulis.Dan volume keempat memberi kita
WRITE: io=6552.9MB
. Untuk tipe instance ini, sepertinya saya hampir membatasi jaringan EBS dengan dua volume, pasti dengan tiga dan tidak lebih baik dengan 4 (750 * 3 = 2250 IOPS).* Dari video ini pastikan Anda menggunakan kernel Linux 3.8+ untuk mendapatkan semua kebaikan EBS.
sumber
WRITE: io=
; itu bukan kecepatan, itu jumlah data yang ditulis pada waktu itu. Terkait dengan kecepatan hanya untuk tes yang memiliki runtime yang tetap, tetapi untuk konsistensi dengan tolok ukur lain, lebih baik fokus pada IOPSiops=
,. Dalam kasus Anda, hasilnya serupa. Anda mungkin bisa menjadi jauh lebih baik jika Anda menggunakan volume EBS IOPS yang disediakan dan contoh yang lebih besar. Lihat halaman ini untuk perkiraan tutup EBS berdasarkan ukuran contoh. Hanya berhati-hatilah, biaya EBS bertambah dengan cepat jika Anda tidak hati-hati!/etc/modules.d/zfs.conf
. Pertanyaan selanjutnya adalah berapa jumlah yang tepat dari iops untuk contoh pemberian ec2. Melihat halaman yang Anda referensi itu masih sulit, dan saya tidak melihat kinerja sebagus kondisi dokumen.