La memoria en Hyper-V
Introducción
La memoria es uno de los aspectos mas críticos que pueden existir a la hora de virtualizar, entender la arquitectura de memoria de Hyper-V nos permitirá comprender como aprovechar mejor nuestros recursos y obtener el mejor rendimiento posible.
Que vamos a ver en este articulo
- Escogiendo la memoria física del servidor
- Limites de memoria en Hyper-V
- La reserva de memoria del host
- El fichero de paginación (host y VM)
- Los ficheros .BIN
- Entender la memoria dinámica en profundidad
- Monitorizar la memoria
- Gestionando la memoria dinámica
- Conceptos avanzados: la memoria y los grupos NUMA
- Conclusiones
Escogiendo la memoria física del servidor
Hace poco veíamos en un articulo en este blog, lo importante que es equilibrar adecuadamente la configuración del host para poder obtener el mejor coste por VM posible. (La importancia del equilibrio en la elección del host- Impacto en el coste por VM)
Esta claro que la cantidad de memoria es el parámetro mas importante sobre la memoria, si bien la velocidad y la latencia de la memoria son siempre importantes en un host de virtualización lo normal seria sacrificar si es necesario estos otros aspectos con el fin de obtener mas cantidad de memoria al mismo precio.
La evolución de los procesadores también juega a vuestro favor ya que cada procesador presiona mas al resto de los componentes para evolucionar y así por ejemplo cuando salió la serie de XEON 5500 de Intel se podia llegar a rebajar la latencia en la memoria casi un 50% con respecto al XEON 5400.
Se puede conseguir mas memoria a menor precio comprando memoria mas lenta y de igual forma podemos tener memoria mas rápida al mismo precio reduciendo la cantidad de memoria.
Yo no soy un experto en hardware pero segun la información que puedes encontrar en internet, para que podáis tener criterio, diremos por ejemplo que la memoria DDR-3 a 1333MHZ puede mover 35GBps, mientras que a 800MHZ moverá 25GBps, evidentemente son cifras muy altas, algunos otros buses en el sistema serán un cuyo de botella mas tarde y puede que al final estas cifras se rebajen a 8GBps reales, debemos tener en cuenta en cualquier caso que en un servidor físico toda esa velocidad esta al servicio de un único sistema, mientras que en un servidor de virtualización estará al servicio de hasta 384 VMs por servidor con Hyper-V.
Sin embargo os recomiendo evaluar cuidadosamente la elección de memoria, por ejemplo muchos fabricantes ofrecen diferentes módulos de memoria con los servidores, la elección que hagamos puede tener impacto en el rendimiento de la memoria ya que por ejemplo algunos módulos de memoria pueden forzar al sistema a rebajar la velocidad del bus para todos los módulos y por tanto seria un desperdicio de dinero conjugar memoria rápida con memoria lenta.
Si piensas ampliar la memoria del servidor en un futuro ten en cuenta los bancos de memoria que quedan libres en el servidor con la configuración de memoria que selecciones.
Limites de memoria en Hyper-V
Como sabéis Hyper-V se puede instalar de dos formas:
Con la versión dedicada y gratuita “Hyper-V Server” que contiene todas las funcionalidades de Hyper-V pero ningún derecho de licencias.
Como un rol de Windows Server que activaras sobre una instalación full o core del sistema operativo, beneficiándote de las ventajas de licenciamiento que esto conlleva, de esta forma por ejemplo al usar Hyper-V como rol de un Windows Server Datacenter que se licencia por socket todas las VMs que montes tendrán los derechos de Windows Server incluidos.
Windows Server Enterprise y Datacenter soportan al igual que Hyper-V server hasta 2TB de memoria, sin embargo Hyper-V solo puede trabajar de forma soportada con 1TB de memoria.
Una maquina virtual puede tener 64GB de memoria, aunque el uso que haga de ellos dependerá por supuesto del sistema operativo que corra dentro de la VM.
La reserva de memoria del host
El host y la partición padre requieren de memoria para funcionar y es muy importante asegurarnos de que tienen la memoria que requieren.
A parte de la propia memoria requerida por el sistema operativo de la partición padre, tenemos que tener en cuenta la memoria que consuma en pico los agentes de antivirus, monitorización, backup, etc.
Debemos de considerar que es mejor que paginen las VM que que pagine el host, aunque como repetiré varias veces en este articulo la paginación es un enemigo natural de la consolidación de VMs.
De esta forma a grandes rasgos te recomiendo lo siguiente:
- Hyper-V requiere 300MB para si mismo
- El sistema en la partición padre requiere 512MB
- Suma la memoria máxima de los agentes que instales en el servidor, antivirus, monitorización, etc
- Por cada VM suma 32MB
- Por cada GB que tenga una VM por encima del primero suma otros 8MB
Suma todo esto y será la cantidad de memoria que tienes que reservar en el host.
Desde SCVMM en las propiedades del host configura la cantidad adecuada:
El resto de memoria que quede en el host será la memoria que podrás usar para las VMs, esto es así por que la memoria de las VM es de un tipo especial denominado “non-paged-pool memory” esto supone una garantía de rendimiento dado que nos garantiza que las VM siempre usaran RAM y no paginación en disco. El host puede paginar pero no por la RAM que usen las VMs.
En este articulo hablaremos también de la memoria dinámica y como esto nos ayudara a obtener el máximo de la memoria del host.
La memoria dinámica supone retos adicionales a la hora de mantener unos recursos determinados para el propio funcionamiento del host incluso configurando las reservas tradicionales que os acabo de contar, por eso con el SP1 ha habido algunos cambios en cuanto a las reservas y ahora Hyper-V calcula por si solo una cantidad de memoria y la reserva al host, esta reserva no puede verse atacada por la memoria dinámica.
Para el calculo de esta reserva especial Hyper-V tiene en cuenta diferentes aspectos como la cantidad total de memoria, la arquitectura de NUMA en el servidor (luego hablare de NUMA) , si el host tiene SLAT o no y por supuesto la memoria usada por las VMs y el overhead que estas producen en el host.
Este calculo que realiza Hyper-V puede no ser correcto para vuestro entorno dado que no tiene en cuenta cosas como el antivirus, los agentes, etc., si realizáis vuestro propio calculo siguiendo las directrices que os he dado antes podéis modificar el calculo de Hyper-V cambiando el valor de la clave de registro memoryreserve dentro de HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization poner este valor muy bajo será muy negativo para el rendimiento así que solo modificarlo si lo habéis analizado adecuadamente.
Cuando se cambia este valor por norma general hay que reiniciar el servidor (no es necesario en todos los supuestos pero os lo recomiendo).
El fichero de paginación
En el host:
Un servidor de Hyper-V siempre es un servidor de 64 bits (x64) la forma "genérica” de calcular el tamaño recomendado para el fichero de paginación de un servidor x64 la podéis encontrar en el siguiente enlace: https://support.microsoft.com/default.aspx?scid=kb;EN-US;889654
Veis que en dicho documento se habla de varios métodos para determinar el tamaño si en tu caso no requieres poder realizar volcados de memoria completos puedes reducir el fichero de paginación al mínimo usando el método 2 explicado en el documento.
Ten en cuenta que un volcado de memoria de un servidor con 256GB de RAM dura lo suyo y que además por defecto necesitarías un gran disco duro solo para sostener el fichero de paginación con una configuración típica.
En las VMs:
El mismo articulo aplica a las maquinas virtuales, pero ten en cuenta lo siguiente:
-Si un sistema operativo pagina es por que le falta memoria RAM.
-Si un sistema pagina, consume operaciones de entrada y salida (I/O) en disco
Cuando virtualizas muchas VMs en un mismo servidor y sistema de almacenamiento las I/O deben de ser de las cosas que mas te preocupen.
Si una VM pagina en disco tendrá un impacto al que seguramente podrás sobrevivir, si por ejemplo tienes 1000 VDIs y has dimensionado mal la memoria y un porcentaje importante de estas VMs pagina entonces el rendimiento general será realmente penoso.
Si bien la memoria dinámica que veremos mas tarde en este articulo te ayuda con este aspecto también, esto no quita que tengas que ser muy cuidadoso a la hora de calcular la memoria real que necesitas.
Aun con memoria dinámica si no has calculado bien puedes quedarte sin memoria con la que jugar y entonces veras cifras negativas de memoria disponible en las VMs y por tanto estarás sufriendo paginación:
Por favor monitoriza adecuadamente todas tus VM para darte cuenta si paginan y ajusta la RAM convenientemente para evitar la paginación en la medida de lo posible.
Hay consideraciones adicionales para el fichero de paginación cuando vas usar memoria dinámica, las explico mas tarde cuando trate este tema en este articulo.
Si el rendimiento de la paginación es critico para una VM, puedes usar un VHD fijo adicional para la paginación, esto te dará mas rendimiento extra.
Los ficheros .BIN
En cualquier momento puede ser necesario realizar operaciones que tienen repercusiones con respecto a la memoria de una VM, como por ejemplo pausar una VM o sacar una instantánea.
Hyper-V es un sistema tremendamente protector que intenta a toda costa evitarte problemas especialmente los de estabilidad.
Por esto Hyper-V reserva en el disco espacio para poder respaldar la memoria de la VM en disco y esto lo hace a través del fichero .BIN que veras que en ocasiones ocupa tanto como la memoria asignada a la maquina virtual.
Este comportamiento es el normal y no se puede evitar, no es necesario que hagas backups de estos ficheros.
La memoria dinámica tiene implicaciones también para los ficheros BIN, mas tarde en este articulo os hablare de ello.
Entender la memoria dinámica en profundidad
Cuando configuras una maquina virtual hay dos formas de configurar su memoria, estáticamente o dinámicamente.
Configuración de memoria estática
Cuando se configura una VM con memoria estática será necesario contar con toda esa memoria RAM libre en el host para poder arrancar la maquina virtual, si el host no tiene suficiente memoria RAM recibiremos un error que nos impedirá arrancar la VM en este host, pudiéndolo intentar en otro nodo del cluster si es que estamos en un cluster.
En la siguiente captura del performance monitor ves como la RAM usada en el host crece automáticamente por el valor de la RAM configurada en una VM en cuanto esta arranca.
De esta forma si configuramos todas las VM de un host con memoria estática la suma de la cantidad de memoria RAM de todas las VM mas la memoria RAM no paginada usada por el HOST nunca podrá superar la RAM total del HOST.
Configuración de memoria dinámica
Normalmente los servidores o escritorios virtualizados no usan el 100% de la memoria asignada durante todo el tiempo, de hecho a ninguno nos gusta que ninguna de nuestras maquinas este al 90% de uso de memoria de forma constante ¿verdad?.
Hyper-V a través de la memoria dinámica nos permite aprovechar de forma inteligente la memoria no usada en las maquinas virtuales redistribuyendo esta memoria a las maquinas virtuales que la necesitan dentro del host.
Lo mejor de este sistema es que no afecta al rendimiento de forma perceptible, no entraña riesgos y no te requiere de ningún cambio de configuración en el sistema operativo de la VM para aprovechar todo su potencial. Además es gratis!.
Tal vez el único punto negativo es que la memoria dinámica (en adelante DM) no funciona con maquinas virtuales Linux.
Podéis usar DM en servidores Windows Server 2008 R2 SP1 con Hyper-V o con la versión gratuita de Hyper-V; Hyper-V Server 2008 R2 SP1.
Las maquinas virtuales en las que activéis DM pueden ser Windows Server 2003, 2008 y 2008 R2 tanto en 32 como en 64-bit.
También podéis usar DM en Vista y Windows 7 versiones enterprise y ultimate en 32 y 64-bit.
Cosas importantes que tenéis que saber también sobre la DM son:
-Que si usáis SCVMM y SCOM los PRO-TIPs y Live Migration son absolutamente conscientes de la memoria dinámica, seréis avisados cuando haya problemas de memoria y las VMs se pueden mover solas si queréis para aliviar la presión en los nodos, Live Migration se encarga de liberar RAM en el destino si es necesario y posible para hacer hueco a la VM.
-Hyper-V nunca paginara para crear RAM de donde no hay por lo que nunca tendréis problemas de rendimiento.
Cuando configuramos una VM con memoria dinámica indicamos 3 parámetros iniciales:
La memoria de arranque será la cantidad de memoria que la VM reclamara al HOST para arrancar y una vez la VM arranque estará completamente bloqueada para su uso.
Hay dos formas de tomar la decisión de cuanta memoria asignar como memoria de arranque:
1) Podemos usar la tabla de memoria mínima necesaria por sistema operativo, a continuación os pongo esta tabla con este valor para todos los sistemas operativos soportados con memoria dinámica:
Si bien esta forma de hacerlo es la mejor cuando buscamos maximizar todo lo posible el potencial de la DM, desde mi punto de vista no es el mejor enfoque aunque es una opinión personal.
2) Desde mi punto de vista es mejor tomar la decisión basándonos en los datos de la monitorización, si sabemos que un servidor emplea habitualmente 1.2GB no tiene sentido configurarlo con una memoria mínima de 512 MB, será mejor configurar una memoria mínima cercana al uso real.
Creo que esto nos permite un mejor y mas realista dimensionamiento de los sistemas a la vez que evita al host operaciones innecesarias.
El siguiente parámetro a configurar es la memoria máxima, si bien en algunos sitios se ha leído que lo mejor es configurar la memoria máxima al máximo permitido por Hyper-V (64GB) o bien al máximo permitido por el sistema operativo de la VM si es menos de 64GB, en mi opinión personal tenemos que configurar un valor que consideramos apropiado a la carga que existe dentro de la VM y al coste que queramos repercutir a ese servicio.
Por ejemplo es muy lógico configurar una VM VDI Windows 7 con 768MB de arranque y 2GB de RAM Máxima
El siguiente parámetro es el buffer, podemos entender esta parámetro fácilmente viéndolo como el que especifica a Hyper-V que cantidad de memoria tiene que darle de una sola vez a la VM cada vez que es necesario.
Si configuramos el buffer a un 10% y una VM que tiene ocupados 1GB requiere mas RAM, Hyper-V tratara de darle 100MB si están disponibles bien como memoria libre en el host o bien como memoria que puede liberarse por falta de uso en otras VMs con DM.
Si ponemos el buffer a un valor muy bajo se le entregara memoria a la VM en bloques pequeños por lo que la VM no tendera a tener mucha memoria libre, sin embargo un buffer mayor dejara holgura en la VM lo que puede ser beneficioso para algunas cargas que usan caches en RAM.
Deciros que si es posible atender una solicitud de memoria Hyper-V lo hace de forma activa e inmediata en cuanto una VM lo solicita.
¿como añade y quita memoria Hyper-V?
Hyper-V gestiona la DM a través de varios componentes nuevos introducidos en SP1.
Hyper-V añade la memoria gracias los componentes de integración (IC) que sabéis que tenéis que instalar en todas las VM que ponéis en Hyper-V por eso cuando actualizáis vuestros Hyper-V R2 a SP1 tenéis que actualizar los IC de todas las VM para que puedan usar DM.
Dentro de los IC de la VM hay un elemento que se encarga de comunicar a Hyper-V la presión de memoria que hay dentro de la VM, a este componente le llamamos “Dynamic Memory VSC” donde VSC significa Virtual Service Consumer.
Hyper-V tiene otro componente análogo llamado “Dynamic Memory VSP” donde VSP significa Virtual Service Provider este componente se encarga de escuchar la información de los VSC sobre la presión de memoria dentro de las VMs.
Finalmente Hyper-V tiene otro componente denominado “Memory Balancer” este componente se encarga de seguir la presión de memoria de todas las VMs con la información que le pasa el VSC y si es necesario y se puede reclama la memoria no usada y también asigna memoria a las maquinas que lo necesiten.
Al añadir memoria se usa una funcionalidad que aportan los IC para añadir memoria en caliente lo que dispara el sistema de Plug and play para detectar la nueva memoria dentro del sistema operativo de la VM.
Si os dais cuenta DM funciona en sistemas operativos que no soportan de serie la funcionalidad de añadir memoria en caliente, esto es gracias como os digo a los IC.
Quitar memoria es un poco mas difícil de entender, principalmente por que DM en realidad si lo vemos desde el punto de vista del sistema operativo de la VM nunca quita la memoria aunque en realidad la memoria física ya no esta disponible para la VM. veamos como es esto…
La DM en Hyper-V a la hora de quitar memoria usa una técnica denominada “balloning” o balón de memoria.
Cuando Hyper-V decide quitarle memoria a una VM por que no la usa esta memoria libre se prepara dentro de la VM y entonces gracias a un driver introducido por los IC Hyper-V hincha el balón de memoria dentro de la VM usando memoria no paginada, este balón indica al sistema operativo que esa memoria esta siendo usada por el driver de forma que el sistema operativo ya no la usa para nada mas e Hyper-V puede por detrás retirar esa memoria física y asignársela a otra VM.
Si usáis la herramienta rammap de sysinternals veréis lo bien que se ve como el driver bloquea la memoria.
La reclamación de la memoria no se realiza inmediatamente en cuanto la VM no la necesita salvo que otras VMs estén reclamando esa memoria y no haya mas memoria libre en el sistema.
Con el fin de optimizar el proceso y evitar esperas, Hyper-V recolecta la memoria libre cada 5 minutos.
Otro parámetro que se puede configurar es la prioridad o peso que tendrá esta VM respecto a otras a la hora de reclamar memoria.
Ya he comentado varias veces en este blog lo que opino de las reservas y prioridades, si lo vais a usar analizarlo cuidadosamente y forzaros a revisarlo periódicamente para ver si el criterio sigue aplicando.
Presión de memoria y banda de presión:
Para entender cuando una VM pide memoria tenemos que entender el concepto de presión de memoria
Expresamos la presión de memoria como un %, este porcentaje se calcula dividiendo el valor de “current commit charge” por el valor de la memoria física, el porcentaje restante hasta el total de la memoria RAM física que ve la VM es el valor que llamamos “free buffer”
Podéis ver el valor de “current commit charge” de muchas formas una de ellas es desde el process explorer.
Cuando la presión es superior al 100% la VM estará paginando mucho y el “free buffer” será negativo.
Hyper-V ve la presión de memoria de la VM dentro del contexto de lo que denominamos banda de presión, esta banda tiene unas marcas de agua que establecen la presión mínima y máxima dentro de la VM, los datos de presión mínima y máxima se establecen en base a la información histórica de presión de memoria dentro de la VM.
Si la presión actual se mantiene entre el mínimo y el máximo la memoria ni se quitara ni pondrá.
La memoria se quita cuando la presión de memoria esta por debajo de la presión mínima y se pide memoria cuando se excede la presión máxima.
Para que la DM funcione adecuadamente es necesario que la maquina virtual tenga bien configurada la paginación, si el fichero de paginación no es suficientemente grande Hyper-V no podrá añadir mas memoria a la VM.
Permíteme un ejemplo que voy a simplificar mucho para que entendáis esto ultimo: una VM tiene en este momento 1GB asignado, esta usando 950MB y un proceso pide 100MB, lo primero que es necesario es que el sistema operativo dentro de la VM le de esos 100MB y para eso tendrá que paginar los 50 que faltan, justo después Hyper-V detectara la condición y le añadirá memoria a la VM, pero si no hay espacio en el fichero de paginación no será posible todo esto.
Otra cosa a tener en cuenta es que el sistema operativo dentro de la VM si esta configurado para establecer dinámicamente el tamaño del fichero de paginación lo hará en función de la cifra de RAM que configuramos como memoria de arranque, esto implica que si queremos que dentro de una VM se pueda ejecutar un volcado de memoria completo será necesario configurar el tamaño del fichero de paginación manualmente al tamaño máximo de memoria que pueda tener la VM.
Es común preguntarnos si debemos usar o no la DM en nuestras VMs, la respuesta seria que si en la gran mayoría de los casos, solo evitaremos su uso en aquellas VMs que tengan cargas donde el fabricante explícitamente no soporte este tipo de tecnológicas o donde no tengan sentido por ser cargas como bases de datos que tienden a usar toda la RAM disponible como cache de datos, en este blog tenéis un articulo sobre DM en servidores de Exchange y SQL server: ¿Puedo usar la memoria dinámica de Hyper-V con Exchange y SQL Server-
Hay un ultimo aspecto que comentaros sobre la memoria dinámica y es que el fichero .BIN puede crecer al incrementarse la cantidad de memoria debido a una operación de adición de memoria.
Si no hay espacio para que el .BIN crezca no se podrá añadir mas memoria (https://support.microsoft.com/kb/2504962)
Si usas Windows Server 2008 SP2 y ves que no se incrementa la memoria de la VM por encima de la memoria de arranque, evalúa este articulo de la KB: https://support.microsoft.com/kb/2230887
Monitorizar la memoria
Básicamente tenemos dos grupos de contadores, los contadores del balanceador de memoria que nos hablan de la memoria que el host tiene disponible y de las operaciones de añadir y quitar memoria y por otra parte los contadores relativos a cada VM que nos hablan de la memoria que se quita y se pone y de la presión de memoria que experimenta la VM.
Gestionando la memoria dinámica:
Cuando salió la versión RC de System Center Virtual Machine Manager 2008 R2 SP1 realice una serie de artículos en este blog sobre la gestión de la memoria dinámica, os dejo aquí los enlaces por si tenéis inquietudes sobre estos aspectos:
Gestionando la memoria dinamica I- Actualizando SCVMM R2 a SP1 (RC)
Gestionando la memoria dinamica II- Actualizando los agentes de SCVMM
Gestionando la memoria dinamica III- Integración SCVMM R2 SP1 y SCOM
Gestionando la memoria dinamica IV- La consola de SCVMM R2 SP1
Gestionando la memoria dinamica VI- Controlando la presión
Gestionando la memoria dinamica VI (b)- Controlando la presión (Informe personalizando SCOM)
Conceptos avanzados: la memoria y los grupos NUMA
Mi próximo post en este blog será sobre NUMA y por tanto os emplazo a el para entender las repercusiones de NUMA en la arquitectura de memoria de Hyper-V.
Conclusiones
Mientras que puede parecer que la memoria es un concepto muy sencillo y realmente lo es, hay un montón de cosas como ves en este articulo con son interesantes de entender si quieren alcanzar un nivel mas profundo de conocimiento sobre la virtualización con Hyper-V.
Gracias a la gestión de memoria de Hyper-V y a la memoria dinámica esperamos que podáis aprovechar al máximo vuestros hosts sin tener que preocuparos por ningún riesgo para el rendimiento.
Espero que el articulo os sea interesante.
Un saludo!
Comments
Anonymous
April 13, 2011
Muchas gracias por tu Articulo Daniel , Pero me surge una duda . Siempre que hablas del Fichero de paginación , es el fichero de la VM o de la partición padre? Muchas Gracias SaludosAnonymous
April 13, 2011
Pues depende de la sección del articulo, en el apartado sobre el fichero de paginación ves que hay dos secciones con titulo en negrita una para el host y otra para la VM, en el resto del articulo se habla de la VM.