KVM guest io é muito mais lento que o host io: isso é normal?

11

Eu tenho uma configuração do sistema host Qemu-KVM no CentOS 6.3. Quatro HDDs de 1TB SATA trabalhando no Software RAID10. O Guest CentOS 6.3 é instalado em um LVM separado. As pessoas dizem que vêem o desempenho dos convidados quase igual ao desempenho do host, mas não vejo isso. Meus testes de E / S estão mostrando um desempenho 30-70% mais lento no guest que no sistema host. Tentei alterar o planejador (conjunto elevator=deadline no host e elevator=noop no convidado), defina blkio.weight para 1000 no cgroup, mude io para virtio ... Mas nenhuma dessas alterações me deu nenhum resultado significativo. Esta é uma parte de configuração do convidado .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>

Existem meus testes:

Sistema host:

teste 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 teste de leitura: um processo e depois quatro processos simultâneos

# 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: um processo e depois quatro processos simultâneos

# 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 de convidados:

teste 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 teste de leitura: um processo e depois quatro processos simultâneos

# 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: um processo e depois quatro processos simultâneos

# 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

Eu me pergunto é essa situação normal ou eu perdi alguma coisa?

    
por Evolver 08.09.2012 / 19:25

1 resposta

20

Você ainda não concluiu o ajuste de desempenho.

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

Primeiro, qual mecanismo de E / S usar.

QEMU has two asynchronous I/O mechanisms: POSIX AIO emulation using a pool of worker threads and native Linux AIO.

Defina io='native' ou io='threads' no seu XML para avaliar cada um deles.

Segundo, qual mecanismo de cache usar. Você pode definir cache='writeback' , cache='writethrough' ou pode desativá-lo com cache='none' , o que você pode achar melhor.

If you're using raw volumes or partitions, it is best to avoid the cache completely, which reduces data copies and bus traffic.

Não use writeback , a menos que sua matriz RAID seja alimentada por bateria ou você se arrisque a perder dados. (Claro, se perder dados está OK, então fique à vontade.)

Em terceiro lugar, algumas outras coisas que podem ajudar a incluir a desativação de barreiras e o uso do agendador de prazos no hóspede.

Finalmente, faça alguma pesquisa. A IBM fez uma apresentação muito interessante sobre o desempenho de E / S do KVM na conferência de encanadores de Linux de 2010. Além disso, eles têm um conjunto abrangente de práticas recomendadas sobre o uso do KVM , que certamente será de interesse.

P.S. Leituras sequenciais e gravações longas raramente são representativas de uma carga de trabalho real. Tente fazer benchmarks com outros tipos de cargas de trabalho, de preferência os aplicativos reais que você pretende executar na produção.

    
por 09.09.2012 / 00:21