¿Cómo hacer crecer una máquina en caliente?

Puede haber casos en los que una aplicación que se ejecuta en una máquina virtual empiece a consumir una gran cantidad de recursos y, como resultado, la máquina virtual acaba sin memoria RAM y CPU disponible. Si la aplicación es crítica y debe tener una alta disponibilidad, no se puede simplemente apagar la máquina para agregar más RAM y CPU. En estos casos la función Hot-Add y Hot-Plug que nos ofrece VMware puede venir muy bien.
Hot-Add permitirá mejorar el rendimiento de una máquina virtual, ya que permite añadir memoria RAM de forma dinámica, sin necesidad de la máquina virtual o la aplicación se apague. Lo mismo es cierto para un Hot-Plug, salvo que técnicamente se refiere a la adición de una CPU. Estos términos, de hecho, Hot-Add y Hot-Plug se pueden utilizar indistintamente.
[smallheader]Añadir, modificar y eliminar hardware virtual[/smallheader]
En la mayoría de los casos, sólo un tipo reducido de hardware se puede añadir «en caliente», es decir, mientras la máquina virtual está en ejecución. Para todos los demás, la máquina virtual debe estar apagada antes de que puedan ser añadidos o eliminados. Además, el sistema operativo tienen que ser configurado para reconocer el hardware virtual que desee agregar, sin necesidad de reiniciar la máquina.
Es por esto que VMware desactiva el Hot-Add por defecto, sin embargo en este artículo os mostraré como habilitarlo a nivel de sistema operativo y de hypervisor.
Podéis comprobar el estado de estas dos funciones intentando añadir memoria o CPU a una máquina virtual que se esté ejecutando. Si las opciones de modificar estos recursos están en gris, Hot-Add y Hot-Plug están deshabilitados.
[smallheader]¿Y el sistema operativo de nuestro servidor?[/smallheader]
Antes de habilitar estas funciones hablemos un poco de uno de los obstáculos que nos podemos encontrar: la compatibilidad del sistema operativo.
Como os he avanzado, por un lado el hypervisor debe tener estas opciones activadas, pero por otro el sistema operativo de la máquina virtual debe ser capaz de detectar estos recursos en caliente. En la guía de compatibilidad de VMware, podemos ver si nuestro sistema operativo permite esta adición de recursos.
Mi experiencia dice que cualquier Windows Server a partir de la versión 2003 soporta la adición de RAM. Para poder añadir CPU deberemos tener un 2008 R2 o 2012 R2. En Linux todos aquellos que tengas kernel de la rama 3.x son capaces de gestionar tanto la adición de memoria como CPU.
Ahora bien, para que el kernel linux sea capaz de detectar y usar las CPUs añadidas mediante Hot-Plug deberemos asegurarnos tener estas lineas en el siguiente fichero:
[code style=»2″]$ more /etc/udev/rules.d/99-vmware-cpuhotplug-udev.rules
#
# VMware CPU HotPlug automatization
#
# Automatically bring on-line added processors.
#
ACTION==»add», SUBSYSTEM==»cpu», ATTR{online}=»1″
[/code]
Una vez nos hemos asegurado que el sistema operativo podrá tratar con el hardware añadido en caliente simplemente tendremos que habilitar estas opciones. Para ello iremos a nuestro vSphere Client, apagaremos la máquina virtual en cuestión y en la pestaña Summary haremos clic en Edit Settings.
[notice]Si no quieres tener que parar la máquina virtual, mira la opción para cambios masivos, más adelante en el artículo.[/notice]
En la ventana Virtual Machine Properties, ir a la pestaña Options y seleccionar Memory/CPU Hotplug. A continuación, en la sección Memory Hot Add seleccionaremos la opción “Enable memory…”. De la misma manera, iremos a la sección CPU Hot Plug y seleccionaremos la opción “Enable CPU…”. Por último aceptaremos los cambios.
Hecho esto podemos arrancar la máquina virtual y ya tendremos disponibles las opciones de incrementar la memoria y añadir nuevas CPUs.
De esta forma, la próxima vez que esta máquina se quede sin memoria o CPU podremos incrementar sus recursos sin necesidad de pararla.
[smallheader]¿Y si lo queremos hacer de forma masiva?[/smallheader]
Ahora imaginemos que tenemos decenas de máquinas virtuales en las que nos puede interesar activar estas opciones. En este caso tenemos dos herramientas que nos ayudaran en esta ardua tarea: puppet y powershell.
Con puppet podemos crear una receta para añadir la configuración del fichero mencionado anteriormente a todos nuestros linux.
Una vez preparados todos nuestros sistemas ahora viene la hora de powershell que nos permitirá modificar la configuración de las máquinas virtuales y activar Hot-Add y Hot-Plug.
El siguiente script configura las maquinas dentro de una carpeta (VM-Criticas) habilitándoles el HotAdd Mem/CPU.
[code style=»2″]$VIServer = «10.10.10.1»
##########
# Habilitat Hot-Add y Hot-Plug de todas las VMs #
##########
# Permit schedule execution
Add-PSSnapin VMware.VimAutomation.Core
# Connect to Virtual Center
Connect-VIServer $VIServer
# Search all folders named «VM-Criticas»
Get-Folder -Name «VM-Criticas» | Get-VM | ForEach-Object {
# For each VM configure Hot-Add y Hot-Plug
$VM=$_
$RESOURCE = Get-vm $VM | Get-View
$vm_cfg = New-Object VMware.Vim.VirtualMachineConfigSpec
$vm_cfg_mem = New-Object VMware.Vim.optionvalue
$vm_cfg_mem.Key=»mem.hotadd»
$vm_cfg_mem.Value=»true»
$vm_cfg.extraconfig += $vm_cfg_mem
$RESOURCE.ReconfigVM($vm_cfg)
$vm_cfg = New-Object VMware.Vim.VirtualMachineConfigSpec
$vm_cfg_cpu = New-Object VMware.Vim.optionvalue
$vm_cfg_cpu.Key=»vcpu.hotadd»
$vm_cfg_cpu.Value=»true»
$vm_cfg.extraconfig += $vm_cfg_cpu
$RESOURCE.ReconfigVM($vm_cfg)
}
# Disconnect from Virtual Center
Disconnect-viserver -confirm:$false[/code]
Una vez habilitado, esta configuración no entra en efecto hasta que no se haya reiniciado la máquina virtual, aunque es posible añadir más memoria y CPU mediante powershell:
[code style=»2″]Get-VM -Name «nombre_maquina» | Set-VM -MemoryMB «4096»[/code]
¿Que os parece? ¿Usáis estas funcionalidades?
Muy interesante tu aporte. Me ha servido muchísimo. Mil gracias!
Buen aporte excelente !