- Es posible reducir el tiempo de arranque de una instancia EC2 de 40 segundos a 5 segundos
- Esto es muy importante cuando se necesita una nueva instancia EC2 para procesar una tarea específica
Por qué el tiempo de arranque tarda tanto
- Cuando se solicita una nueva instancia EC2, AWS realiza varias tareas:
- Crear el volumen raíz EBS a partir de la AMI seleccionada
- Asignar una dirección IP privada a la instancia
- Elegir un host para la instancia
- Arrancar realmente la máquina
- Incluso después de que el hardware se enciende, todavía deben iniciarse el bootloader, el kernel y los procesos del espacio de usuario.
Cómo evitar el problema
- Operar un pool de cómputo en espera para enrutar las solicitudes de build a instancias EC2 que ya están en ejecución.
- Sin embargo, no es económicamente viable para todas las tareas.
- En el caso de los runners de GitHub Actions, cada trabajo se enruta a una instancia EC2 dedicada.
- Mantener 50 instancias EC2 en línea para procesar 50 trabajos en paralelo no es realista.
Tiempos de arranque más rápidos
- Para ciertas tareas, siempre es más rápido no hacer trabajo innecesario.
- Se optimiza de forma sistemática cada etapa de la creación de la instancia, el arranque y el inicio de la aplicación.
- Se usa un método de arrancar la instancia una vez, detenerla y volver a arrancarla cuando sea necesario.
Streaming del volumen raíz EBS
- La preparación del volumen raíz EBS tiene un gran impacto en el tiempo de arranque de la instancia EC2 y en el rendimiento de la aplicación.
- Cuando se crea un volumen EBS desde una AMI, los bloques de datos deben recuperarse desde S3 la primera vez que se accede a ellos.
- AWS recomienda precargar todos los bloques de datos.
Arrancar la instancia una sola vez
- Una instancia respaldada por EBS puede detenerse y luego volver a iniciarse.
- Una instancia detenida conserva solo la configuración y se paga únicamente el costo del volumen raíz EBS.
- Si la instancia se arranca una vez para realizar las tareas de inicialización y luego se detiene, se crea un volumen raíz EBS "calentado".
Warm pools de Auto Scaling
- AWS ofrece warm pools para EC2 Auto Scaling.
- Sin embargo, los grupos de Auto Scaling tardan en reaccionar a las solicitudes.
- Para obtener el mejor rendimiento, se inician directamente las instancias EC2 usando las llamadas a la API
LaunchInstances y StartInstances.
Redimensionamiento de instancias
- Se optimiza el tiempo de arranque cambiando el tipo de las instancias calentadas.
- Para las tareas de inicialización se usa un tipo de instancia económico, y para el trabajo real se cambia a un tipo de instancia de mayor rendimiento.
Flujo completo
- Las instancias runner de GitHub Actions siguen un flujo como este:
- Se crean como instancias
t3.large
- Se les asigna una dirección IP privada en la VPC de destino
- El kernel y los procesos del espacio de usuario se inician una vez
- La instancia se detiene
- Cuando llega una solicitud de trabajo, se actualiza el tipo de instancia a
m7a y se inicia
- Si no hay capacidad disponible para instancias
m7a, se actualiza a un tipo de respaldo y se vuelve a iniciar
- Con este flujo, el tiempo de preparación de la instancia para un trabajo se reduce de 40 segundos a 5 segundos.
1 comentarios
Comentarios de Hacker News
Resumen