Comandos de perf
perf (perf_events) es el perfilador oficial de Linux, proporcionando acceso a contadores de rendimiento de hardware, eventos de software, tracepoints y sondas dinámicas. Es la base del análisis de rendimiento en Linux.
Instalación
Linux/Ubuntu
# Ubuntu/Debian — instalar versión correspondiente al kernel
sudo apt install linux-tools-$(uname -r) linux-tools-common
# Fedora/RHEL
sudo dnf install perf
# Verificar instalación
perf version
# Permitir perfilado sin root (temporal)
echo 0 | sudo tee /proc/sys/kernel/perf_event_paranoid
# -1 = sin restricciones, 0 = permitir no-muestreo, 1 = permitir por-proceso, 2 = permitir por-usuario (predeterminado)
perf stat — Conteo de eventos
# Contadores básicos de CPU para un comando
perf stat ls -la
# Contadores detallados (-d para más niveles de detalle)
perf stat -d -d -d ./my_program
# Eventos específicos
perf stat -e cycles,instructions,cache-misses,cache-references ./my_program
# Estadísticas por núcleo
perf stat -a -A sleep 5
# Conteo a nivel de sistema durante 10 segundos
perf stat -a sleep 10
# Repetir medición 5 veces para precisión estadística
perf stat -r 5 ./my_program
# Contar para un proceso en ejecución
perf stat -p 1234 sleep 10
# Salida CSV para scripting
perf stat -x, -e cycles,instructions ./my_program 2>&1
# Agrupar eventos para asegurar co-planificación
perf stat -e '{cycles,instructions}' ./my_program
perf record — Perfiles de muestreo
# Grabar perfil de CPU a la tasa predeterminada (4000 Hz)
perf record ./my_program
# Grabar a frecuencia personalizada
perf record -F 99 ./my_program
# Grabar todo el sistema durante 30 segundos
perf record -a -g sleep 30
# Grabar con grafo de llamadas (dwarf para precisión en espacio de usuario)
perf record -g --call-graph dwarf ./my_program
# Grabar con grafo de llamadas (fp — requiere frame pointers)
perf record -g --call-graph fp ./my_program
# Grabar con grafo de llamadas (lbr — Intel Last Branch Record)
perf record -g --call-graph lbr ./my_program
# Grabar eventos específicos
perf record -e cache-misses -c 10000 ./my_program
# Grabar un proceso en ejecución durante 60 segundos
perf record -p 1234 -g sleep 60
# Grabar con granularidad por hilo
perf record -s ./my_program
# Escribir a un archivo de salida específico
perf record -o my_profile.data ./my_program
# Grabar con marca de tiempo para correlación
perf record -T -g ./my_program
perf report — Análisis de perfiles
# Informe interactivo en TUI
perf report
# Informe desde un archivo específico
perf report -i my_profile.data
# Informe ordenado por sobrecarga
perf report --sort=overhead
# Mostrar llamador/llamado (cadena de llamadas)
perf report -g caller
# Perfil plano (sin grafo de llamadas)
perf report -g none
# Informe con información de línea de código fuente
perf report --source
# Salida stdio (no interactiva)
perf report --stdio
# Filtrar a un DSO específico (biblioteca compartida)
perf report -d libc-2.31.so
# Mostrar detalles por símbolo
perf report --stdio --sort=sym
# Exportar para generación de flame graph
perf script > out.stacks
perf top — Perfilado en vivo
# Perfilado de CPU en vivo a nivel de sistema
sudo perf top
# Perfilar un proceso específico
sudo perf top -p 1234
# Mostrar grafo de llamadas
sudo perf top -g
# Perfilar eventos específicos
sudo perf top -e cache-misses
# Perfilar CPU específica
sudo perf top -C 0
# Cambiar frecuencia de muestreo
sudo perf top -F 999
# Mostrar solo símbolos del kernel
sudo perf top -K
perf annotate — Análisis a nivel de código fuente
# Anotar función caliente desde un perfil grabado
perf annotate
# Anotar un símbolo específico
perf annotate my_hot_function
# Mostrar con código fuente (requiere info de depuración)
perf annotate -l my_hot_function
# Salida stdio
perf annotate --stdio my_hot_function
# Desde un archivo de datos específico
perf annotate -i my_profile.data my_hot_function
perf probe — Rastreo dinámico
# Agregar una sonda en una función del kernel
sudo perf probe --add tcp_sendmsg
# Agregar una sonda con argumentos de función
sudo perf probe --add 'tcp_sendmsg size'
# Agregar una sonda de retorno
sudo perf probe --add 'tcp_sendmsg%return $retval'
# Listar variables disponibles en un punto de sonda
sudo perf probe -V tcp_sendmsg
# Listar sondas definidas
sudo perf probe --list
# Eliminar una sonda
sudo perf probe --del tcp_sendmsg
# Grabar con la sonda dinámica
sudo perf record -e probe:tcp_sendmsg -a sleep 10
# Agregar una sonda de espacio de usuario
perf probe -x /usr/bin/python3 --add 'main'
perf sched — Análisis del planificador
# Grabar eventos del planificador
sudo perf sched record sleep 10
# Mostrar resumen de latencia de planificación
sudo perf sched latency
# Mostrar línea de tiempo de planificación por CPU
sudo perf sched map
# Reproducir eventos de planificación
sudo perf sched replay
# Mostrar estadísticas de planificación
sudo perf sched timehist
# Mostrar cadenas de despertar
sudo perf sched timehist -w
perf mem — Perfilado de acceso a memoria
# Grabar eventos de acceso a memoria (requiere soporte de hardware)
sudo perf mem record ./my_program
# Informar perfil de acceso a memoria
sudo perf mem report
# Mostrar latencia de carga/almacenamiento
sudo perf mem report --sort=mem,sym
perf lock — Análisis de contención de bloqueos
# Grabar eventos de bloqueo
sudo perf lock record sleep 10
# Informar contención de bloqueos
sudo perf lock report
# Mostrar estadísticas de bloqueos
sudo perf lock info
Contadores de hardware
# Listar eventos disponibles
perf list
# Listar eventos de hardware
perf list hw
# Listar eventos de software
perf list sw
# Listar eventos de caché
perf list cache
# Combinaciones comunes de contadores de hardware
perf stat -e cycles,instructions,branches,branch-misses ./my_program
# Análisis de caché
perf stat -e L1-dcache-loads,L1-dcache-load-misses,LLC-loads,LLC-load-misses ./my_program
# Análisis de TLB
perf stat -e dTLB-loads,dTLB-load-misses,iTLB-loads,iTLB-load-misses ./my_program
# Análisis de predicción de saltos
perf stat -e branches,branch-misses ./my_program
perf script — Salida de eventos sin procesar
# Volcar eventos sin procesar para post-procesamiento
perf script > out.perf
# Salida con campos específicos
perf script -F comm,pid,tid,time,event,ip,sym,dso
# Generar pilas plegadas para flame graphs
perf script | stackcollapse-perf.pl > out.folded
# Filtrar por nombre de proceso
perf script -c my_program
Referencia rápida
| Comando | Propósito |
|---|---|
perf stat | Contar eventos de hardware/software |
perf record | Muestrear y grabar datos de perfil |
perf report | Analizar perfil grabado |
perf top | Perfilado en vivo a nivel de sistema |
perf annotate | Anotación de código fuente/ensamblador |
perf probe | Sondas de rastreo dinámico |
perf sched | Análisis del planificador |
perf mem | Perfilado de acceso a memoria |
perf lock | Análisis de contención de bloqueos |
perf script | Volcado de eventos para scripting |
perf list | Listar eventos disponibles |