QEMU + KVM + LVM - desempenho da unidade de dispositivo de bloco versus imagem de arquivo

QEMU + KVM + LVM - desempenho da unidade de dispositivo de bloco versus imagem de arquivo

Estou criando uma nova configuração para minhas máquinas virtuais e testando qual método de armazenamento é mais rápido. Meu ambiente de teste consiste em uma unidade HDD com LVM no LUKS. Criei um único LV para unidade de máquina virtual e reutilizei-o em ambos os testes para manter o mesmo lugar na unidade HDD para manter um desempenho consistente (a velocidade de leitura/gravação do HDD depende da posição física).

  • Hospedeiro: Arch Linux, kernel 4.12.8
  • Convidado: Ubuntu Desktop 17.04

Desempenho testado com comando:

    dd if=/dev/zero of=test bs=16M count=100 conv=sync

Primeiro teste: usando LV diretamente como drive da máquina virtual

Comando:

qemu-system-x86_64 \
  -drive format=raw,file=/dev/mapper/vg_vm-lv_vm_test,if=virtio,aio=native,cache.direct=on \
  -net nic,model=virtio \
  -net user \
  -vga virtio \
  -display gtk,gl=on \
  -smp 3 \
  -cpu host \
  -machine type=pc,accel=kvm \
  -m 3G

Resultados (cada valor representa uma única execução):

  • Criando novo arquivo: 98,4 MB/s; 112MB/s
  • Gravação em arquivo existente: 62,5 MB/s; 68,7MB/s; 64,8MB/s

Segundo teste: criando ext4 no LV e colocando o arquivo de imagem raw nele

Comando:

qemu-system-x86_64 \
  -drive format=raw,file=./ubuntu_17,if=virtio,aio=native,cache.direct=on \
  -net nic,model=virtio \
  -net user \
  -vga virtio \
  -display gtk,gl=on \
  -smp 3 \
  -cpu host \
  -machine type=pc,accel=kvm \
  -m 3G

Resultados (cada valor representa uma única execução):

  • Criando novo arquivo: 254 MB/s; 242MB/s
  • Gravando em arquivo existente: 187 MB/s; 189MB/s; 190MB/s

Terceiro teste: usando LV diretamente como drive da máquina virtual, configurações diferentes

Comando:

qemu-system-x86_64 \
  -drive format=raw,file=/dev/mapper/vg_vm-lv_vm_test,if=virtio,cache=none \
  -net nic,model=virtio \
  -net user \
  -vga virtio \
  -display gtk,gl=on \
  -smp 3 \
  -cpu host \
  -machine type=pc,accel=kvm \
  -m 3G

Resultados (cada valor representa uma única execução):

  • Criando novo arquivo: 129 MB/s; 125MB/s
  • Gravando em arquivo existente: 103 MB/s; 97MB/s; 81,9 MB/s

Pergunta

É claro que há diferença entre essas duas soluções, no entanto, eu esperava que o dispositivo de bloco bruto fosse pelo menos tão rápido quanto o arquivo de imagem, porque não deveria haver sobrecarga no sistema de arquivos do host. Suponho que ocorre algum cache entre a imagem do arquivo ou as opções para o dispositivo de bloco bruto não são ideais. Por que o LV bruto é mais lento neste caso? O que posso fazer para melhorar seu desempenho? Ou se deveria ser mais lento, então por quê?

EDIT: adicionei o terceiro caso de teste usando configurações de:http://www.linux-kvm.org/page/Tuning_KVM. Acontece que é um pouco mais rápido, mas ainda mais lento que a imagem do arquivo. Observei também que a cada execução do arquivo existente ele fica mais lento - no entanto, a fragmentação não deve ocorrer para substituição de arquivo, por isso não sei por que isso acontece.

Responder1

A incompatibilidade de tamanho de bloco pode ser o problema.

Idealmente, você deseja combinar seu sistema de arquivos com o tamanho do bloco subjacente da mídia. Embora você não tenha compartilhado o que escolheu para tamanhos de bloco, acho que você tem 4 kilobytes para tentativa Ext4 e 512 bytes para LV. Se o tamanho natural do bloco da sua mídia subjacente for de 4 kilobytes, acho que isso explica tanto o seu problema de velocidade quanto a sua velocidade decrescente. Como você possivelmente está gravando apenas 512 em um bloco de 4k, você desperdiçou 75% do bloco e as gravações subsequentes usarão mais blocos, gerando mais sobrecarga e desperdício.

Tente novamente o teste com um tamanho de bloco de sistema de arquivos bem compatível com o tamanho do bloco de mídia subjacente. Neste caso, experimente seu LV com tamanho de bloco de 4k.

O LVM adiciona um pouco mais de sobrecarga que o Ext4. Resposta de estouro de pilha Então acho que isso explicaria por que é um pouco mais lento. :)

informação relacionada