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.