Mempercepat subsistem disk Qemu KVM di Linux



Kadang-kadang saya mengambil berbagai tugas untuk menyiapkan server. Beberapa waktu lalu, pemilik perusahaan hosting kecil mendekati saya dengan masalah yang menarik. Dia ingin menjalankan mesin virtual Windows di bawah KVM di server-nya, di mana Ubuntu 18.04 sudah diinstal.

Namun, pengujiannya menunjukkan bahwa sistem disk KVM dengan sopan tertinggal di belakang indikator yang ia miliki di bawah Hyper-V. Dia ingin melepaskan qemu di server Ubuntu-nya untuk menghindari membeli lisensi server Windows yang mahal (versi gratis dari Microsoft Hyper-V Server tidak berhasil karena keterbatasannya).

0. Disposisi


Untuk pengujian, kami menggunakan SSD Samsung 970 Pro 1TB. Pelanggan memeriksa hasil pekerjaan di CrystalDiskMark, jadi lebih jauh dalam artikel semua grafik dari itu.

Windows 10 LTSCHyper-V
2 CPU

CPU KVM 2
Langkah pertama adalah meningkatkan kinerja I / O acak. Jenis beban ini tipikal untuk mesin virtual, terutama yang menggunakan berbagai basis data.

Ubuntu (16.04 LTS dan 18.04) masih menggunakan qemu versi 2.11. Karenanya, beberapa roti qemu terbaru tidak dipertimbangkan dalam artikel ini.

Kami memutuskan bahwa kami perlu menghindari mengikat besi ke mesin virtual, karena ini mempersulit portabilitas mesin virtual, sehingga opsi untuk melempar SSD / disk fisik / partisi ke mesin virtual dianggap tidak diinginkan.

Tentang ukuran file uji untuk CrystalDiskMark
, 100 4. , : , .

, , Windows . 100 4 , 40 .

, , 100-1. 4.

1. Kami menggunakan volume LVM, bukan file untuk menyimpan disk mesin virtual.


Logikanya adalah ini. File dengan disk virtual disimpan dalam sistem file Linux, NTFS terletak di dalam file itu sendiri. Setiap sistem file mengkonsumsi sumber daya selama operasi disk. Oleh karena itu, semakin kecil kedalaman boneka, semakin cepat input / output.

Jika kita berbicara tentang file qcow2, namanya adalah β€œQemu Copy-On-Write” dan, pada kenyataannya, mereka memiliki tabel terjemahan sendiri di dalam yang bertanggung jawab atas blok mana yang sibuk, mana yang tidak dan di mana yang berada.

Lapisan LVM mengkonsumsi sumber daya prosesor jauh lebih sedikit daripada sistem file. Salah satu alasan untuk ini adalah bahwa blok di dalamnya jauh lebih besar daripada blok sistem file khas (4KB). Semakin besar blok (luas) pada perangkat LVM fisik, semakin cepat IO terjadi dan semakin sedikit fragmentasi.

Tetapi bahkan untuk SSD acak I / O jauh lebih lambat daripada serial. Karenanya, saat membuat Grup Volume, kami akan menentukan tingkat yang sangat besar: 256MB.

Baca di depan pada volume logis harus dimatikan, karena menghabiskan IO tanpa kemenangan, karena sekarang tidak ada yang defragmenting disk di Windows pada SSD.

LVM cukup nyaman digunakan untuk hosting mesin virtual. Volume LVM mudah dibawa-bawa antara disk fisik, ada snapshot dan pengubahan ukuran online. Selain itu, virt-manager (libvirt) dapat membuat volume logis di luar kotak untuk disk mesin virtual dari grup Volume.

Kemampuan untuk membuat volume yang tipis juga terlihat menarik, tetapi mengingat bahwa volume yang tipis adalah lapisan tambahan abstraksi, jelas bahwa itu akan menurunkan kinerja IO. Selain itu, libvirt tidak memiliki cara yang elegan untuk secara otomatis membuat disk untuk mesin virtual dalam kumpulan tipis.

#    SSD    (volume group)
pvcreate /dev/nvme1n1p1

#    win    (extent) 256.
vgcreate -s 256M win_pool /dev/nvme1n1p1

#    vm1.    C
lvcreate -n vm1 -L 100G win_pool

#      (read ahead)
lvchange -r none /dev/win_pool/vm1

1.1. Volume tipis sebagai disk dan / atau pengaturan volume logis untuk foto


Jika Anda ingin menggunakan kumpulan tipis di mana Anda akan membuat volume tipis, maka masuk akal untuk mengatur ukuran potongan kumpulan menjadi 4MB, yang jauh lebih besar dari ukuran default 64KB.
Yang akan memerlukan pekerjaan lebih cepat dari lapisan abstraksi ini.

Mekanisme snapshot dalam LVM bekerja hampir pada kode yang sama dengan volume yang tipis, sehingga pengaturannya akan sama untuk meningkatkan kecepatan snapshot.

lvcreate -c 4m -L 300G -T -Zn win_pool/thin

Opsi ini -Znmenonaktifkan menimpa potongan dengan nol saat menyorot, yang meningkatkan kecepatan kerja.

Pengaturan untuk lvm.conf atau file serupa (mis. Lvmlocal.conf):

thin_pool_chunk_size = 4096
thin_pool_zero = n

Anda dapat menentukan ukuran optimal bongkahan dengan menyelesaikan tes dengan perintah berikut, memilih nilainya --blocksize:

fio --name=randwrite --filename=/dev/nvme0n1p9 --size=10G --ioengine=libaio --iodepth=1 --buffered=0 --direct=1 --rw=randwrite --blocksize=4m

Anda dapat melihat ukuran chunk saat ini dengan perintah:

lvs -ao name,chunksize

2. Meningkatkan jumlah prosesor logis yang dialokasikan untuk setiap mesin virtual KVM meningkatkan kinerja disk


10 CPU8 CPU4 CPU

Jelas bahwa hampir tidak ada orang yang akan mengalokasikan 10 prosesor ke mesin virtual, tetapi menarik untuk melihat kasus ekstrim.

Itu sudah tergantung pada jumlah prosesor gratis. Menurut pendapat saya, tidak tepat untuk mengalokasikan lebih dari 4. Dengan jumlah utas sama dengan 8, kami mendapat kinerja baca dan tulis acak maksimum. Ini adalah kekhususan CrystalDiskMark 6.0.2, di mana tes kedua melakukan 8 utas.

Dari mana kita dapat menyimpulkan bahwa itu baik untuk memiliki satu prosesor logis untuk setiap tugas yang secara aktif menggunakan IO.

3. Kami menggunakan halaman besar memori akses acak (hugepage) untuk menghindari penurunan kinerja karena fragmentasi RAM


Paket ini dapat berguna ketika kita membutuhkan berbagai informasi tentang hugepage selama operasi.

apt install hugepages

Edit /etc/default/grub:

GRUB_CMDLINE_LINUX="default_hugepagesz=1GB hugepagesz=1G hugepages=64"

Dalam hal ini, memori 64GB dialokasikan untuk semua mesin virtual sebagai hugepage. Dalam kasus Anda mungkin ada lebih sedikit / lebih banyak.

Kami menerapkan pengaturan ini ke GRUB sehingga pada saat sistem melakukan boot, mereka menjadi aktif:

grub-mkconfig -o /boot/grub/grub.cfg

Mengedit konfigurasi mesin virtual:

virsh edit vm_name

Menambahkan:

<memoryBacking>
  <hugepages/>
</memoryBacking>

4. Tambahkan aliran khusus ke setiap mesin virtual untuk melayani IO


Anda perlu menambahkan apa yang disorot dalam huruf tebal. Kami menggunakan virsh, seperti pada paragraf sebelumnya.

<iothreads>1</iothreads>

<disk type='block' device='disk'>
<driver name='qemu' type='raw' cache='none' io='threads' iothread='1'/>
<source dev='/dev/win/terminal'/>
<target dev='vda' bus='virtio'/>
<boot order='2'/>
<address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
</disk>


4.1. writeback


Untuk mempercepat penulisan yang tidak disengaja ke disk, tetapi dengan peningkatan risiko kehilangan data, Anda dapat menggunakan cache=writebackparagraf sebelumnya. Ini dapat digunakan hanya jika ada kepercayaan besar pada kualitas dan cadangan daya dan keberadaan cadangan.

5. Pengaturan subsistem disk di Virt Manager


Disk bus: VirtIO
Format penyimpanan:
mode Cache mentah :
mode IO writeback : utas

5.1. Mengkonfigurasi subsistem disk melalui file konfigurasi


Qemu 2.11 (yang saat ini digunakan oleh Ubuntu) mendukung dua jenis perangkat virtual disk: virtio-blk dan virtio-scsi. Ketika ditentukan dalam Virt Manager Disk bus: VirtIO, ini berarti menggunakan perangkat virtio-blk.

Dalam semua kasus, kecepatan virtio-blk lebih baik, terlepas dari kenyataan bahwa dalam versi qemu yang diuji, masih tidak mendukung TRIM, tidak seperti virtio-scsi ( sudah mendukungnya sejak versi 5.x ).

Dari sudut pandang kecepatan IO disk, virtio-scsi hanya masuk akal dalam kasus-kasus eksotis, misalnya, ketika Anda perlu menghubungkan ratusan disk ke mesin virtual.

6. Selama instalasi Windows, instal driver VirtIO


Jika tidak, disk tidak akan tersedia untuk OS. Untuk melakukan ini, gunakan gambar driver, yang kami sambungkan sebelumnya ke mesin virtual.

7. Hasil setelah menerapkan semua tweak


Sebenarnya, tweak 4.1 tidak digunakan, karena saya tidak yakin keandalan catu daya dari klien.
Hyper-V
2 CPU

CPU KVM 2
KVM
4 CPU

Anda perlu memahami bahwa hasil ini memiliki konvensi tertentu, karena setiap kali Anda memulai CrystalDiskMark nilainya sedikit berbeda.

KVM keluar dari kotak
2 CPU
KVM setelah tweak
2 CPU

Kami melihat bahwa kami berhasil mempercepat kerja subsistem disk di qemu (kvm) dengan jumlah core yang sama. Menulis dipercepat rata-rata 58%, dan membaca 25%.

Elemen kunci keberhasilan : menggunakan volume LVM alih-alih file qcow2, pisahkan I / O, dan hugepage.

Arahkan kesalahan yang diketahui ke PM. Saya meningkatkan karma untuk ini.

PS vhost-user-blk dan vhost-user-nvme


Selama percobaan, Qemu 2.12 dan versi 3 juga dikompilasi. Opsi vhost-user-blk untuk disk telah diuji.

Pada akhirnya, itu bekerja lebih buruk daripada virtio-blk.

vhost-user-blk
4 CPU
virtio-blk
4 CPU

Untuk menggunakan vhost-user-nvme yang diperlukan untuk menambal qemu, opsi ini mempersulit pembaruan otomatis server dalam produksi, jadi itu tidak diuji.

PPS SPDK


Intel merancang kerangka kerja ini untuk mencapai indikator kinerja yang luar biasa untuk sistem disk di mesin virtual yang harus dijalankan pada prosesornya.

Untuk membuat spdk bekerja dengan baik, mereka melakukan banyak trik - mereka mengalokasikan kernel yang terpisah untuk itu, tempatkan spdk dan kernel mesin virtual dalam satu soket. Muat mesin virtual ke dalam memori yang berdekatan. Jika Anda menerapkan langkah-langkah tersebut ke virtio-blk biasa, maka itu juga akan bekerja lebih cepat.

SPDK dapat bekerja dalam 3 mode: vhost-user-scsi, vhost-user-blk dan vhost-user-nvme. Mode kedua hanya tersedia di qemu dari 2.12, yang belum tersedia di ubuntu. Mode vhost-user-nvme umumnya mega-eksperimental - Anda perlu menambal qemu untuknya. Saat ini, hanya emulasi scsi yang berfungsi dan lambat.

Ada satu lagi batasan serius untuk mode vhost-user-scsi - spdk tidak dapat di-boot.
Pastikan bootindex = 2 opsi Qemu diberikan ke perangkat vhost-user-scsi-pci.
Catatan ditetapkan ketika mereka menggunakan driver mereka untuk berbagi SSD pada banyak perangkat dan meneruskannya sebagai vhost-user-nvme. Pendekatan menusuk besi tidak cocok untuk kita.

Kesannya adalah bahwa itu normal untuk menggunakan SPDK hanya dengan implementasi mereka dari disk logis (yang sama sekali berbeda dari standar lvm). Ini adalah sepeda buatan sendiri dengan gambar dan kloningnya. Semua tim berbeda dari LVM.

Kesulitan dalam mengkonfigurasi SPDK, dukungan dan portabilitas mesin virtual, serta keterikatan dengan prosesor Intel, berpaling dari penggunaannya.

Ucapan Terima Kasih


Terima kasih atas gambar TripletConcept . Lebih baik melihatnya dalam ukuran penuh di jendela terpisah.

Untuk izin berbagi bahan kerja -st_neon




Anda dapat memesan mesin virtual dengan SSD dari RUVDS untuk kupon di bawah ini. Arahkan kesalahan yang diketahui ke PM. Saya meningkatkan karma untuk ini.




All Articles