QEMU + KVM + LVM - kinerja drive perangkat blok vs gambar file

6

Saya membuat pengaturan baru untuk mesin virtual saya dan menguji metode penyimpanan mana yang paling cepat. Lingkungan pengujian saya terdiri dari drive HDD dengan LVM di LUKS. Saya membuat satu LV untuk drive mesin virtual dan menggunakannya kembali untuk kedua tes untuk mempertahankan tempat yang sama pada drive HDD untuk mempertahankan kinerja yang konsisten (kecepatan baca / tulis HDD tergantung pada posisi fisik).

  • Host: Arch Linux, kernel 4.12.8
  • Tamu: Ubuntu Desktop 17.04

Kinerja diuji dengan perintah:

    dd if=/dev/zero of=test bs=16M count=100 conv=sync

Tes pertama: menggunakan LV secara langsung sebagai drive mesin virtual

Perintah:

qemu-system-x86_64 \
  -drive format=raw,file=/dev/mapper/vg_vm-lv_vm_test,if=virtio,aio=native,cache.direct=on \
  -net nic,model=virtio \
  -net user \
  -vga virtio \
  -display gtk,gl=on \
  -smp 3 \
  -cpu host \
  -machine type=pc,accel=kvm \
  -m 3G

Hasil (setiap nilai mewakili proses tunggal):

  • Membuat file baru: 98,4 MB / s; 112 MB / s
  • Menulis ke file yang ada: 62,5 MB / s; 68,7 MB / s; 64,8 MB / s

Tes kedua: membuat ext4 di LV dan meletakkan file gambar mentah di situ

Perintah:

qemu-system-x86_64 \
  -drive format=raw,file=./ubuntu_17,if=virtio,aio=native,cache.direct=on \
  -net nic,model=virtio \
  -net user \
  -vga virtio \
  -display gtk,gl=on \
  -smp 3 \
  -cpu host \
  -machine type=pc,accel=kvm \
  -m 3G

Hasil (setiap nilai mewakili proses tunggal):

  • Membuat file baru: 254 MB / s; 242 MB / s
  • Menulis ke file yang ada: 187 MB / s; 189 MB / s; 190 MB / s

Tes ketiga: menggunakan LV secara langsung sebagai drive mesin virtual, pengaturan berbeda

Perintah:

qemu-system-x86_64 \
  -drive format=raw,file=/dev/mapper/vg_vm-lv_vm_test,if=virtio,cache=none \
  -net nic,model=virtio \
  -net user \
  -vga virtio \
  -display gtk,gl=on \
  -smp 3 \
  -cpu host \
  -machine type=pc,accel=kvm \
  -m 3G

Hasil (setiap nilai mewakili proses tunggal):

  • Membuat file baru: 129 MB / s; 125 MB / s
  • Menulis ke file yang ada: 103 MB / s; 97 MB / s; 81,9 MB / s

Pertanyaan

Jelas ada perbedaan antara kedua solusi ini tetapi saya harapkan perangkat blok mentah setidaknya secepat file gambar karena seharusnya tidak ada overhead dari sistem file host. Saya kira beberapa caching terjadi di antara untuk file gambar atau opsi untuk perangkat blok mentah tidak optimal. Mengapa LV mentah lebih lambat dalam kasus ini? Apa yang dapat saya lakukan untuk meningkatkan kinerjanya? Atau jika itu harus lebih lambat, lalu mengapa?

EDIT: Saya menambahkan test case ketiga menggunakan pengaturan dari: http://www.linux-kvm.org/page/Tuning_KVM . Ternyata menjadi sedikit lebih cepat tetapi masih lebih lambat dari gambar file. Saya juga mengamati bahwa setiap kali menjalankan untuk file yang ada semakin lambat - namun fragmentasi seharusnya tidak terjadi untuk file yang ditimpa jadi saya tidak yakin mengapa itu terjadi.

Marcin Sucharski
sumber

Jawaban:

6

Ketidakcocokan ukuran blok mungkin menjadi masalah.

Anda idealnya ingin mencocokkan Sistem File Anda dengan ukuran blok media yang mendasarinya. Meskipun Anda tidak membagikan apa yang Anda pilih untuk ukuran blok, saya pikir Anda memiliki 4 kilobyte untuk percobaan Ext4 dan 512 byte untuk LV. Jika ukuran blok alami media Anda yang mendasarinya adalah 4 kilobyte maka saya pikir ini menjelaskan masalah kecepatan Anda dan kecepatan Anda yang semakin berkurang. Karena Anda mungkin hanya menulis 512 ke blok 4k, Anda menyia-nyiakan 75% dari blok dan penulisan selanjutnya akan menggunakan lebih banyak blok, menimbulkan lebih banyak overhead dan pemborosan.

Coba lagi pengujian Anda dengan ukuran blok Sistem File yang cocok dengan cocok dengan ukuran blok media yang mendasarinya. Dalam hal ini coba LV Anda dengan ukuran blok 4k.

LVM memang menambahkan sedikit overhead lebih banyak daripada Ext4. Stack Overflow Jawab Jadi saya pikir ini akan menjelaskan mengapa ini hanya sedikit lebih lambat. :)

David Aubin
sumber
1
Anda benar dengan ukuran blok! Itu memang meningkatkan kinerja perangkat blok tetapi masih sedikit lebih lambat daripada menulis file sekitar 20% lebih lambat dan membaca 5% lebih lambat. Ada ide lain?
Marcin Sucharski
Halo :) Pada titik ini saya akan memverifikasi ukuran apa yang Anda miliki untuk perangkat keras yang mendasarinya untuk memastikan Anda tahu Anda bekerja dengan ukuran blok 4K, bisa 8k atau 16k atau yang lainnya. Jadi bagaimana Anda bisa melakukan itu adalah yang pertama: sudo df kemudian temukan titik mount Anda. Milik saya adalah / misalnya. Perhatikan ke kiri itu akan memiliki perangkat blok terkait. Dalam kasus saya ini adalah / dev / sda1. Kemudian jalankan perintah ini, blockdev --getbsz /dev/sda1 Perhatikan ukuran blok Anda dalam byte. Sekarang Anda tahu pasti untuk ukuran apa Anda harus mencocokkan gambar Anda.
David Aubin
Ukuran blok adalah 4k untuk perangkat ini (dan itu benar untuk perangkat nyata, volume logis, dan pada mesin virtual).
Marcin Sucharski