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 HDD drive com LVM no LUKS. Eu criei um único LV para o drive de máquina virtual e o reutilizei para que ambos os testes mantivessem o mesmo local no HDD drive para manter um desempenho consistente (a velocidade de leitura / gravação do HDD depende da posição física).
- Host: Arch Linux, kernel 4.12.8
- Convidado: Ubuntu Desktop 17.04
Desempenho testado com o comando:
dd if=/dev/zero of=test bs=16M count=100 conv=sync
Primeiro teste: usando LV diretamente como unidade de 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; 112 MB / s
- Escrevendo para o arquivo existente: 62,5 MB / s; 68,7 MB / s; 64,8 MB / s
Segundo teste: criação de ext4 em LV e colocação de arquivo de imagem bruta nesse
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; 242 MB / s
- Escrevendo para o arquivo existente: 187 MB / s; 189 MB / s; 190 MB / s
Terceiro teste: usando LV diretamente como unidade de 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; 125 MB / s
- Escrevendo para o arquivo existente: 103 MB / s; 97 MB / s; 81,9 MB / s
Pergunta
É evidente que há diferença entre essas duas soluções, entretanto, 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 nenhuma sobrecarga do sistema de arquivos do host. Eu suponho que algum cache ocorre entre para a imagem do arquivo ou opções para o dispositivo de bloco cru não são ideais. Por que o LV bruto é mais lento nesse caso? O que posso fazer para melhorar seu desempenho? Ou se apenas devesse ser mais lento, então por quê?
EDIT: Adicionei o terceiro caso de teste usando as configurações de: link . Acaba por ser um pouco mais rápido, mas ainda mais lento do que a imagem do arquivo. Eu observei também que com cada execução de um arquivo existente ele está ficando mais lento - no entanto, a fragmentação não deve ocorrer durante a sobregravação do arquivo, por isso não sei por que isso acontece.