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=deadline
auf Host und elevator=noop
auf Gast gesetzt), blkio.weight
in 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?
Antworten:
Sie sind noch nicht mit der Leistungsoptimierung fertig.
Zunächst wird der zu verwendende E / A-Mechanismus festgelegt.
Stellen Sie entweder
io='native'
oderio='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 deaktivierencache='none'
, die Sie möglicherweise tatsächlich am besten funktioniert finden.Verwenden Sie es nur,
writeback
wenn 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.
quelle
virsh reset <domain>
meinevirsh edit <domain>
Änderungen nicht übernommen, und ich habe geglaubt, dass der Gast virtio verwendet hat, aber tatsächlich nicht. Nurvirsh destroy <domain>
gefolgt vonvirsh start <domain>
geholfen. Virtio Regeln! ;)io='native'
gab fast 20-30% zusätzliche Schreibleistung in meinem Fall