Monitorizar rendimiento con eBPF, bpftrace y perf en Linux

Última actualización: 17/12/2025
Autor: Isaac
  • Perf ofrece profiling clásico de CPU y eventos de hardware, ideal para diagnósticos rápidos de rendimiento en Linux.
  • eBPF y bpftrace permiten observabilidad profunda desde el kernel con muy bajo impacto y alta personalización.
  • La combinación de perf con eBPF cubre desde contadores de hardware hasta métricas de aplicación en producción.
  • El ecosistema eBPF se consolida como estándar para monitorización, seguridad y redes en sistemas modernos.

monitorizar rendimiento con eBPF y bpftrace

La monitorización profunda del rendimiento en servidores Linux ya no se conforma con cuatro métricas básicas de CPU, memoria y disco. En entornos modernos, con microservicios, contenedores y nubes híbridas, necesitas ver qué ocurre realmente dentro del kernel, a nivel de llamadas al sistema, paquetes de red y funciones concretas de tus aplicaciones.

En este contexto, tecnologías como perf, eBPF y bpftrace se han convertido en piezas clave para los equipos de sistemas, SRE y observabilidad. Permiten diseccionar cuellos de botella, reducir costes de infraestructura y mejorar la experiencia de usuario con un nivel de detalle que hace unos años era impensable, y todo ello con un impacto muy bajo en la carga del sistema.

Qué es el análisis de rendimiento de servidores

Cuando hablamos de análisis de rendimiento nos referimos al proceso de medir, interpretar y optimizar cómo usan los recursos los servicios que corren en un servidor: CPU, memoria, E/S de disco, red y también factores como la latencia de respuesta o el número de peticiones atendidas.

En entornos empresariales y de producción, este análisis es crítico porque un pequeño cuello de botella puede desencadenar caídas, tiempos de respuesta insoportables o facturas de cloud desorbitadas si se escala hardware sin entender el problema real.

Importancia en entornos empresariales y de producción

  • La identificación de cuellos de botella es el primer objetivo: localizar procesos, hilos o funciones que están consumiendo más CPU, I/O o memoria de la cuenta para poder optimizarlos o rediseñarlos.
  • La optimización de costes viene justo detrás: si sabes qué servicios saturan qué recursos, puedes ajustar tamaños de máquinas, límites de contenedores o políticas de autoscaling para pagar solo por lo que realmente necesitas.
  • La mejora de la experiencia de usuario depende directamente de cómo responden tus servidores; reduciendo latencias en puntos críticos (consultas lentas, bloqueos de disco, colas de red) se nota una diferencia enorme en aplicaciones web y móviles.
  • La prevención de fallos se apoya en la monitorización histórica: si recoges métricas con suficiente detalle, es más fácil detectar patrones anómalos y adelantarte a una caída o degradación seria del servicio.

Herramientas modernas: perf, eBPF y bpftrace

Hoy en día el análisis de rendimiento serio en Linux se apoya en un conjunto de herramientas que cubren distintos niveles: perf como utilitario clásico ligado a los contadores de hardware, y el ecosistema eBPF (BCC, bpftrace, libbpf, Cilium, etc.) para disponer de observabilidad casi quirúrgica desde el kernel.

Mientras perf se centra en eventos predefinidos de hardware y software, eBPF abre la puerta a escribir pequeños programas que se ejecutan en el kernel bajo control estricto, reaccionando a eventos como syscalls, rastreos de funciones, paquetes de red o incluso perf events, enviando de vuelta solo la información que necesitas.

Con bpftrace, además, se consigue una capa de alto nivel que simplifica muchísimo el trabajo con eBPF, permitiendo escribir scripts muy expresivos con una sintaxis parecida a AWK o DTrace, ideal para diagnósticos rápidos en producción.

perf: la herramienta clásica para análisis de rendimiento

La utilidad perf viene desde hace años integrada en el ecosistema Linux y está pensada para registrar y analizar eventos de bajo nivel: ciclos de CPU, fallos de caché, instrucciones ejecutadas, fallos de página, syscalls y mucho más.

Su flujo de uso típico es bastante directo: se registra primero lo que ocurre durante un periodo de tiempo y luego se analiza el informe para localizar las funciones o procesos problemáticos.

Qué es perf y cómo funciona

  • El administrador lanza un análisis con perf record, indicando el comando o PID a estudiar o incluso todo el sistema.
  • Durante el intervalo configurado, perf muestra o almacena eventos del hardware y del kernel, tomando muestras periódicas sin necesidad de instrumentar el código fuente.
  • Con perf report se genera un informe interactivo que muestra el consumo de CPU por función, archivo, símbolo o proceso, permitiendo navegar por los hot paths del programa.

Características clave de perf

Monitorización de eventos de hardware

  • Puede contabilizar los ciclos de CPU consumidos, lo que ayuda a detectar funciones que están acaparando el procesador.
  • Informa de fallos de caché (cache misses), de forma que sabes cuándo las búsquedas en cache L1/L2/L3 fallan y el sistema tiene que ir a memoria principal, aumentando la latencia.
  • Recoge el número de instrucciones ejecutadas, útil para analizar la eficiencia de un algoritmo o comparar dos implementaciones distintas.

Análisis de ciclos de CPU y latencia

Combinando muestras de CPU con eventos de bloqueo, E/S o esperas en syscalls, perf permite estudiar dónde se consumen los ciclos y qué porciones de código añaden más latencia. Esto es especialmente útil en servicios con SLAs estrictos, donde importa más la cola de latencias que el promedio.

  Oreon 10 Linux: qué es, versiones, requisitos y ventajas reales

Casos de uso comunes con perf

  • Optimización de aplicaciones: localizar funciones calientes (hotspots) dentro de un binario, revisar las pilas de llamadas y reescribir o ajustar secciones concretas del código.
  • Diagnóstico de sistemas sobrecargados: entender qué procesos están disparando la carga de CPU o dónde se están produciendo contenciones entre hilos.
  • Análisis de rendimiento de hardware: evaluar cómo se comportan CPU, memoria y caches bajo distintas cargas sintéticas o reales, comparando servidores o generaciones de procesador.
  • Resolución de problemas de latencia: estudiar picos de espera en E/S de disco, bloqueos en mutex o retrasos en la red y determinar si el cuello de botella está en la aplicación o en el sistema.

Instalación y configuración básica de perf

En la mayoría de distribuciones Linux, perf se instala desde los repositorios oficiales como parte del paquete linux-tools o similar. Es importante que la versión de perf coincida con la versión del kernel que estás usando para evitar incompatibilidades en los eventos expuestos.

Tras la instalación, normalmente basta con asegurarse de que los contadores de rendimiento del kernel estén habilitados (parámetros como kernel.perf_event_paranoid) para que perf pueda acceder a los eventos necesarios, especialmente si vas a perfilar todo el sistema.

Ejemplos prácticos con comandos de perf

Un uso típico consiste en perfilar un binario concreto durante su ejecución con perf record -g — ./mi_programa y luego analizar el informe con perf report, navegando por las funciones más costosas y su árbol de llamadas.

También se puede usar perf top para ver en tiempo real las funciones que más CPU consumen en el sistema, algo muy útil en incidentes en producción cuando no tienes tiempo de lanzar un análisis más sofisticado.

eBPF: el futuro de la monitorización y el análisis

Extended Berkeley Packet Filter, o eBPF, ha pasado de ser una curiosidad asociada al filtrado de paquetes a convertirse en la base de muchas plataformas de observabilidad, seguridad y networking de nueva generación.

Su clave está en permitir que pequeños programas seguros se ejecuten dentro del kernel de Linux en respuesta a eventos, con verificación previa y acceso a estructuras internas, sin necesidad de parchear el kernel ni cargar módulos complejos.

Qué es eBPF y cómo funciona a grandes rasgos

  • Permite capturar métricas muy detalladas del sistema en tiempo real: latencias de syscalls, vida de conexiones TCP, tiempo de ejecución de funciones de usuario, etc.
  • Se engancha a eventos del kernel (kprobes, tracepoints, sockets, perf events…) sin modificar el código fuente del propio kernel.
  • Está diseñado para introducir un impacto mínimo en el rendimiento, ejecutándose en una máquina virtual dentro del kernel con un coste muy contenido.

Por qué eBPF es tan revolucionario

  • Su bajísima sobrecarga lo hace ideal para producción: al trabajar dentro del kernel evita muchos cambios de contexto entre espacio de usuario y kernel, reduciendo al mínimo el tráfico de datos innecesario.
  • Ofrece una flexibilidad brutal: puedes escribir programas a medida para monitorizar justo lo que te interesa, desde estadísticas de red por pod de Kubernetes hasta latencia por función en un microservicio concreto.
  • La seguridad está garantizada por un verificador que revisa cada programa antes de permitir su ejecución, asegurándose de que no haya bucles infinitos, accesos fuera de rango o acciones peligrosas para la estabilidad del sistema.
  • Tiene una amplitud de aplicaciones enorme: monitorización de rendimiento, profunda observabilidad de red, reforzamiento de seguridad, control de acceso, filtrado de paquetes avanzado, profiling de aplicaciones, etc.

Cómo se ejecutan los programas eBPF

Normalmente el desarrollador escribe la lógica en C u otro lenguaje de alto nivel, se compila a bytecode eBPF mediante LLVM/Clang y se carga en el kernel a través de la syscall bpf() o herramientas como bpftool, BCC o bpftrace.

Una vez cargado, el programa se asocia a un hook concreto: una función del kernel, un tracepoint, un socket, un evento de perf o una llamada a una función de usuario (uprobe), y se activa cada vez que ocurre ese evento, leyendo parámetros, actualizando mapas y, si procede, devolviendo datos al espacio de usuario.

Funcionalidades avanzadas de eBPF

Creación de programas personalizados para análisis detallado

Con eBPF puedes construir herramientas a medida que midan, por ejemplo, la latencia exacta de cada consulta en una base de datos, o que rastreen las llamadas a una librería concreta de un servicio, sin tocar una sola línea de ese servicio.

Monitorización en tiempo real sin impacto apreciable

Al ejecutarse en el kernel y filtrar datos allí mismo, eBPF permite una monitorización continua con impacto muy reducido, ideal para sistemas críticos donde no te puedes permitir agentes pesados ni trazas extremadamente verbosas.

Casos de uso más relevantes con eBPF

  • Monitorización de rendimiento de aplicaciones: localizar qué funciones de tu código están acaparando recursos, incluso si están dentro de librerías de terceros o en binarios sin símbolos.
  • Análisis de red fino: ver vida completa de conexiones TCP, estadísticas de paquetes por servicio, detección de pérdidas o retransmisiones sin recurrir a capturas de paquetes masivas.
  • Seguridad y auditoría: rastrear llamadas al sistema sospechosas, ejecuciones de binarios inusuales o comportamientos que encajen con patrones de intrusión, generando alertas en tiempo real.
  • Optimización de sistemas distribuidos: medir latencias entre microservicios, colas internas, tiempos de serialización y deserialización, o impacto del balanceo de carga en la aplicación.
  Cómo modificar el menú de arranque de Windows Boot Manager para elegir sistema operativo

eBPF en detalle: BPF, evolución y ecosistema

Para entender eBPF conviene conocer primero el BPF clásico, diseñado originalmente como filtro de paquetes dentro del kernel para herramientas como tcpdump, Snort o Suricata, con la idea de evitar copiar al espacio de usuario paquetes que no interesan.

BPF implementa una pequeña máquina virtual en el kernel donde se cargan programas que se disparan en eventos, como la recepción de un paquete. Solo los paquetes que pasan el filtro llegan al socket en espacio de usuario, ahorrando un volumen considerable de CPU y memoria.

La eBPF moderna es tan versátil que la eBPF Foundation y la Linux Foundation están empujando su adopción en otros sistemas operativos, para que no se quede solo en Linux y se pueda disfrutar de capacidades similares de trazado y monitorización en otras plataformas.

Programas BPF y tipos habituales

Los programas BPF suelen escribirse en C, se compilan a objetos .o y se cargan en el kernel mediante la syscall bpf(). A partir de ahí se vinculan a distintos tipos de eventos según el uso que se les quiera dar.

  • kprobe: permite seguir la ejecución de funciones del kernel y módulos sin necesidad de parchearlos, ideal para ver qué hace internamente el sistema.
  • uprobe: se engancha a funciones del espacio de usuario, por ejemplo dentro de sshd o una base de datos, para observar argumentos o tiempos de ejecución sin recompilar nada.
  • tracepoints: puntos de trazado predefinidos en el kernel, muy estables entre versiones, que exponen eventos de alto nivel como creación de procesos, E/S de disco o eventos de scheduler.
  • perf_event: programas que se activan en función de contadores de rendimiento, combinando así el mundo perf con la lógica flexible de eBPF.

Mapas y enlaces BPF

Los mapas BPF son estructuras de datos clave-valor en el kernel donde los programas guardan y comparten información: contadores, histogramas, estructuras complejas, etc. Los procesos en espacio de usuario pueden leer y escribir en estos mapas a través de la syscall bpf() o librerías como BCC.

Los enlaces (links) conectan programas BPF concretos con puntos de instrumentación; es decir, definen qué programa se ejecuta en qué evento. Esta separación de programas, mapas y enlaces aporta mucha flexibilidad y permite reusar componentes.

El ecosistema eBPF: BCC, bpftrace y otras utilidades

La potencia de eBPF no vendría de serie si no existiese un ecosistema maduro de herramientas, librerías y proyectos que facilitan el día a día. Entre ellos destacan BCC, bpftrace, libbpf, goebpf y proyectos más grandes como Cilium, Falco o Katran.

Gracias a estas utilidades, incluso equipos que no son expertos en kernel pueden aprovechar las capacidades avanzadas de eBPF para observabilidad, seguridad y redes de forma relativamente sencilla.

Instalación y configuración de BCC

BCC (BPF Compiler Collection) es un conjunto de herramientas y librerías que facilitan escribir y ejecutar programas eBPF usando principalmente Python o C. Incluye ya decenas de scripts listos para usar que ofrecen estadísticas de red, CPU, disco, procesos, etc.

En distribuciones como Ubuntu, la instalación típica pasa por actualizar repositorios e instalar bpfcc-tools, cabeceras del kernel y bindings de Python, verificando después la instalación ejecutando scripts como execsnoop para ver procesos en tiempo real.

Ejemplos prácticos con BCC

Con BCC tienes un arsenal de utilidades ya preparadas que aprovechan eBPF para darte métricas detalladas sin configuración complicada por tu parte.

  • tcplife: muestra la vida de las conexiones TCP, con duración, bytes enviados y recibidos, puertos, etc., muy útil para entender el comportamiento de aplicaciones de red.
  • execsnoop: enseña en tiempo real los comandos que se van ejecutando en el sistema, incluyendo usuario y PID, perfecto para auditoría o para ver qué pasa en un host bajo sospecha.
  • biolatency: construye un histograma interactivo de la latencia de I/O en discos, ayudando a detectar cuellos de botella en almacenamiento que de otra forma solo verías como “I/O wait alto”.

Introducción a bpftrace

bpftrace es una herramienta de alto nivel para escribir scripts eBPF con una sintaxis parecida a AWK o DTrace. Es ideal para hacer experimentos rápidos, análisis ad-hoc y pruebas en producción sin montar todo un software específico.

Un ejemplo muy sencillo es engancharse al tracepoint de entrada de la syscall clone y contar llamadas por proceso con una one-liner, almacenando los resultados en un mapa indexado por el nombre del comando y mostrando el recuento al salir.

Otras herramientas basadas en eBPF

Además de BCC y bpftrace, existen proyectos más generales que usan eBPF bajo el capó para ofrecer soluciones completas en distintas áreas.

  • libbpf: librería en C para trabajar con programas eBPF de forma eficiente y cercana al kernel, usada como base en muchos proyectos modernos.
  • goebpf: librería que lleva eBPF al ecosistema Go, muy popular para escribir agentes de observabilidad o componentes de red en entornos cloud native.
  • Cilium: plataforma de red y seguridad para Kubernetes basada en eBPF, que implementa políticas a nivel de API y ofrece observabilidad profunda del tráfico entre pods.
  • Falco: sistema de detección de intrusiones que utiliza eBPF para vigilar llamadas al sistema y comportamientos sospechosos, generando alertas cuando algo se sale de la norma.
  • Katran: librería de balanceo de carga de alto rendimiento desarrollada por Meta, que usa eBPF para distribuir tráfico de forma eficiente y flexible en entornos a gran escala.
  Cómo solucionar los errores 0x800F0900, 0x800F0922 y 0x80070070 en Windows

Comparación detallada entre perf y eBPF

Aunque perf y eBPF se usan muchas veces para objetivos similares, su enfoque y capacidades son muy diferentes, y entenderlas ayuda a elegir la herramienta adecuada en cada caso o a combinarlas con sentido.

Enfoque y propósito principal

Perf está orientado principalmente a profiling de CPU y eventos de hardware ya definidos por el procesador y el kernel. Es rápido de usar, viene integrado y sirve perfectamente para muchos escenarios de optimización clásica.

eBPF, por contra, se centra en ofrecer un framework genérico para ejecutar lógica personalizada en el kernel, permitiendo observar y modificar flujos muy concretos, desde paquetes de red hasta llamadas a funciones de usuario, con una granularidad casi ilimitada.

Flexibilidad y personalización

  • perf: dispone de un repertorio de eventos muy útil para analizar CPU, memoria, E/S y software, pero su capacidad de personalización se limita a elegir qué eventos seguir y cómo agruparlos. Es ideal cuando quieres algo listo para usar sin demasiadas complicaciones.
  • eBPF: permite construir tus propios programas para recoger exactamente la información que busques, filtrando, agregando y procesando datos en el kernel. Requiere más conocimientos, pero la capacidad de adaptación es muy superior.

Impacto en el rendimiento

  • perf puede suponer una carga moderada cuando se habilitan muchos eventos o se toman muestras con una frecuencia muy alta, especialmente en sistemas muy saturados o cuando se hace tracing prolongado.
  • eBPF está diseñado para minimizar el impacto; los programas se verifican y ejecutan en un entorno muy optimizado dentro del kernel, filtrando datos lo antes posible para no inundar el espacio de usuario, lo que lo hace apropiado para monitorización continua en producción.

Compatibilidad y requisitos

  • perf está disponible en la práctica totalidad de distribuciones Linux y funciona con kernels relativamente antiguos. No necesita componentes extra para el uso básico.
  • eBPF depende de un kernel moderno (a partir de la 4.9 para muchas de sus capacidades avanzadas) y suele apoyarse en herramientas adicionales como BCC o bpftrace para que sea usable sin desarrollar todo a bajo nivel.

Integración de perf y eBPF para análisis avanzado

Lo más interesante no es elegir entre uno u otro, sino aprender a combinarlos. Perf sigue siendo fantástico para una vista rápida a nivel de CPU, mientras eBPF se utiliza para profundizar justo donde duele o para monitorizar elementos que perf ni ve.

Beneficios de combinar ambas herramientas

  • Cobertura completa del sistema: perf se apoya en los contadores de hardware, mientras que eBPF puede cubrir desde syscalls hasta lógica de aplicación, obteniendo así una foto muy completa de qué está pasando en tu servidor.
  • Equilibrio entre rapidez y profundidad: con perf puedes detectar rápidamente que cierto proceso o función consume demasiada CPU y luego usar un script eBPF o bpftrace para desmenuzar el problema y entender el contexto al detalle.
  • Impacto controlado: perf se puede emplear en ventanas cortas de tiempo para análisis puntuales, mientras eBPF se configura para recolectar solo las métricas imprescindibles durante más tiempo, reduciendo la sobrecarga general.
  • Integración en flujos DevOps: ambas herramientas pueden incorporarse en pipelines de CI/CD, tareas programadas de diagnóstico o dashboards de observabilidad, generando informes que sirvan para optimizar recursos de forma continua.

Desafíos y mejores prácticas

Retos más habituales

  • La curva de aprendizaje de eBPF es elevada: hay que entender su modelo de programación, el verificador del kernel y las implicaciones de engancharse a ciertos hooks.
  • Una configuración agresiva de perf o scripts eBPF mal diseñados pueden añadir carga innecesaria, algo especialmente delicado en sistemas críticos con poca holgura de recursos.
  • En servidores con kernels muy antiguos o distribuciones desfasadas, eBPF puede estar limitado o directamente no disponible, obligando a recurrir a técnicas más tradicionales.

Buenas prácticas clave

  • Probar siempre en entornos de desarrollo o preproducción antes de desplegar scripts eBPF nuevos en producción, verificando estabilidad y consumo de recursos.
  • Restringir conscientemente la cantidad de datos recopilados; cuanto más filtros y agregaciones apliques en el kernel, menos ruido y menos impacto tendrás.
  • Automatizar análisis recurrentes combinando perf y eBPF en scripts o playbooks que ejecuten diagnósticos estándar y generen informes comparables en el tiempo.
linux 6.14-0
Artículo relacionado:
Linux 6.14 trae mejoras en rendimiento, compatibilidad y seguridad