Ir al contenido

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

ComandoPropósito
perf statContar eventos de hardware/software
perf recordMuestrear y grabar datos de perfil
perf reportAnalizar perfil grabado
perf topPerfilado en vivo a nivel de sistema
perf annotateAnotación de código fuente/ensamblador
perf probeSondas de rastreo dinámico
perf schedAnálisis del planificador
perf memPerfilado de acceso a memoria
perf lockAnálisis de contención de bloqueos
perf scriptVolcado de eventos para scripting
perf listListar eventos disponibles