samply - Profileur d’échantillonnage avec l’interface Firefox Profiler
samply est un profileur d’échantillonnage en ligne de commande multiplateforme pour macOS, Linux, et Windows. Il échantillonne les traces de pile d’une commande ou d’un processus en cours (par défaut ~1000 Hz) puis sert les résultats à l’interface Web Firefox Profiler — une interface avant-garde mature avec des graphes en flamme, des graphiques de pile, un arbre d’appels, et des chronologies par thread. Il profile le code natif (C/C++/Rust/Go) et d’autres langages qui émettent des informations de pile standard, sans changements de code nécessaires.
Installation
| Méthode | Commande |
|---|
| Cargo | cargo install --locked samply |
| Binaire | télécharger depuis la page GitHub Releases |
| Accès aux événements Linux perf | peut nécessiter sysctl kernel.perf_event_paranoid=1 (ou inférieur) |
| Vérifier | samply --version |
Utilisation de base
| Commande | Description |
|---|
samply record ./my-program args | Profiler une commande, puis ouvrir l’interface |
samply record -- cargo run --release | Profiler après -- (passer les flags à travers) |
samply record --pid 1234 | Profiler un processus déjà en cours d’exécution |
samply load profile.json.gz | Réouvrir un profil sauvegardé dans l’interface |
samply --help | Liste complète des options |
Options d’enregistrement
| Option | Description |
|---|
-r, --rate N | Fréquence d’échantillonnage en Hz (par défaut ~1000) |
-o, --output FILE | Sauvegarder le profil dans un fichier |
--save-only | Enregistrer sans lancer l’interface du navigateur |
-p, --pid PID | Attacher à un processus en cours d’exécution |
-d, --duration SECS | Profiler pendant une durée fixe |
--reuse-threads | Ajustement du traitement des threads pour certaines charges de travail |
-- | Tout après est la commande + ses args |
L’interface Web Firefox Profiler
Après l’enregistrement, samply ouvre une vue Firefox Profiler locale. Panneaux clés :
| Panneau | Affiche |
|---|
| Flame graph | Piles agrégées (où le temps est dépensé) |
| Stack chart | Le temps sur l’axe x, les piles empilées verticalement |
| Call tree | Hiérarchie haut-bas / bas-haut avec temps propre/total |
| Marker chart | Événements dans le temps (si présent) |
| Timeline | Activité par thread ; sélectionner une plage pour se concentrer |
| UI action | Utilisation |
|---|
| Sélectionner une plage de temps | Concentrer l’analyse sur une partie de l’exécution |
| Inverser la pile d’appels | Trouver les fonctions de feuille chaudes (temps propre) |
| Recherche | Filtrer l’arbre d’appels par nom de fonction |
| Partager/exporter | Sauvegarder ou uploader le profil |
Conseils de workflow
| Objectif | Approche |
|---|
| Trouver les chemins chauds CPU | Enregistrer, ouvrir le graphe en flamme, chercher les cadres larges |
| Trouver une phase lente spécifique | Sélectionner cette plage de temps dans la chronologie |
| Comparer les builds | Sauvegarder les profils et charger côte à côte |
| Réduire le bruit | Profiler les builds release avec les infos de debug (debug = true) |
Workflows courants
# Profiler une compilation Rust release (garder les symboles avec les infos de debug)
samply record -- cargo run --release
# Profiler un serveur en cours d'exécution pendant 20 secondes
samply record --pid $(pgrep -n myserver) -d 20
# Enregistrer headless dans CI, inspecter l'artefact plus tard
samply record --save-only -o prof.json.gz ./bench
samply load prof.json.gz
samply vs autres profileurs
| Aspect | samply | perf + FlameGraph | hotspot |
|---|
| Plateformes | macOS/Linux/Windows | Linux | Linux |
| Interface | Firefox Profiler (riche) | SVG statique | Qt GUI |
| Configuration | Binaire unique | Plusieurs outils | Installation GUI |
| Meilleur pour | Multiplateforme, interactif | Profilage Linux scripté | Utilisateurs Qt/perf GUI |
Ressources