Hotplug de CPU en QEMU+KVM

Desde la versión 2.7 rc1 de QEMU (publicada el 1 de Agosto 2016) es posible realizar, al fin, una modificación en el número de CPUs sin reiniciar el servidor. A esta función se le denomina “hotplug” de CPU.

Hasta ahora tan solo se podía aumentar el número de cores, ahora es posible también disminuirlos sin tener que apagar del todo el servidor, pero eso si, con ciertas restricciones.

  • No es posible quitar el último core (el primero de todos según se inicia el servidor).
  • Ciertos sistemas operativos no lo soportan porque no son capaces de “activar” las CPUs cuando se les engancha. En los Redhat’s y variantes (CentOS, p.ej) funciona bien. En los sistemas operativos Windows, también funciona adecuadamente. Los sistemas operativos Debian en cambio requieren de ciertas modificaciones en el “udev” para que el sistema operativo active los nuevos cores.
  • Solo lo he probado a partir de kernels 4.4, que es lo que suelo utilizar. En cualquier caso, necesitaría un kernel moderno. Yo no probaría aun a utilizar kernel 4.6.

Esta funcionalidad no está integrada en libvirt 2.0 aun, por lo que se ha de hacer a mano desde qemu, via “monitor”. Por simplificar, y como casi todos arrancamos los procesos con qemu+libvirt pongo el comando para libvirt exacto.

Primero vemos a ver el ID de nuestro servidor virtual. Se puede hacer igual con el nombre, para el argumento de –domain.

 

Seguidamente vamos a obtener las posiciones disponibles en las que enganchar las CPUs nuevas.

 

Hay que fijarse en la parte del “qom_path” de cada CPU. Para el siguiente comando “device_add” necesitamos pasarle el tipo de objeto, “qemu64-x86_64-cpu”, y donde lo vamos a colocar.

Según el comando anterior, y mirando el qom_path, tenemos dos CPUs ocupadas y nos quedan dos huecos libres.

 

Ahora para enganchar una nueva CPU tecleamos.

Explico todos los argumentos del comando virsh.

  • qemu-monitor-command: sirve para comunicarse con el proceso de qemu via un socket llamado “monitor”. Si tecleamos, por ejemplo, qemu-monitor-command –domain 13 –hmp help, enviaría al proceso de qemu el –help para que sacase las diferentes opciones disponibles. Este socket “monitor” está bloqueado por libvirt para poder gestionar el proceso de QEMU.
  • hmp: hay dos maneras de enviar comandos al proceso de qemu, una es via JSON, y otra, que es esta, via comandos.
  • device_add: el comando para añadir nuevos devices, ya sean tarjetas de red, CPUs, etc..
  • qemu64-x86_64-cpu: el tipo de objeto que estamos añadiendo. En este caso una CPU x86. Obviamente, no se pueden añadir diferentes tipos de CPU, y para cada sistema emulado hay que añadir el tipo adecuado. Hay ciertos tipos de emulaciones que aun no admiten este tipo de cambios en las CPUs.
  • socket-id=3, code-id=0, thread-id=0: Cuando creamos el servidor le especificamos la “estructura” de las CPUs, como si fuera la placa base de nuestro PC casero. P.ej:

-smp 2,sockets=2,cores=1,threads=1 (2 sockets de 1 core cada 1, y 1 thread por si queremos emular hyperthreading)

  • id: le ponemos un nombre. Es importante para simplificar el comando de eliminar. En este caso, cpu2.

En este caso, nosotros sabemos que tenemos el socket 3 y 4 libres, por el comando “info hotpluggable-cpus”, y le especificamos que se inserte en el socket 3.

Si en el servidor virtual miramos el fichero /var/log/messages, veremos un mensaje de ACPI indicando una nueva CPU. Aparecerá también en el comando “top” como una nueva CPU si pulsamos “1” para desplegar las CPUs.

Si no aparece en el “top” o en /proc/cpuinfo es probable que haya que activarla

 

Antes de añadir una nueva CPU

Antes y después de añadir una nueva CPU

Después de añadir una nueva CPU

 

 

Para quitar una CPU, ejecutamos:

Y la CPU desaparece del sistema, salvo error.

 

 

Leave a Comment

Your email address will not be published. Required fields are marked *