KVM guest io jauh lebih lambat daripada host io: apakah itu normal?

13

Saya memiliki pengaturan sistem host Qemu-KVM di CentOS 6.3. Empat HDD SATA 1TB bekerja di Perangkat Lunak RAID10. Guest CentOS 6.3 diinstal pada LVM terpisah. Orang mengatakan bahwa mereka melihat kinerja tamu hampir sama dengan kinerja host, tetapi saya tidak melihat itu. Tes i / o saya menunjukkan kinerja tamu lebih lambat 30-70% dibandingkan sistem host. Saya mencoba untuk mengubah scheduler (diatur elevator=deadlinepada host dan elevator=nooptamu), diatur blkio.weightke 1000 di cgroup, ubah io ke virtio ... Tapi tidak ada perubahan ini yang memberi saya hasil yang signifikan. Ini adalah bagian konfigurasi .xml tamu:

<disk type='file' device='disk'>
  <driver name='qemu' type='raw'/>
  <source file='/dev/vgkvmnode/lv2'/>
  <target dev='vda' bus='virtio'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</disk>

Ada beberapa tes saya:

Sistem host:

tes iozon

# iozone -a -i0 -i1 -i2 -s8G -r64k
                                                            random  random 
              KB  reclen   write rewrite    read    reread    read   write 
         8388608      64  189930  197436   266786   267254   28644   66642 

dd read test: satu proses dan kemudian empat proses simultan

# dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct
1073741824 bytes (1.1 GB) copied, 4.23044 s, 254 MB/s

# dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct skip=1024 & dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct skip=2048 & dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct skip=3072 & dd if=/dev/vgkvmnode/lv2 of=/dev/null bs=1M count=1024 iflag=direct skip=4096
1073741824 bytes (1.1 GB) copied, 14.4528 s, 74.3 MB/s
1073741824 bytes (1.1 GB) copied, 14.562 s, 73.7 MB/s
1073741824 bytes (1.1 GB) copied, 14.6341 s, 73.4 MB/s
1073741824 bytes (1.1 GB) copied, 14.7006 s, 73.0 MB/s

dd write test: satu proses dan kemudian empat proses simultan

# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
1073741824 bytes (1.1 GB) copied, 6.2039 s, 173 MB/s

# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test2 bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test3 bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test4 bs=1M count=1024 oflag=direct
1073741824 bytes (1.1 GB) copied, 32.7173 s, 32.8 MB/s
1073741824 bytes (1.1 GB) copied, 32.8868 s, 32.6 MB/s
1073741824 bytes (1.1 GB) copied, 32.9097 s, 32.6 MB/s
1073741824 bytes (1.1 GB) copied, 32.9688 s, 32.6 MB/s

Sistem tamu:

tes iozon

# iozone -a -i0 -i1 -i2 -s512M -r64k
                                                            random  random
              KB  reclen   write rewrite    read    reread    read   write
          524288      64   93374  154596   141193   149865   21394   46264 

dd read test: satu proses dan kemudian empat proses simultan

# dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=1024
1073741824 bytes (1.1 GB) copied, 5.04356 s, 213 MB/s

# dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=1024 & dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=2048 & dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=3072 & dd if=/dev/mapper/VolGroup-lv_home of=/dev/null bs=1M count=1024 iflag=direct skip=4096
1073741824 bytes (1.1 GB) copied, 24.7348 s, 43.4 MB/s
1073741824 bytes (1.1 GB) copied, 24.7378 s, 43.4 MB/s
1073741824 bytes (1.1 GB) copied, 24.7408 s, 43.4 MB/s
1073741824 bytes (1.1 GB) copied, 24.744 s, 43.4 MB/s

dd write test: satu proses dan kemudian empat proses simultan

# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
1073741824 bytes (1.1 GB) copied, 10.415 s, 103 MB/s

# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test2 bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test3 bs=1M count=1024 oflag=direct & dd if=/dev/zero of=test4 bs=1M count=1024 oflag=direct
1073741824 bytes (1.1 GB) copied, 49.8874 s, 21.5 MB/s
1073741824 bytes (1.1 GB) copied, 49.8608 s, 21.5 MB/s
1073741824 bytes (1.1 GB) copied, 49.8693 s, 21.5 MB/s
1073741824 bytes (1.1 GB) copied, 49.9427 s, 21.5 MB/s

Saya bertanya-tanya apakah itu situasi normal atau apakah saya melewatkan sesuatu?

Evolver
sumber
Anda bilang Anda telah mengubah tamu Anda untuk menggunakan jenis virtio bus yang memang memberikan kinerja yang lebih baik, tetapi harus menginstal driver virtio untuk mendapatkan manfaat ini. Anda tidak mengatakan apakah Anda menggunakan itu atau tidak. Saya tidak tahu CentOS cukup teliti untuk mengomentari apakah driver ini akan hadir di tamu Anda secara default atau tidak.
jwbensley
1
@javano CentOS selalu menyertakan virtio dan Anda harus menghapusnya secara eksplisit dengan membangun kembali paket kernel.
Michael Hampton
Selalu berguna untuk diketahui, bersorak :)
jwbensley

Jawaban:

21

Anda belum selesai dengan penyempurnaan kinerja.

  <driver name='qemu' type='raw' cache='writethrough' io='native'/>

Pertama adalah mekanisme I / O yang digunakan.

QEMU memiliki dua mekanisme I / O asinkron: emulasi POSIX AIO menggunakan kumpulan thread pekerja dan Linux AIO asli.

Tetapkan salah satu io='native'atau io='threads'dalam XML Anda untuk membandingkan masing-masing.

Kedua adalah mekanisme caching yang digunakan. Anda dapat mengatur cache='writeback', cache='writethrough'atau mematikannya cache='none', yang menurut Anda terbaik.

Jika Anda menggunakan volume atau partisi mentah, yang terbaik adalah menghindari cache sepenuhnya, yang mengurangi salinan data dan lalu lintas bus.

Jangan gunakan writebackkecuali array RAID Anda didukung oleh baterai, atau Anda berisiko kehilangan data. (Tentu saja, jika kehilangan data tidak masalah, maka silakan saja.)

Ketiga, beberapa hal lain yang dapat membantu termasuk mematikan penghalang, dan menggunakan penjadwal tenggat waktu di tamu.

Akhirnya, lakukan riset. IBM membuat presentasi yang sangat menarik tentang kinerja KVM I / O pada Konferensi Linux Plumbers 2010. Selain itu mereka memiliki serangkaian praktik terbaik dalam menggunakan KVM yang tentunya akan menarik.

PS Urutan panjang membaca dan menulis jarang mewakili beban kerja dunia nyata. Coba lakukan tolok ukur dengan jenis beban kerja lain, idealnya aplikasi aktual yang ingin Anda jalankan dalam produksi.

Michael Hampton
sumber
+1 untuk "tes dengan pola IO Anda"
Javier
Oh, suka yang baik ke IBM docs, +1 :)
jwbensley
1
Sangat membantu, terima kasih! Sekarang saya meningkatkan hasil tamu saya hingga 90% dari kinerja host. Kesalahan saya cukup bodoh: virsh reset <domain>tidak menerapkan virsh edit <domain>perubahan saya , dan saya percaya bahwa tamu menggunakan virtio, tetapi sebenarnya tidak. Hanya virsh destroy <domain>diikuti oleh yang virsh start <domain>dibantu. Aturan Virtio! ;)
Evolver
1
cache = writeback tidak menambahkan risiko dalam kehidupan nyata (data penting tidak dalam bahaya, hanya data dalam penerbangan, yang dibuang saat macet). Hanya cache = tidak aman yang melakukannya. Writeback tidak menyiratkan persyaratan perangkat keras tambahan ("array RAID yang didukung baterai" tidak membantu dengan cara apa pun). Ini memiliki tingkat integritas yang sama dengan cache tulis-HDD: keduanya disiram bila perlu oleh sistem operasi.
korkman
io='native'memberikan hampir 20-30% kinerja WRITE ekstra dalam kasus saya
rahul286