Capítulo 9: Gestión de Recursos
Capítulo 9: Gestión de Recursos
Firecracker ofrece controles precisos sobre CPU, memoria y rendimiento. Esta granularidad es clave para la densidad en producción.
CPU Templates
Los CPU templates permiten presentar un modelo de CPU homogéneo al guest, independientemente del hardware físico subyacente. Esto es crítico cuando se migran snapshots entre hosts con CPUs diferentes.
Templates predefinidos
| Template | Arquitectura | Descripción |
|---|---|---|
C3 | x86_64 | Intel Ivy Bridge |
T2 | x86_64 | Intel Haswell |
T2A | aarch64 | ARM Neoverse N1 |
T2CL | x86_64 | Intel Cascade Lake |
T2S | x86_64 | Intel Skylake |
V1N1 | aarch64 | ARM Neoverse V1 |
# Aplicar template T2CL (Intel Cascade Lake normalizado)
curl -s -X PUT \
--unix-socket "${API_SOCKET}" \
--header "Content-Type: application/json" \
--data '{
"vcpu_count": 2,
"mem_size_mib": 1024,
"cpu_template": "T2CL"
}' \
"http://localhost/machine-config"
Template de CPU personalizado
Para control más fino, puedes configurar exactamente qué features de CPU exponer:
curl -s -X PUT \
--unix-socket "${API_SOCKET}" \
--header "Content-Type: application/json" \
--data '{
"vcpus": [
{
"leaf": "0x1",
"subleaf": "0x0",
"flags": "0x0",
"eax": "0x000306c3",
"ebx": "0x02100800",
"ecx": "0xfedaf387",
"edx": "0xbfebfbff"
}
]
}' \
"http://localhost/cpu-config"
Balloon Device: Memoria Dinámica
El balloon device permite al host reclamar y devolver memoria del guest en caliente, sin reiniciar la VM. Fundamental para sistemas de gestión de densidad.
Configurar balloon al arranque
curl -s -X PUT \
--unix-socket "${API_SOCKET}" \
--header "Content-Type: application/json" \
--data '{
"amount_mib": 0,
"deflate_on_oom": true,
"stats_polling_interval_s": 1
}' \
"http://localhost/balloon"
amount_mib: cantidad de RAM que el host quiere “inflar” (recuperar del guest)deflate_on_oom: si el guest tiene OOM, el balloon libera memoria automáticamentestats_polling_interval_s: cada cuántos segundos reportar estadísticas (0 = desactivado)
Inflar el balloon (recuperar RAM del guest)
# Recuperar 512 MiB del guest hacia el host
curl -s -X PATCH \
--unix-socket "${API_SOCKET}" \
--header "Content-Type: application/json" \
--data '{"amount_mib": 512}' \
"http://localhost/balloon"
El guest “ve” que tiene 512 MiB menos de RAM disponible.
Consultar estadísticas de memoria
curl -s --unix-socket "${API_SOCKET}" \
"http://localhost/balloon/statistics" | jq .
Respuesta incluye: actual_mib, swap_in, swap_out, major_faults, minor_faults, available_memory, disk_caches, hugetlb_allocations, hugetlb_failures.
Hugepages: Rendimiento de Memoria
Las hugepages (páginas de 2MB en lugar de 4KB) reducen el overhead de TLB y mejoran el rendimiento del guest, especialmente en el boot.
# Configurar VM con hugepages de 2MB
curl -s -X PUT \
--unix-socket "${API_SOCKET}" \
--header "Content-Type: application/json" \
--data '{
"vcpu_count": 2,
"mem_size_mib": 1024,
"huge_pages": "2M"
}' \
"http://localhost/machine-config"
Prerequisito en el host
El host debe tener hugepages disponibles:
# Verificar hugepages disponibles
cat /proc/meminfo | grep HugePages
# Reservar hugepages (temporal)
sudo sysctl -w vm.nr_hugepages=512
# Reservar hugepages (persistente)
echo 'vm.nr_hugepages=512' | sudo tee -a /etc/sysctl.d/hugepages.conf
sudo sysctl -p /etc/sysctl.d/hugepages.conf
El beneficio de rendimiento en boot puede ser hasta 50% más rápido según la documentación oficial.
SMT (Simultaneous Multi-Threading)
Por defecto Firecracker deshabilita SMT (Hyper-Threading). Para habilitarlo:
curl -s -X PUT \
--unix-socket "${API_SOCKET}" \
--header "Content-Type: application/json" \
--data '{
"vcpu_count": 4,
"mem_size_mib": 2048,
"smt": true
}' \
"http://localhost/machine-config"
Habilitar SMT puede afectar el aislamiento de seguridad (ataques de side-channel como Spectre). En producción evalúa el trade-off.
Métricas
Firecracker puede exportar métricas detalladas a un archivo FIFO o regular:
# Configurar destino de métricas
curl -s -X PUT \
--unix-socket "${API_SOCKET}" \
--header "Content-Type: application/json" \
--data '{
"metrics_path": "./metrics.fifo"
}' \
"http://localhost/metrics"
# Crear el FIFO
mkfifo ./metrics.fifo
# Leer métricas (en otra terminal)
cat ./metrics.fifo | jq .
Las métricas incluyen: latencias de API, operaciones de I/O por dispositivo, eventos de vCPU, uso de memoria del VMM, y más.
Flush manual de métricas
curl -s -X PUT \
--unix-socket "${API_SOCKET}" \
--header "Content-Type: application/json" \
--data '{"action_type": "FlushMetrics"}' \
"http://localhost/actions"