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

Statistiques répétées

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

Statistiques coeurs interactifs Statistiques coeurs de benchmark

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.