Scripting
Nous arrivons enfin à la fonctionnalité qui a donné son nom à la commande
perf script
, à savoir la possibilité de manipuler les données mesurées par
perf
avec du code.
Bien qu’il serait, en principe, possible de le faire juste avec la
fonctionnalité de base de perf script qui décrit sous forme textuelle les
événements stockés dans un fichier perf.data
, ce serait insatisfaisant pour
plusieurs raisons :
- Il faut disposer d’un fichier
perf.data
, ce qui exclut les analyses “temps réel” sauf à alterner rapidement entre des exécutions deperf record
etperf script
. - On gaspillerait nos cycles CPU à convertir les données issues du fichier
perf.data
en format texte avecperf script
, puis à réinterpréter cette sortie texte sous une forme utilisable par notre programme au sein de celui-ci.
Il est donc préférable, quand c’est possible, d’utiliser une vraie API. En
dehors de l’API noyau perf_events()
utilisée par tous les outils perf
, qui
est accessible depuis tout langage de programmation pouvant invoquer une API C,
deux APIs plus haut niveau sont actuellement utilisables via perf script
, une
pour Perl et une pour Python.
Utilisation de scripts
Nous pouvons commencer par explorer la panoplie de scripts distribués avec
perf
, certains n’ayant pas seulement de la valeur en tant qu’exemple :
perf script --list
Ces scripts se divisent en deux catégories :
- Les scripts d’analyse différée, qui peuvent fonctionner en deux temps :
- On enregistre des données avec
perf script record <script> [<commande>]
.- Si une commande est spécifiée, elle est exécutée et des mesures sont
prises sur le processus associé et ses enfants jusqu’à la fin de
l’exécution (comme avec
perf record <commande>
, mais le choix des événements est automatique) - Si aucune commande n’est spécifiée, on fait des mesures à l’échelle du
système entier (comme avec
perf record -a
). Il est possible de forcer ce mode d’acquisition même quand une commande est précisée avec l’option-a
.
- Si une commande est spécifiée, elle est exécutée et des mesures sont
prises sur le processus associé et ses enfants jusqu’à la fin de
l’exécution (comme avec
- On affiche les résultats avec
perf script report <script>
, suivi des arguments éventuels du scrips mentionnés dans la sortie deperf script --list
.
- On enregistre des données avec
- Les scripts d’analyse temps réel, dont le nom se termine par “top”, et qu’on
lance avec
perf script <script>
suivi des arguments éventuels.- Si on lance un script d’analyse différée avec la même syntaxe,
perf
effectue un cycle enregistrement/affichage sans créer de fichier intermédiaire (les données sont stockées en mémoire). Mais on ne peut pas spécifier d’arguments optionnels.
- Si on lance un script d’analyse différée avec la même syntaxe,
Voici un exemple d’analyse différée avec le script failed-syscalls
, qui
compte les appels système ayant échoués, à l’échelle du système entier si on
ne passer pas de commande en argument :
perf script -a record failed-syscalls sleep 5 \
&& perf script report failed-syscalls
Et voici un exemple d’analyse temps réel avec le script rwtop
, qui indique en
temps réel quels processus transfèrent le plus grand volume de données via les
appels système read()
et write()
, ainsi que les tailles de tampons utilisées
lors des lectures :
perf script rwtop
Notez que certains scripts peuvent avoir des dépendances extérieures non
disponibles sur srv-calcul-ambulant
, par exemple le script sched-migration a
une interface graphique WxPython.
Ecriture de scripts
La liste des noms de langages reconnus peut être affichée avec l’option
--script lang
. Un fichier dont le nom se termine par un de ces noms sera
traité comme étant écrit dans le langage associé.
perf script --script lang
Et la documentation pour un langage donné est contenue dans la page de man
perf-script-<langage>
, par exemple perf-script-python
pour Python. Elle
commence par un tutoriel, suivi de documentation de référence.
On peut générer un squelette de code avec l’option --gen-script=<langage>
,
puis une fois le code écrit, on peut indiquer à perf script
d’utiliser notre
script avec l’option --script=<fichier>
.
Pour en apprendre plus sur l’écriture de script, je vous invite à effectuer le tutoriel contenu dans la page de man associée au langage que vous préférez.