Increíblemente bajo rendimiento del disco KVM (archivos de disco qcow2 + virtio)

27

Tengo algunos problemas graves de rendimiento del disco al configurar un invitado KVM. Usando una ddprueba simple , la partición en el host en el que residen las imágenes qcow2 (una matriz RAID duplicada) escribe a más de 120 MB / s , mientras que mi invitado recibe escrituras que varían de 0.5 a 3 MB / s .

  • El invitado está configurado con un par de CPU y 4G de RAM y actualmente no está ejecutando nada más; Es una instalación completamente mínima en este momento.
  • El rendimiento se prueba usando time dd if=/dev/zero of=/tmp/test oflag=direct bs=64k count=16000.
  • El invitado está configurado para usar virtio, pero esto no parece hacer una diferencia en el rendimiento.
  • Las particiones del host están alineadas a 4 kb (y el rendimiento es bueno en el host, de todos modos).
  • El uso del almacenamiento en caché de reescritura en los discos aumenta enormemente el rendimiento informado, pero prefiero no usarlo; incluso sin él, el rendimiento debería ser mucho mejor que esto.
  • El host y el invitado ejecutan Ubuntu 12.04 LTS, que viene con qemu-kvm 1.0 + noroms-0ubuntu13 y libvirt 0.9.8-2ubuntu17.1.
  • El host tiene habilitado el planificador de IO de fecha límite y el invitado tiene noop.

Parece que hay muchas guías que modifican el rendimiento de kvm, y llegaré allí eventualmente, pero parece que debería estar obteniendo un rendimiento mucho mejor que esto en este momento, por lo que parece que algo ya está muy mal.

Actualización 1

Y de repente, cuando vuelvo y pruebo ahora, son 26.6 MB / s; Esto es más parecido a lo que esperaba con qcrow2. Dejaré la pregunta en caso de que alguien tenga alguna idea sobre cuál podría haber sido el problema (y en caso de que vuelva misteriosamente).

Actualización 2

Dejé de preocuparme por el rendimiento de qcow2 y simplemente corté a LVM en la parte superior de RAID1 con imágenes en bruto, todavía usando virtio pero configurando cache = 'none' e io = 'native' en la unidad de disco. El rendimiento de escritura ahora es appx. 135 MB / s usando la misma prueba básica que la anterior, por lo que no parece tener mucho sentido descubrir cuál era el problema cuando se puede solucionar tan fácilmente.

El Yobo
fuente
No mencionó la distribución y las versiones de software en uso.
dyasny
Se agregó información sobre las versiones.
El Yobo
ah, como se esperaba, ubuntu ... ¿alguna posibilidad de que puedas reproducir esto en fedora?
dyasny
El servidor está en Alemania y actualmente estoy en México, por lo que podría ser un poco complicado. Y si de repente funcionó ... todavía no me gustaría tener que lidiar con un servidor Fedora;) He visto algunos comentarios que sugieren que los sistemas Debian / Ubuntu tenían más problemas que Fedora / CentOS para KVM. El trabajo de desarrollo se realizó allí.
El Yobo
exactamente mi punto. y en cualquier caso, si buscas un sistema operativo de nivel de servidor, necesitas RHEL, no Ubuntu
dyasny

Respuestas:

14

Bueno, sí, los archivos qcow2 no están diseñados para un rendimiento increíblemente rápido. Obtendrá mucha mejor suerte de las particiones en bruto (o, preferiblemente, LV).

womble
fuente
3
Obviamente, pero tampoco están destinados a ser tan malos como los números que obtengo.
El Yobo
1
La mayoría de los ejemplos muestran un rendimiento similar con qcow2, que parece ser una mejora significativa con respecto a la versión anterior. El sitio KVM en sí mismo ha aparecido en linux-kvm.org/page/Qcow2 que muestra tiempos comparables para una variedad de casos.
El Yobo
1
18:35 (qcow2) vs 8:48 (raw) es "tiempos comparables"?
womble
1
Los cambié a imágenes en bruto respaldadas por LVM en la parte superior de RAID1, configuré el planificador io en noop en el invitado y la fecha límite en el host y ahora escribe a 138 MB / s. Todavía no sé qué fue lo que causó que el qcow2 tuviera las velocidades de 3 MB / s, pero claramente puede evitarse usando raw, así que gracias por empujarme en esa dirección.
El Yobo
1
Eso no es del todo cierto: ¡los últimos parches en qemu aceleran mucho qcow2! Estamos casi a la par.
lzap
7

Cómo lograr el máximo rendimiento con QCOW2 :

qemu-img create -f qcow2 -o preallocation=metadata,compat=1.1,lazy_refcounts=on imageXYZ

El más importante es la preasignación, que da un buen impulso, según los desarrolladores de qcow2. ¡Está casi a la par con LVM ahora! Tenga en cuenta que esto generalmente está habilitado en las distribuciones de Linux modernas (Fedora 25+).

También puede proporcionar memoria caché insegura si esta no es una instancia de producción (esto es peligroso y no se recomienda, solo es bueno para las pruebas):

<driver name='qemu' cache='unsafe' />

Algunos usuarios informan que esta configuración supera la configuración LVM / insegura en algunas pruebas.

¡Para todos estos parámetros se requiere la última versión de QEMU 1.5+ ! Una vez más, la mayoría de las distribuciones modernas tienen estos.

lzap
fuente
2
Es no una idea buena de usar cache = insegura: un apagado inesperado huésped puede causar estragos en la totalidad del sistema de ficheros de invitados. Es mucho mejor usar caché = reescritura: rendimiento similar, pero mucha mejor confiabilidad.
shodanshok
1
Como he dicho: si esto no es una instancia de producción (bueno para probar)
lzap
Lo suficientemente justo. Me lo perdí;)
shodanshok
6

Logré excelentes resultados para la imagen qcow2 con esta configuración:

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

que deshabilita los cachés de invitados y habilita AIO (Asynchronous IO). Ejecutar su ddcomando me dio 177 MB / s en el host y 155 MB / s en el invitado. La imagen se coloca en el mismo volumen LVM donde se realizó la prueba del host.

Mi qemu-kvmversión es 1.0+noroms-0ubuntu14.8y kernel 3.2.0-41-genericdel stock Ubuntu 12.04.2 LTS.

gertas
fuente
55
¿Configura un tipo de imagen qcow2 como "sin procesar"?
Alex
Supongo que he copiado una entrada anterior, supongo que los beneficios de velocidad deberían ser los mismos type='qcow2', ¿podría verificar eso antes de editar? No tengo más acceso a dicha configuración: migré a LXC con mount binddirectorios para lograr velocidades nativas reales en los invitados.
gertas
2

Si está ejecutando su vms con un solo comando, para argumentos puede usar

kvm -drive file = / path_to.qcow2, if = virtio, cache = off <...>

Me consiguió de 3 MB / sa 70 MB / s

Kourindou Hime
fuente
2

En versiones antiguas de Qemu / KVM, el backend de Qcow2 era muy lento cuando no estaba preasignado, más aún si se usaba sin caché de reescritura habilitada. Ver aquí para más información.

En las versiones más recientes de Qemu, los archivos Qcow2 son mucho más rápidos, incluso cuando no se utiliza una asignación previa (o una asignación previa solo de metadatos). Aún así, los volúmenes LVM siguen siendo más rápidos.

Una nota sobre los modos de caché: la caché de reescritura es el modo preferido, a menos que se use un invitado sin compatibilidad o deshabilitado para la descarga / barreras de caché de disco. En la práctica, los invitados Win2000 + y cualquier opción de montaje de barrera EXT4, XFS o EXT3 + de Linux son multas. Por otro lado, cache = inseguro nunca debe usarse en máquinas de producción, ya que los vaciamientos de caché no se propagan al sistema host. Un apagado inesperado del host puede literalmente destruir el sistema de archivos del huésped.

shodanshok
fuente
2

Experimenté exactamente el mismo problema. Dentro de la máquina virtual RHEL7 tengo el software de destino LIO iSCSI al que se conectan otras máquinas. Como almacenamiento subyacente (backstore) para mis iSCSI LUN inicialmente utilicé LVM, pero luego cambié a imágenes basadas en archivos.

En pocas palabras: cuando el almacenamiento de respaldo está conectado al controlador de almacenamiento virtio_blk (vda, vdb, etc.): el rendimiento del cliente iSCSI que se conectó al objetivo iSCSI estaba en mi entorno ~ 20 IOPS, con rendimiento (dependiendo del tamaño de IO) ~ 2- 3 MiB / s. Cambié el controlador de disco virtual dentro de la máquina virtual a SCSI y puedo obtener más de 1000 IOPS y un rendimiento de más de 100 MiB / s de mis clientes iSCSI.

<disk type='file' device='disk'>
   <driver name='qemu' type='qcow2' cache='none' io='native'/>
   <source file='/var/lib/libvirt/images/station1/station1-iscsi1-lun.img'/>
   <target dev='sda' bus='scsi'/>
   <address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
Greg W
fuente