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 de perf record et perf script.
  • On gaspillerait nos cycles CPU à convertir les données issues du fichier perf.data en format texte avec perf 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

Liste des scripts fournis avec perf

Ces scripts se divisent en deux catégories :

  • Les scripts d’analyse différée, qui peuvent fonctionner en deux temps :
    1. 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.
    2. On affiche les résultats avec perf script report <script>, suivi des arguments éventuels du scrips mentionnés dans la sortie de perf script --list.
  • 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.

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

Exemple de perf script 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

Exemple de 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

Exemple de perf script rwtop

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.