Pruebas con KSM
Ya hace bastante tiempo que tengo en agenda probar KSM desde que me enteré de la incorporación de esta tecnología en Linux 2.6.32.
Por aquel entonces estuve haciendo algunas pruebas al respecto con un kernel 2.6.32.3 y qemu-kvm-0.12.1.2, compilados ambos por mi, ya que recién KSM viene soportado a partir de qemu-kvm 0.12 y Linux 2.6.32 no viene con soporte habilitado de serie en los núcleos de kernel.org. Pero, lamentablemente, no funcionó y me daba la impresión que esto se debiera a que la glibc de Debian GNU/Linux Lenny no tuviera soporte para KSM.
Entonces, ahora que ya tenemos Debian congelada y siguiendo por el camino de mis presunciones sobre la glibc, se me ocurrió volver a investigar sobre el tema para ver si la nueva versión estable de Debian ya vendría con soporte de KSM. Hablando con Michael Tokarev, quien ha estado trabajando en el armado de paquetes de KVM para Debian GNU/Linux y algunos de los otros chicos que forman parte de la lista de desarrollo de KVM, me comentaban que en los repositorios Backports tanto la versión actual de Linux como la de qemu-kvm, que es el espacio de usuario de KVM, ya tienen soporte para KSM desde hace tiempo.
Así que instalé en casa qemu-kvm 0.12.4 de los repositorios Backpors, dejando de usar qemu-kvm.0.12.1.2, que dicho sea de paso tiene varios bugs corregidos, algunos de los cuales involucran corrupción de datos.
Como sería de esperarse, este requeriría un kernel lo suficientemente nuevo que haga uso de esta funcionalidad. Y teniendo la previsión por aquel entonces de compilar Linux 2.6.32 con soporte de KSM porque en algún momento tenía ganas de probarlo, ya estaría cubierto por ese lado. Está claro que podría haber usado un kernel de Backports, pero en el momento en que lo compilé supongo que habrá sido porque todavía no estaría disponible en los repositorios. Para poder compilar el soporte de KSM, uno necesita tener los headers del kernel de la interfaz del sistema correspondiente (la llamada al sistema madvise()). Esta no es parte de glibc sino parte de los headers del kernel que usa glibc durante la compilación.
En Debian GNU/Linux hay un parche aplicado que permite usar KSM incluso con headers del kernel que no sean lo suficientemente nuevos como en Lenny, compilando qemu-kvm con los CFLAGS -DMADV_MERGEABLE=12 y -DMADV_UNMERGEABLE=13. Es por eso que arriba hablaba en modo potencial. Es decir que si no tenemos los heades del kernel que no definen MADV_MERGEABLE, tendremos que definirlos al compilar KSM.
Para comenzar a utilizar KSM, primeramente lo habilitamos en el kernel:
# echo 1 > /sys/kernel/mm/ksm/run
Luego de tener KSM funcionando en la semana pasada, hoy, con un poco más de tiempo, levanté algunas máquinas virtuales más para sumar a las que ya tenía (tres de 256 MB de RAM de las cuales una tiene CentOS 5.5 y las otras dos con Debian Lenny, y cuatro de 512 MB de RAM de las cuales dos tienen OpenBSD y las otras dos Debian Lenny). Entre ayer y hoy levanté unas ocho máquinas virtuales más con Debian Lenny de 1 GB de RAM cada una. De esta manera la VMHost con 4 GB de RAM estaría corriendo unas quince máquinas virtuales que suman unos 10,75 GB, dando un ahorro de memoria más que interesante.
Ahora será cuestión de monitorizar el uso de memoria en los próximos días. Por lo pronto, aquí podemos ver algunos valores interesantes:
# for ii in /sys/kernel/mm/ksm/* ; do echo -n "$ii: " ; cat $ii ; done /sys/kernel/mm/ksm/full_scans: 3990 /sys/kernel/mm/ksm/max_kernel_pages: 253500 /sys/kernel/mm/ksm/pages_shared: 44252 /sys/kernel/mm/ksm/pages_sharing: 324019 /sys/kernel/mm/ksm/pages_to_scan: 100 /sys/kernel/mm/ksm/pages_unshared: 412817 /sys/kernel/mm/ksm/pages_volatile: 15370 /sys/kernel/mm/ksm/run: 1 /sys/kernel/mm/ksm/sleep_millisecs: 20
# free
total used free shared buffers cached
Mem: 4056468 2307484 1748984 0 2476 62140
-/+ buffers/cache: 2242868 1813600
Swap: 497848 25996 471852Con esto se estarían usando 2,2 GB de RAM y 25 MB de swap, y se están compartiendo unas 44252 páginas, incrementando la densidad de memoria.
Aquí les dejo un documento interesante escrito por Andrea Arcangeli, Izik Eidus y Chris Wright de RedHat en el Ottawa Linux Symposium del 2009. Así que los resultados aquí mostrados son igual de sorprendentes a los mencionados por RedHat:
The result is a dramatic decrease in memory usage in virtualization environments. In a virtualization server, Red Hat found that thanks to KSM, KVM can run as many as 52 Windows XP VMs with 1 GB of RAM each on a server with just 16 GB of RAM. Because KSM works transparently to userspace apps, it can be adopted very easily, and provides huge memory savings for free to current production systems. It was originally developed for use with KVM, but it can be also used with any other virtualization system – or even in non virtualization workloads, for example applications that for some reason have several processes using lots of memory that could be shared.
Comentarios recientes