KVM guest io ist viel langsamer als host io: ist das normal?

13

Ich habe ein Qemu-KVM-Hostsystem unter CentOS 6.3 eingerichtet. Vier 1-TB-SATA-Festplatten mit Software-RAID10. Guest CentOS 6.3 ist auf einem separaten LVM installiert. Die Leute sagen, dass sie eine Gastleistung sehen, die fast der Leistung des Gastgebers entspricht, aber das sehe ich nicht. Meine I / O-Tests zeigen auf Gastsystemen eine um 30-70% geringere Leistung als auf Hostsystemen. Ich habe versucht, den Scheduler zu ändern ( elevator=deadlineauf Host und elevator=noopauf Gast gesetzt), blkio.weightin cgroup auf 1000 zu setzen, io auf virtio zu ändern ... Aber keine dieser Änderungen brachte mir signifikante Ergebnisse. Dies ist ein Gast-XML-Konfigurationsabschnitt:

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

Es gibt meine Tests:

Host-System:

Iozone-Test

# 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: ein prozess und dann vier simultane prozesse

# 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: ein prozess und dann vier simultane prozesse

# 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

Gastsystem:

Iozone-Test

# 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: ein prozess und dann vier simultane prozesse

# 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: ein prozess und dann vier simultane prozesse

# 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

Ich frage mich, ist das normal oder habe ich etwas verpasst?

Evolver
quelle
Sie sagten, Sie hätten Ihren Gast gewechselt, um einen Bustyp von virtio zu verwenden, der eine bessere Leistung bietet, aber es müssen die virtio-Treiber installiert sein, um diese Vorteile nutzen zu können. Sie haben nicht gesagt, ob Sie diese verwenden oder nicht. Ich kenne CentOS nicht gründlich genug, um zu kommentieren, ob diese Treiber standardmäßig in Ihrem Gast vorhanden sind oder nicht.
Jwbensley
1
@javano CentOS enthält immer virtio und Sie müssten es explizit entfernen, indem Sie die Kernelpakete neu erstellen.
Michael Hampton
Immer griffbereit,
Prost

Antworten:

21

Sie sind noch nicht mit der Leistungsoptimierung fertig.

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

Zunächst wird der zu verwendende E / A-Mechanismus festgelegt.

QEMU verfügt über zwei asynchrone E / A-Mechanismen: POSIX AIO-Emulation unter Verwendung eines Pools von Arbeitsthreads und natives Linux AIO.

Stellen Sie entweder io='native'oder io='threads'in Ihrem XML-Code ein, um jeden dieser Punkte zu bewerten.

Zweitens, welcher Caching-Mechanismus verwendet werden soll. Sie können festlegen cache='writeback', cache='writethrough'oder Sie können es mit deaktivieren cache='none', die Sie möglicherweise tatsächlich am besten funktioniert finden.

Wenn Sie unformatierte Volumes oder Partitionen verwenden, sollten Sie den Cache vollständig vermeiden, um Datenkopien und Busverkehr zu reduzieren.

Verwenden Sie es nur, writebackwenn Ihr RAID-Array batteriegepuffert ist oder Sie das Risiko haben, Daten zu verlieren. (Natürlich, wenn Datenverlust in Ordnung ist, dann fühlen Sie sich frei.)

Drittens, einige andere Dinge, die helfen können, sind das Ausschalten von Barrieren und die Verwendung des Deadline Schedulers im Gast.

Zum Schluss noch ein bisschen recherchieren. IBM hielt auf der Linux Plumbers Conference 2010 einen sehr interessanten Vortrag über die Leistung von KVM-E / A. Darüber hinaus verfügen sie über umfangreiche Best Practices für die Verwendung von KVM, die sicherlich von Interesse sein werden.

PS Langwierige sequenzielle Lese- und Schreibvorgänge repräsentieren selten eine reale Arbeitslast. Versuchen Sie, Benchmarks mit anderen Arten von Workloads durchzuführen, idealerweise mit den tatsächlichen Anwendungen, die Sie in der Produktion ausführen möchten.

Michael Hampton
quelle
+1 für "Test mit Ihrem E / A-Muster"
Javier
Oh, gut gefällt den IBM-Dokumenten, +1 :)
jwbensley
1
Sehr hilfreich, danke! Jetzt habe ich die Ergebnisse meiner Gäste um bis zu 90% verbessert. Mein Fehler war ziemlich dumm: Ich habe virsh reset <domain>meine virsh edit <domain>Änderungen nicht übernommen, und ich habe geglaubt, dass der Gast virtio verwendet hat, aber tatsächlich nicht. Nur virsh destroy <domain>gefolgt von virsh start <domain>geholfen. Virtio Regeln! ;)
Evolver
1
cache = writeback fügt keine realen Risiken hinzu (wichtige Daten sind nicht gefährdet, nur Flugdaten, die sowieso beim Absturz verworfen werden). Nur cache = unsafe funktioniert. Rückschreiben bedeutet keine zusätzlichen Hardwareanforderungen ("batteriegepuffertes RAID-Array" hilft in keiner Weise). Es hat die gleiche Integritätsstufe wie ein Festplatten-Schreibcache: Beide werden bei Bedarf vom Betriebssystem gelöscht.
Korkman
io='native'gab fast 20-30% zusätzliche Schreibleistung in meinem Fall
rahul286