KVM gość io jest znacznie wolniejszy niż host io: czy to normalne?

13

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=deadlinena hoście i elevator=noopna gościu), ustawić blkio.weightna 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?

Evolver
źródło
Powiedziałeś, że zmieniłeś gościa na autobus typu virtio, który zapewnia lepszą wydajność, ale musi mieć zainstalowane sterowniki virtio, aby czerpać te korzyści. Nie powiedziałeś, czy ich używasz, czy nie. Nie znam CentOS na tyle dokładnie, aby skomentować, czy sterowniki te będą domyślnie obecne u Twojego gościa, czy nie.
jwbensley
1
@javano CentOS zawsze zawiera virtio i trzeba go jawnie usunąć, przebudowując pakiety jądra.
Michael Hampton
Zawsze przydatna,
pozdrawiam

Odpowiedzi:

22

Jeszcze nie skończyłeś z dostrajaniem wydajności.

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

Po pierwsze, którego mechanizmu We / Wy użyć.

QEMU ma dwa asynchroniczne mechanizmy we / wy: emulacja POSIX AIO przy użyciu puli wątków roboczych i natywny interfejs AIO systemu Linux.

Ustaw albo io='native'czy io='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ć z cache='none', który rzeczywiście może znaleźć działa najlepiej.

Jeśli korzystasz z surowych woluminów lub partycji, najlepiej jest całkowicie unikać pamięci podręcznej, co ogranicza kopiowanie danych i ruch magistrali.

Nie używaj, writebackchyba ż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.

Michael Hampton
źródło
+1 za „testowanie według wzoru IO”
Javier,
Och, dobrze podoba się dokumentom IBM, +1 :)
jwbensley,
1
Bardzo pomocne, dzięki! Teraz poprawiłem wyniki gości nawet o 90% w stosunku do wydajności hosta. Moja wina była dość głupia: virsh reset <domain>nie zastosowałem moich virsh edit <domain>zmian i wierzyłem, że gość użył virtio, ale tak naprawdę nie. Dopiero virsh destroy <domain>potem virsh start <domain>pomógł. Virtio rządzi! ;)
Evolver,
1
pamięć podręczna = zapis zwrotny nie dodaje żadnych rzeczywistych zagrożeń (ważne dane nie są zagrożone, tylko dane w locie, które i tak są odrzucane po awarii). Tylko bufor = niebezpieczne. Zapisywanie nie oznacza dodatkowych wymagań sprzętowych („macierz RAID z podtrzymaniem bateryjnym” nie pomaga w żaden sposób). Ma ten sam poziom integralności co pamięć podręczna na dysku twardym: oba są opróżniane w razie potrzeby przez system operacyjny.
korkman
io='native'dał w moim przypadku prawie 20-30% więcej wydajności WRITE
rahul286,