Commande unique

Une première utilisation possible de perf trace est de surveiller les appels systèmes effectués par une commande, à la manière de l’utilitaire Unix traditionnel strace :

srun --pty \
    perf trace \
    ./scale.bin 2048 10000000
Sortie de perf trace

Pour comparaison, voici la sortie de strace sur ce même programme :

Sortie de strace

Que peut-on conclure de cette première observation ?

On constate tout d’abord que même l’exécution d’un “pur calcul” nécessite des appels systèmes, liés au chargement des bibliothèques partagées et à diverses étapes d’initialisation.

On remarquera aussi que la sortie de perf trace est moins verbeuse que celle de strace, car elle omet certains détails comme les nombreuses étapes de recherche des bibliothèques partagées. Selon ce que l’on essaie de faire, cela peut être un avantage ou un inconvénient.

On notera enfin que perf trace est dans l’ensemble un outil moins mature que strace, et qu’il lui manque notamment cruellement la capacité de décoder les arguments de type chaîne de caractère.

Mais ce qui est moins visible, c’est que l’implémentation de ces deux outils est aussi très différente :

  • strace fonctionne comme un débogueur : il demande au noyau Linux d’interrompre le programme et lui donner la main à chaque fois qu’un appel système survient, affiche les caractéristiques de l’appel système observé, puis fait redémarrer le programme.
  • perf trace n’interrompt pas l’exécution du programme, il demande plutôt au noyau de lui envoyer une notification chaque fois qu’un appel système survient et affiche ensuite les événements dont il a été notifié de façon asynchrone.

Ces différences d’implémentation ont plusieurs conséquences :

  • perf trace a un impact bien moins élevé sur les performances du programme étudié.
  • La sortie de perf trace n’est pas synchronisée avec celle du programme étudié, ce qui peut parfois la rendre plus difficile à interpréter.
  • Si le programme effectue des appels système plus vite que perf trace ne parvient à les analyser, perf trace ne parviendra pas à traiter tous les appels système.
  • perf trace n’est pas restreint à la surveillance des seuls appels système et peut surveiller l’activité du système entier, intérieur du noyau Linux compris.

Exercice : Comparez perf trace et strace en termes de comportement et d’impact sur les performances de la commande tree /usr >/dev/null, qui énumère l’ensemble des fichiers du dossier /usr et effectue pour cela un très grand nombre d’appels système. Voici une commande Slurm que vous pouvez utiliser comme base de travail :

srun --pty \
    bash -c 'time tree /usr >/dev/null'

N’oubliez pas de lancer la commande une première fois avant les mesures pour pré-remplir le cache disque. Du fait de l’existence de ce cache, la première exécution aura des caractéristiques de performances différentes des suivantes…

Si vous appliquez strace au processus bash plutôt qu’au processus tree, vous aurez besoin de l’option -f qui permet de suivre les processus enfants. perf trace effectue ce suivi par défaut.