
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. :)