Commandes perf
perf (perf_events) est le profileur officiel de Linux, fournissant l’accès aux compteurs de performance matériels, événements logiciels, tracepoints et sondes dynamiques. C’est le fondement de l’analyse de performance sous Linux.
Installation
Linux/Ubuntu
# Ubuntu/Debian — instaler la version correspondant au noyau
sudo apt install linux-tools-$(uname -r) linux-tools-common
# Fedora/RHEL
sudo dnf install perf
# Vérifier l'installation
perf version
# Autoriser le profilage sans root (temporaire)
echo 0 | sudo tee /proc/sys/kernel/perf_event_paranoid
# -1 = sans restriction, 0 = autoriser non-échantillonnage, 1 = autoriser par-processus, 2 = autoriser par-utilisateur (défaut)
perf stat — Comptage d’événements
# Compteurs CPU de base pour une commande
perf stat ls -la
# Compteurs détaillés (-d pour plus de niveaux de détail)
perf stat -d -d -d ./my_program
# Événements spécifiques
perf stat -e cycles,instructions,cache-misses,cache-references ./my_program
# Statistiques par cœur
perf stat -a -A sleep 5
# Comptage système entier pendant 10 secondes
perf stat -a sleep 10
# Répéter la mesure 5 fois pour la précision statistique
perf stat -r 5 ./my_program
# Compter pour un processus en cours d'exécution
perf stat -p 1234 sleep 10
# Sortie CSV pour le scripting
perf stat -x, -e cycles,instructions ./my_program 2>&1
# Grouper les événements pour assurer la co-planification
perf stat -e '{cycles,instructions}' ./my_program
perf record — Profils échantillonnés
# Enregistrer un profil CPU au taux par défaut (4000 Hz)
perf record ./my_program
# Enregistrer à une fréquence personnalisée
perf record -F 99 ./my_program
# Enregistrer tout le système pendant 30 secondes
perf record -a -g sleep 30
# Enregistrer avec graphe d'appels (dwarf pour précision espace utilisateur)
perf record -g --call-graph dwarf ./my_program
# Enregistrer avec graphe d'appels (fp — nécessite frame pointers)
perf record -g --call-graph fp ./my_program
# Enregistrer avec graphe d'appels (lbr — Intel Last Branch Record)
perf record -g --call-graph lbr ./my_program
# Enregistrer des événements spécifiques
perf record -e cache-misses -c 10000 ./my_program
# Enregistrer un processus en cours pendant 60 secondes
perf record -p 1234 -g sleep 60
# Enregistrer avec granularité par thread
perf record -s ./my_program
# Écrire dans un fichier de sortie spécifique
perf record -o my_profile.data ./my_program
# Enregistrer avec horodatage pour corrélation
perf record -T -g ./my_program
perf report — Analyse des profils
# Rapport interactif TUI
perf report
# Rapport depuis un fichier spécifique
perf report -i my_profile.data
# Rapport trié par surcharge
perf report --sort=overhead
# Afficher appelant/appelé (chaîne d'appels)
perf report -g caller
# Profil plat (sans graphe d'appels)
perf report -g none
# Rapport avec information de ligne source
perf report --source
# Sortie stdio (non interactive)
perf report --stdio
# Filtrer par DSO spécifique (bibliothèque partagée)
perf report -d libc-2.31.so
# Afficher les détails par symbole
perf report --stdio --sort=sym
# Exporter pour génération de flame graph
perf script > out.stacks
perf top — Profilage en direct
# Profilage CPU en direct sur tout le système
sudo perf top
# Profiler un processus spécifique
sudo perf top -p 1234
# Afficher le graphe d'appels
sudo perf top -g
# Profiler des événements spécifiques
sudo perf top -e cache-misses
# Profiler un CPU spécifique
sudo perf top -C 0
# Changer la fréquence d'échantillonnage
sudo perf top -F 999
# Afficher uniquement les symboles du noyau
sudo perf top -K
perf annotate — Analyse au niveau du code source
# Annoter la fonction chaude depuis un profil enregistré
perf annotate
# Annoter un symbole spécifique
perf annotate my_hot_function
# Afficher avec le code source (nécessite les infos de débogage)
perf annotate -l my_hot_function
# Sortie stdio
perf annotate --stdio my_hot_function
# Depuis un fichier de données spécifique
perf annotate -i my_profile.data my_hot_function
perf probe — Traçage dynamique
# Ajouter une sonde sur une fonction du noyau
sudo perf probe --add tcp_sendmsg
# Ajouter une sonde avec arguments de fonction
sudo perf probe --add 'tcp_sendmsg size'
# Ajouter une sonde de retour
sudo perf probe --add 'tcp_sendmsg%return $retval'
# Lister les variables disponibles à un point de sonde
sudo perf probe -V tcp_sendmsg
# Lister les sondes définies
sudo perf probe --list
# Supprimer une sonde
sudo perf probe --del tcp_sendmsg
# Enregistrer avec la sonde dynamique
sudo perf record -e probe:tcp_sendmsg -a sleep 10
# Ajouter une sonde espace utilisateur
perf probe -x /usr/bin/python3 --add 'main'
perf sched — Analyse de l’ordonnanceur
# Enregistrer les événements de l'ordonnanceur
sudo perf sched record sleep 10
# Afficher le résumé de latence d'ordonnancement
sudo perf sched latency
# Afficher la chronologie d'ordonnancement par CPU
sudo perf sched map
# Rejouer les événements d'ordonnancement
sudo perf sched replay
# Afficher les statistiques d'ordonnancement
sudo perf sched timehist
# Afficher les chaînes de réveil
sudo perf sched timehist -w
perf mem — Profilage d’accès mémoire
# Enregistrer les événements d'accès mémoire (nécessite support matériel)
sudo perf mem record ./my_program
# Rapport de profil d'accès mémoire
sudo perf mem report
# Afficher la latence de chargement/stockage
sudo perf mem report --sort=mem,sym
perf lock — Analyse de contention de verrous
# Enregistrer les événements de verrouillage
sudo perf lock record sleep 10
# Rapport de contention de verrous
sudo perf lock report
# Afficher les statistiques de verrouillage
sudo perf lock info
Compteurs matériels
# Lister les événements disponibles
perf list
# Lister les événements matériels
perf list hw
# Lister les événements logiciels
perf list sw
# Lister les événements de cache
perf list cache
# Combinaisons courantes de compteurs matériels
perf stat -e cycles,instructions,branches,branch-misses ./my_program
# Analyse de cache
perf stat -e L1-dcache-loads,L1-dcache-load-misses,LLC-loads,LLC-load-misses ./my_program
# Analyse TLB
perf stat -e dTLB-loads,dTLB-load-misses,iTLB-loads,iTLB-load-misses ./my_program
# Analyse de prédiction de branchement
perf stat -e branches,branch-misses ./my_program
perf script — Sortie d’événements bruts
# Vider les événements bruts pour post-traitement
perf script > out.perf
# Sortie avec champs spécifiques
perf script -F comm,pid,tid,time,event,ip,sym,dso
# Générer des piles pliées pour les flame graphs
perf script | stackcollapse-perf.pl > out.folded
# Filtrer par nom de processus
perf script -c my_program
Référence rapide
| Commande | Fonction |
|---|---|
perf stat | Compter les événements matériels/logiciels |
perf record | Échantillonner et enregistrer les données de profil |
perf report | Analyser le profil enregistré |
perf top | Profilage en direct sur tout le système |
perf annotate | Annotation source/assembleur |
perf probe | Sondes de traçage dynamique |
perf sched | Analyse de l’ordonnanceur |
perf mem | Profilage d’accès mémoire |
perf lock | Analyse de contention de verrous |
perf script | Vidage d’événements pour scripting |
perf list | Lister les événements disponibles |