Aller au contenu

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

CommandeFonction
perf statCompter les événements matériels/logiciels
perf recordÉchantillonner et enregistrer les données de profil
perf reportAnalyser le profil enregistré
perf topProfilage en direct sur tout le système
perf annotateAnnotation source/assembleur
perf probeSondes de traçage dynamique
perf schedAnalyse de l’ordonnanceur
perf memProfilage d’accès mémoire
perf lockAnalyse de contention de verrous
perf scriptVidage d’événements pour scripting
perf listLister les événements disponibles