La virtualización es un recurso ampliamente usado en el entorno de la cloud computing para crear sistemas informáticos virtuales a partir de un dispositivo físico. A pesar de las diferentes ventajas que tiene la virtualización, los ingenieros de todo el mundo aún buscan aumentar su desempeño y eficiencia. De esta forma, el equipo de desarrolladores de AWS creó Firecracker, un virtualizador capaz de crear VM (Virtual Machine, máquinas virtuales) ligeras y con bajo tiempo de inicialización.
Antecedentes: un enfoque de virtualización ineficiente
En la actualidad, el modelo serverless es una de las opciones con mayor adopción a nivel mundial para implementar aplicaciones, ya que permite a las empresas optimizar los tiempos de trabajo de sus equipos de desarrollo, al abstraer todas las tareas relacionadas con la gestión del software y hardware para que puedan centrarse principalmente en las estrategias comerciales.
Por este motivo, Amazon creó AWS Lambda y AWS Fargate, plataformas de computación serverless que permiten a desarrolladores ejecutar códigos sin tener que pensar en las tareas de mantenimiento y configuración de los servidores (back-end). Las soluciones serverless tanto de AWS como de otros proveedores deben tener la capacidad de escalar recursos computacionales, ejecutar código lo más cerca del usuario final (lo que reduce la latencia), realizar implementaciones y actualizaciones rápidas, al mismo tiempo que deben garantizar la seguridad de la información de sus usuarios.
AWS usa la virtualización tanto en Lambda como en Fargate para aislar cuentas de distintos clientes y utiliza contenedores de Linux para aislar funciones. En otras palabras, AWS usa una VM para aislar y ejecutar múltiples funciones de un mismo cliente. El problema de este enfoque es que el uso de contenedores no brinda la seguridad necesaria, además de que la virtualización tradicional presenta dificultades de desempeño tales como el empaquetamiento no eficiente de funciones en VM de tamaño fijo, altos tiempos de inicialización (comúnmente segundos), alto consumo de memoria y CPU (lo que limita la densidad de creación de VM), así como problemas intrínsecos al hypervisor.
Con esto en mente, los ingenieros de AWS buscaron métodos para optimizar su modelo de virtualización actual mediante la creación de un nuevo modelo de implementación de VM, pero que incluyera las siguientes características:
- Aislar y ejecutar múltiples funciones en el mismo hardware, así como brindar una sólida seguridad contra una amplia gama de ataques.
- Ejecutar altas densidades de cargas de trabajo con poca sobrecarga.
- Ejecutar funciones de la misma forma que las que se ejecutan de forma nativa.
- Tener compatibilidad con una amplia gama de software existente en su plataforma.
- Crear y eliminar funciones de forma sencilla.
- Asignar recursos computacionales (CPU, memory) de manera eficiente e inteligente.
AWS Firecracker
Para crear una tecnología de virtualización más eficiente, AWS analizó tanto las soluciones tradicionales como sus versiones que se encuentran aún en desarrollo. En general, los ingenieros observaron que las tecnologías basadas en contenedores brindan un alistamiento operacional eficiente pero no un nivel de seguridad confiable. Mientras que el uso de características de lenguaje como JVM (Java Virtual Machine, máquina virtual Java) o V8 no se ajustan a las técnicas de aislamiento utilizadas en Lambda y Fargate.
El equipo de AWS mantuvo la idea de usar la virtualización y creó Firecracker, una solución de código abierto más eficiente para gestionar servicios basados en funciones y contenedores de múltiples clientes (multi-tenant). Firecracker usa la infraestructura de virtualización de KVM (Linux Kernel-based Virtual Machine, máquinas virtuales basadas en el kernel de Linux) para reemplazar el VMM (Virtual Machine Monitor, Gestionador de Máquinas Virtuales) tradicional y proporcionar VM ligeras (o también llamadas micro VM por sus autores).
La estrategia fue crear un VMM con los componentes integrados de Linux y excluir las funcionalidades no esenciales para proporcionar sistemas operativos huéspedes con las características, el desempeño y el diseño correctos, al mismo tiempo que pueda aprovechar la velocidad y la eficiencia de los contenedores.
Firecracker está escrito en Rust y cuenta con una API REST para la configuración, gestión, inicio y detención de las micro VM, además de brindar un servicio de metadatos para el intercambio de datos entre el servicio huésped y host.
De acuerdo al artículo publicado por el equipo de AWS, “las API REST existen para especificar el kernel huésped y los argumentos de arranque, la configuración de la red, del dispositivo de bloque, de la máquina huésped, así como del cpuid, del registro, de las métricas, de los limitadores de velocidad y del servicio de metadatos.”
Desempeño de Firecracker
Los ingenieros de AWS realizaron varias pruebas de comparación entre Firecracker y otros VMM, como Cloud Hypervisor y QEMU, para evaluar la eficiencia del nuevo virtualizador por medio del uso de algunas métricas.
Por ejemplo, con respecto a la métrica de tiempo de inicialización (boot time), definido como “el tiempo entre la creación de un proceso del VMM y el instante en el que el kernel huésped crea su proceso init”, Firecracker alcanzó tiempos de hasta 125 ms y 150 ms para iniciar micro VM en serie y paralelo, respectivamente. Cuando se comparó Firecracker con otros VMM, este presentó tiempos similares a Cloud Hypervisor e inferiores a QEMU (de hasta 300 ms).
Para la sobrecarga de memoria, la métrica fue “la diferencia entre la memoria utilizada por el proceso del VMM y el tamaño de micro VM configurado”. Bajo esta métrica, Firecracker mostró una sobrecarga de 3 MB por microVM, mientras que Cloud Hypervisor y QEMU tuvieron una sobrecarga de 13 MB y 131 MB por VM, respectivamente.
Finalmente, los ingenieros de AWS evaluaron el desempeño de entrada y salida (IO performance) con Fio, una herramienta de evaluación comparativa de código abierto que permite probar redes y dispositivos de almacenamiento. Para esta prueba, “Fio se configuró para realizar operaciones de E/S aleatorias directamente contra el dispositivo de bloque, utilizando E/S directas a través de libaio, mientras que los SSD NVMe locales respaldaron todas las pruebas en el servidor m5d.metal”. Los resultados mostraron algunas limitaciones de Firecracker en cuanto al ancho de banda. Aún así, para la latencia, la siguiente figura muestra que Firecracker tiene una sobrecarga significativamente mayor para bloques grandes pero funciona bien para bloques pequeños.
Resumen
Firecracker es un VMM modificado y optimizado para implementar máquinas virtuales ligeras de forma rápida y segura. Su objetivo principal es mejorar la experiencia del desarrollador en los productos de AWS como Lambda y Fargate, donde actualmente admite millones de cargas de trabajo de producción y miles de millones de solicitudes por mes.
Firecracker es un proyecto en andamiento e invita a desarrolladores a hacer contribuciones. Firecracker cuenta con la licencia de Apache, que te permite gestionar libremente tus contribuciones según los términos que elijas.