Mam system hosta Qemu-KVM na CentOS 6.3. Cztery dyski twarde SATA 1 TB działające w oprogramowaniu RAID10. Guest CentOS 6.3 jest zainstalowany na osobnym LVM. Ludzie mówią, że widzą wydajność gości prawie równą wydajności hosta, ale ja tego nie widzę. Moje testy we / wy wykazują 30-70% wolniejszą wydajność na gościu niż na systemie hosta. Próbowałem zmienić harmonogram (ustawiony elevator=deadline
na hoście i elevator=noop
na gościu), ustawić blkio.weight
na 1000 w grupie, zmienić io na virtio ... Ale żadna z tych zmian nie dała mi znaczących rezultatów. To jest część konfiguracyjna gościa .xml:
<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>
Oto moje testy:
System hosta:
test jonowy
# 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
Test odczytu dd: jeden proces, a następnie cztery jednoczesne procesy
# 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
test zapisu dd: jeden proces, a następnie cztery jednoczesne procesy
# 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
System gościa:
test jonowy
# 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
Test odczytu dd: jeden proces, a następnie cztery jednoczesne procesy
# 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
test zapisu dd: jeden proces, a następnie cztery jednoczesne procesy
# 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
Zastanawiam się, czy to normalna sytuacja, czy coś przeoczyłem?
Odpowiedzi:
Jeszcze nie skończyłeś z dostrajaniem wydajności.
Po pierwsze, którego mechanizmu We / Wy użyć.
Ustaw albo
io='native'
czyio='threads'
w XML do odniesienia każdego z nich.Po drugie, którego mechanizmu buforowania użyć. Można ustawić
cache='writeback'
,cache='writethrough'
czy można go wyłączyć zcache='none'
, który rzeczywiście może znaleźć działa najlepiej.Nie używaj,
writeback
chyba że macierz RAID jest zasilana bateryjnie lub ryzykujesz utratą danych. (Oczywiście, jeśli utrata danych jest OK, nie krępuj się.)Po trzecie, niektóre inne rzeczy, które mogą pomóc, to wyłączenie barier i użycie harmonogramu terminu u gościa.
Na koniec zrób kilka badań. Podczas konferencji Linux Plumbers Conference 2010 IBM przedstawił bardzo interesującą prezentację dotyczącą wydajności we / wy KVM . Ponadto mają szeroki zestaw najlepszych praktyk korzystania z KVM, które z pewnością będą interesujące.
PS Długie sekwencyjne odczyty i zapisy rzadko reprezentują rzeczywiste obciążenie pracą. Spróbuj przeprowadzić testy porównawcze z innymi typami obciążeń, najlepiej z rzeczywistymi aplikacjami, które zamierzasz uruchomić w środowisku produkcyjnym.
źródło
virsh reset <domain>
nie zastosowałem moichvirsh edit <domain>
zmian i wierzyłem, że gość użył virtio, ale tak naprawdę nie. Dopierovirsh destroy <domain>
potemvirsh start <domain>
pomógł. Virtio rządzi! ;)io='native'
dał w moim przypadku prawie 20-30% więcej wydajności WRITE