Capítulo 9: Gestión de Recursos

Por: Artiko
firecrackercpu-templatesballoonhugepagesmetricasrendimiento

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

TemplateArquitecturaDescripción
C3x86_64Intel Ivy Bridge
T2x86_64Intel Haswell
T2Aaarch64ARM Neoverse N1
T2CLx86_64Intel Cascade Lake
T2Sx86_64Intel Skylake
V1N1aarch64ARM 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"

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"

Referencia