QEMU + KVM + LVM: rendimiento de la unidad del dispositivo de bloque frente a la imagen del archivo

QEMU + KVM + LVM: rendimiento de la unidad del dispositivo de bloque frente a la imagen del archivo

Estoy creando una nueva configuración para mis máquinas virtuales y probando qué método de almacenamiento es el más rápido. Mi entorno de prueba consta de una unidad HDD con LVM en LUKS. Creé un LV único para la unidad de la máquina virtual y lo reutilicé en ambas pruebas para mantener el mismo lugar en la unidad de disco duro y mantener un rendimiento constante (la velocidad de lectura/escritura del disco duro depende de la posición física).

  • Anfitrión: Arch Linux, kernel 4.12.8
  • Invitado: Escritorio Ubuntu 17.04

Rendimiento probado con comando:

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

Primera prueba: usar LV directamente como unidad de máquina virtual

Dominio:

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 una ejecución única):

  • Creando un nuevo archivo: 98,4 MB/s; 112 MB/s
  • Escritura en un archivo existente: 62,5 MB/s; 68,7 MB/s; 64,8 MB/s

Segunda prueba: crear ext4 en LV y colocar un archivo de imagen sin formato en eso

Dominio:

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 una ejecución única):

  • Creando un nuevo archivo: 254 MB/s; 242 MB/s
  • Escritura en un archivo existente: 187 MB/s; 189 MB/s; 190 MB/s

Tercera prueba: usar LV directamente como unidad de máquina virtual, diferentes configuraciones

Dominio:

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 una ejecución única):

  • Creando un nuevo archivo: 129 MB/s; 125 MB/s
  • Escritura en un archivo existente: 103 MB/s; 97 MB/s; 81,9 MB/s

Pregunta

Claramente hay una diferencia entre estas dos soluciones; sin embargo, esperaba que el dispositivo de bloque sin formato fuera al menos tan rápido como el archivo de imagen porque no debería haber una sobrecarga del sistema de archivos del host. Supongo que se produce algo de almacenamiento en caché en el medio para la imagen del archivo o que las opciones para el dispositivo de bloque sin formato no son óptimas. ¿Por qué el LV bruto es más lento en este caso? ¿Qué puedo hacer para mejorar su rendimiento? O si simplemente debería ser más lento, ¿por qué?

EDITAR: agregué un tercer caso de prueba usando la configuración de:http://www.linux-kvm.org/page/Tuning_KVM. Resulta ser un poco más rápido pero aún más lento que la imagen del archivo. También observé que con cada ejecución de un archivo existente se vuelve más lento; sin embargo, no debería ocurrir fragmentación al sobrescribir archivos, por lo que no estoy seguro de por qué sucede.

Respuesta1

El problema podría ser la discrepancia en el tamaño del bloque.

Lo ideal es hacer coincidir su sistema de archivos con el tamaño de bloque subyacente del medio. Si bien no compartió lo que eligió para los tamaños de bloque, creo que tiene 4 kilobytes para el intento Ext4 y 512 bytes para el LV. Si el tamaño de bloque natural de su medio subyacente es de 4 kilobytes, creo que esto explica tanto su problema de velocidad como su disminución. Dado que posiblemente solo esté escribiendo 512 en un bloque de 4k, desperdició el 75% del bloque y las escrituras posteriores utilizarán más bloques, lo que generará más gastos generales y desperdicio.

Vuelva a intentar la prueba con un tamaño de bloque del sistema de archivos que coincida con el tamaño del bloque de medios subyacente. En este caso, pruebe su LV con un tamaño de bloque de 4k.

LVM agrega un poco más de sobrecarga que Ext4. Respuesta de desbordamiento de pila Entonces creo que esto explicaría por qué es un poco más lento. :)

información relacionada