L'ospite KVM io è molto più lento dell'host io: è normale?


13

Ho una configurazione del sistema host Qemu-KVM su CentOS 6.3. Quattro HDD SATA da 1 TB che funzionano con il software RAID10. Guest CentOS 6.3 è installato su LVM separato. Le persone dicono di vedere le prestazioni degli ospiti quasi uguali a quelle dell'host, ma io non lo vedo. I miei test di I / O mostrano prestazioni più lente del 30-70% sul guest rispetto al sistema host. Ho provato a cambiare lo scheduler (impostato elevator=deadlinesu host e elevator=noopsu guest), impostato blkio.weightsu 1000 in cgroup, cambio io in virtio ... Ma nessuna di queste modifiche mi ha dato risultati significativi. Questa è una parte di configurazione .xml guest:

<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>

Ci sono i miei test:

Sistema host:

test di iozone

# 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: un processo e poi quattro processi simultanei

# 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: un processo e poi quattro processi simultanei

# 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

Sistema ospite:

test di iozone

# 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: un processo e poi quattro processi simultanei

# 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: un processo e poi quattro processi simultanei

# 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

Mi chiedo sia quella situazione normale o mi sono perso qualcosa?


Hai detto di aver cambiato il tuo ospite per utilizzare un tipo di bus virtio che offre prestazioni migliori, ma deve avere i driver virtio installati per ottenere questi vantaggi. Non dovresti dire se li stai usando o no. Non conosco CentOS abbastanza approfonditamente per commentare il fatto che questi driver saranno presenti nel tuo ospite per impostazione predefinita o meno.
jwbensley,

1
@javano CentOS include sempre virtio e dovresti rimuoverlo esplicitamente ricostruendo i pacchetti del kernel.
Michael Hampton

Sempre utile sapere, evviva :)
jwbensley,

Risposte:


21

Non hai ancora finito di ottimizzare le prestazioni.

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

Il primo è quale meccanismo I / O usare.

QEMU ha due meccanismi I / O asincroni: emulazione AIX POSIX che utilizza un pool di thread di lavoro e AIO Linux nativo.

Impostare uno io='native'o io='threads'nel proprio XML per confrontare ciascuno di questi.

Il secondo è quale meccanismo di memorizzazione nella cache utilizzare. È possibile impostare cache='writeback', cache='writethrough'o è possibile disattivarlo con cache='none', che in realtà potresti trovare funziona meglio.

Se si utilizzano volumi o partizioni non elaborati, è consigliabile evitare completamente la cache, riducendo le copie dei dati e il traffico del bus.

Non utilizzarlo a writebackmeno che l'array RAID non sia alimentato a batteria o si rischia di perdere dati. (Naturalmente, se perdere dati va bene, sentiti libero.)

In terzo luogo, alcune altre cose che potrebbero aiutare a disattivare le barriere e utilizzare il pianificatore delle scadenze nell'ospite.

Infine, fai qualche ricerca. IBM ha fatto una presentazione molto interessante sulle prestazioni di I / O di KVM alla conferenza di idraulici di Linux del 2010. Inoltre hanno una vasta serie di migliori pratiche sull'uso di KVM che saranno sicuramente interessanti.

PS Lunghe letture e scritture sequenziali sono raramente rappresentative di un carico di lavoro reale. Prova a fare benchmark con altri tipi di carichi di lavoro, idealmente le applicazioni reali che intendi eseguire in produzione.


+1 per "test con il tuo pattern IO"
Javier

Oh, mi piace ai documenti IBM, +1 :)
jwbensley,

1
Molto utile, grazie! Ora ho migliorato i risultati dei miei ospiti fino al 90% dalle prestazioni dell'host. La mia colpa è stata piuttosto stupida: virsh reset <domain>non ho applicato i miei virsh edit <domain>cambiamenti e credevo che l'ospite usasse il virtio, ma in realtà non lo era. Solo virsh destroy <domain>seguito da virsh start <domain>aiutato. Regole Virtio! ;)
Evolver

1
cache = writeback non aggiunge alcun rischio nella vita reale (i dati importanti non sono in pericolo, solo i dati in volo, che vengono comunque scartati in caso di crash). Fa solo cache = non sicuro. Il writeback non implica requisiti hardware aggiuntivi ("array RAID supportato da batteria" non aiuta in alcun modo). Ha lo stesso livello di integrità di una cache di scrittura dell'HDD: entrambi sono scaricati quando necessario dal sistema operativo.
Korkman,

io='native'nel mio caso ho dato quasi il 20-30% di prestazioni WRITE in più
rahul286,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.