Parca Agent - Perfilado Continuo eBPF Siempre Activo
Parca Agent es un perfilador continuo basado en eBPF. En lugar de adjuntar un perfilador cuando sospechas un problema, muestrea stack traces de cada proceso en un nodo, todo el tiempo, con aproximadamente 1% de overhead y sin instrumentación de aplicación. Eso invierte el flujo de trabajo usual: en lugar de reproducir un incidente bajo un perfilador, buscas qué estaba realmente ejecutándose durante la ventana del incidente. Atribuye CPU (y memoria, para runtimes soportados) hasta el número de línea y envía perfiles a un servidor Parca o cualquier almacén compatible con Prometheus.
Requisitos
- Kernel Linux con eBPF/BTF (5.4+, versiones más nuevas preferidas)
- Root / contenedor privilegiado
- Servidor Parca (o almacén compatible) para recibir perfiles
Instalación
| Método | Comando |
|---|
| Binario | descargar desde GitHub Releases |
| Docker | docker run --privileged ghcr.io/parca-dev/parca-agent:latest |
| Kubernetes | Desplegar como DaemonSet (manifiestos proporcionados) |
| Servidor | ejecutar parca por separado para almacenar/consultar perfiles |
| Verificar | parca-agent --version |
Ejecución
sudo parca-agent \
--node=my-node-1 \
--remote-store-address=parca.internal:7070 \
--remote-store-insecure
| Flag | Propósito |
|---|
--node | Etiqueta de nodo adjunta a perfiles |
--remote-store-address | Dónde enviar perfiles |
--http-address | Endpoint de UI/métricas local (:7071) |
--profiling-duration | Ventana de muestreo (por defecto 10s) |
--log-level | Verbosidad |
DaemonSet de Kubernetes
| Aspecto | Nota |
|---|
| Despliegue | Un agente por nodo |
| Privilegios | privileged: true, hostPID |
| Descubrimiento | Etiqueta automáticamente por pod/contenedor/namespace |
| Overhead | ~1% CPU típico |
| Almacenamiento | Los perfiles van al servidor Parca, no al nodo |
Soporte de lenguajes
| Runtime | Desenvuelto de stack |
|---|
| C/C++/Rust/Go | Nativo (DWARF o frame pointers) |
| Java | Resolución de símbolos JIT |
| Python / Ruby | Desenvuelto consciente del intérprete |
| Node.js | Soportado vía desenvuelto del runtime |
| Cualquier binario con símbolos | Mejores resultados sin strip |
Los stacks mixtos de lenguaje se resuelven en un perfil, que es exactamente lo que necesitas para un servicio polígota.
Consultando perfiles
La UI (y API) de Parca te permite segmentar perfiles como métricas:
| Dimensión de consulta | Ejemplo |
|---|
| Rango de tiempo | Los 5 minutos alrededor de un incidente |
| Etiquetas | namespace="prod", pod=~"api-.*" |
| Comparación | Diff entre dos rangos de tiempo (antes/después de un deploy) |
| Función | Filtrar a un símbolo |
# Conceptual: perfil de CPU para un servicio durante un pico
cpu_samples{namespace="prod", container="api"} [14:05 → 14:10]
La característica definitiva: comparación
| Uso | Cómo |
|---|
| Búsqueda de regresión | Diff de perfiles antes vs después de un release |
| Análisis de incidente | Diff de ventana de incidente vs baseline |
| Prueba de optimización | Mostrar que la función hot se encogió |
El perfilado continuo hace esto posible porque el perfil “antes” ya existe — no necesitabas predecir que lo querrías.
Parca Agent vs perfiladores relacionados
| Aspecto | Parca Agent | perf | Pyroscope | async-profiler |
|---|
| Modelo | Siempre activo, a nivel de flota | On-demand, por ejecución | Siempre activo | On-demand, JVM |
| Instrumentación | Ninguna (eBPF) | Ninguna | Opciones de agente/SDK | Agente JVM |
| Multilenguaje | Sí | Sí (nativo) | Sí | Solo JVM |
| Mejor para | Perfilado continuo en producción | Análisis local profundo | Perfilado continuo | Precisión en JVM |
Misma categoría que Pyroscope; usa perf o async-profiler cuando necesites análisis profundo de una sola ejecución.
Recursos