Autres options
Répétition
Quand on mesure des performances logicielles, il est risqué de travailler avec des mesures isolées sans barres d’erreur. On peut très facilement se retrouver à croire voir des différences de performances là où il n’y a que du bruit de mesure.
Pour éviter ce problème, je recommande d’utiliser quand c’est possible l’option
--repeat
, qui s’abbrévie en -r
et demande à perf stat
de lancer la
commande indiquée plusieurs fois en calculant la moyenne et l’écart-type de
chaque métrique affichée :
srun --pty \
perf stat -r 5 \
./scale.bin 2048 10000000
Fenêtre de temps
Sur des programmes plus complexes, on peut aussi se heurter au fait que
perf stat
n’affiche par défaut que des quantités aggrégées sur l’ensemble de
l’exécution du programme, alors que le comportement du programme varie dans le
temps. A minima, on a souvent au moins une phase d’initialisation, une phase de
calcul, et une phase de finalisation que l’on aimerait bien séparer.
Pour gérer ce genre de problème, perf stat
fournit plusieurs options utiles :
- L’option
--interval <msecs>
prend en paramètre un nombre de millisecondes, et affiche des statistiques intermédiaires toutes les N millisecondes. - L’option
--delay <msecs>
attend N millisecondes avant de commencer la collecte de données. - L’option
--timeout <msecs>
interrompt la collecte de données au bout de N millisecondes.
En combinant --delay
et --timeout
, on peut facilement sélectionner une phase
de l’exécution du programme pour l’analyser plus précisément, et si jamais le
programme n’affiche pas en standard la durée de ses phases d’exécution, l’option
--interval
peut être utilisée pour l’estimer rapidement sans modifier le code.
Système entier
L’utilisation de perf stat
n’est pas restreinte au suivi de l’utilisation des
ressources par une commande. On peut suivre toute l’activité système avec
l’option --all-cpus
, abbréviée en -a
, qui est activée par défaut si l’on
invoque perf stat
sans lui donner une commande en argument.
Dans le cadre de srv-calcul-ambulant
, ce périmètre est généralement trop large
et on souhaitera ne surveiller que l’activité de certains coeurs CPU, ce qu’on
peut faire avec l’option --cpu
, qui s’abbrévie en -C
.
Nous pouvons par exemple utiliser cela pour comparer l’activité des coeurs CPU interactifs à celle des dédiés au benchmark pendant qu’un moniteur système s’exécute sur une session interactive…
# Dans un shell
dstat-summary
# Dans un autre shell
perf stat --timeout 2000 -r 5 -C 0,1,18,19
perf stat --timeout 2000 -r 5 -C 2-17,20-35
On notera que certaines des métriques de perf
sont à interpréter avec
précautions dans ce mode (par exemple la fréquence d’horloge CPU moyenne en
présence de veille intermittente). Toutefois, l’information essentielle reste :
bien qu’étant 8x plus nombreux, les coeurs de benchmark exécutent ~6x moins
d’instructions dans ce test simple, ou ~50x moins d’instructions par coeur.
Aide intégrée
Il existe beaucoup d’autres options de perf stat
, permettant entre autres
choses de suivre l’activité d’un processus en cours d’exécution (option
-p <PID>
) et dans le cas d’un suivi à l’échelle du système entier de
ségréréger les données mesurées par coeur CPU, socket, noeud NUMA…
Pour en savoir plus sur ces fonctionnalités plus avancées, vous pouvez consulter
l’aide intégrée de perf stat
avec la commande perf help stat
.