Événements prédéfinis
Pour avoir la liste complète des événements système prédéfinis par perf
,
utilisables via l’option --event
(qui s’abbrévie en -e
) de toutes les
commandes perf
qui font un suivi d’événements, vous pouvez utiliser la
commande perf list
.
Mais comme vous allez rapidement le constater si vous essayez, cette liste est très longue (5933 lignes au moment où j’écris ce TP). Il est donc utile de connaître ses mécanismes de filtrage.
Tout d’abord, les événements sont triés en grandes catégories, que j’aurais personnellement tendance à regrouper encore en catégories de niveau supérieur :
- Avec
perf list hw cache
, vous pouvez afficher la liste des événements matériels génériques/abstraits. Ces événements sont mesurables sur à peu près tout matériel supporté parperf
, et implémentés en utilisant les événements spécifiques à chaque matériel. - Avec
perf list sw tracepoint sdt
, vous pouvez afficher la liste des événements logiciels, qui sont générés par le noyau Linux et certaines bibliothèques. Au niveau des sous-catégories…- Ceux libellés
[Software event]
et[Tool event]
sont accessibles sur tout ordinateur équipé deperf
sans configuration supplémentaire. - Ceux libellés
[Tracepoint event]
et[SDT event]
nécessitent des privilèges de traçage (voir l’annexe installation pour plus d’informations sur ce point), qui ont été préconfigurés pour vous sursrv-calcul-ambulant
.- Ceux libellés
[SDT event]
nécessitent également des préparatifs avant utilisation, que nous aborderons dans la partie surperf probe
.
- Ceux libellés
- Ceux libellés
- Avec
perf list pmu
, vous pouvez afficher la liste des événements que votre CPU sait compter via sa Performance Monitoring Unit (PMU). Ils sont très nombreux, particulièrement chez Intel, c’est la majeure partie de la sortie brute deperf list
sans filtrage. - Avec
perf list metric metricgroup
, vous pouvez afficher la liste des métriques et groupes de métriques. Mais curieusement, cette liste n’est pas hiérarchisée comme la sortie finale deperf list
, ce qui la rend moins lisible. Je vous recommande donc plutôt d’utiliserperf list
sans arguments ici, en sautant à la fin du texte avec la toucheFin
de votre clavier.
Il est aussi possible d’effectuer une recherche au sein de la sortie de
perf list
, par exemple perf list float
retournera tous les événements dont
le nom ou la description contient le mot “float”.
Exercice : Quand on vectorise du code sans revoir sa politique d’allocation mémoire, on se retrouve fréquemment avec des problèmes de performances liés à des accès mémoire non alignés.
Contrairement à une croyance populaire tenace, les mauvaises performances
observées ne proviennent pas du fait que le compilateur génère des instructions
non optimisées pour les accès alignés comme movups
. Sur les CPUs actuels,
ces instructions ont des performances équivalentes à leurs cousines optimisées
pour les accès alignés, qui sont donc plus ou moins obsolètes.
En réalité, le vrai problème est que dans cette configuration, les accès mémoire liés au calcul vectorisé, qui sont très larges, peuvent et vont souvent se retrouver à cheval sur deux lignes de cache, ce qui force le processeur à lire ou écrire deux lignes de cache au lieu d’une. Il en résulte une sur-utilisation des ressources mémoire, qui cause le ralentissement observé.
Dans la section “cache” de la sortie de perf list pmu
, trouvez quels
événements passer en paramètre à perf stat -e
pour établir avec certitude si
vous avez ou non affaire à ce problème.