Autres options

perf annotate a relativement peu d’options intéressantes, on notera surtout quelques options de filtrage qui peuvent parfois être utiles comme…

  • --dsos/-d qui permet de n’afficher que le source d’un binaire sur des programmes composés de plusieurs binaires liés dynamiquement
  • --symbol/-s qui permet de n’afficher qu’une seule fonction (symbole) du binaire cible
  • --cpu/-C qui permet de n’afficher que l’activité de certains coeurs CPU

En revanche, perf record possède un grand nombre d’options qui sont souvent utiles. Nous n’aborderons certaines que dans la partie sur perf report, où leur fonction sera plus claire, mais nous pouvons déjà en mentionner quelques unes ici.

Similarités avec perf stat

Tout d’abord, un grand nombre d’options que nous avons déjà abordées dans le cadre de perf stat restent utilisables avec perf record. C’est ainsi le cas de --event/-e, --all-cpus/-a, --pid/-p, --cpu/-C et --delay/-D. Comme nous avons déjà abordé ces options dans la partie sur perf stat, nous ne reviendrons pas dessus ici.

Fréquence d’échantillonage

L’un des plus importants compromis de configuration d’un profileur par échantillonnage est la fréquence avec laquelle il mesure des échantillons, sa fréquence d’échantillonage :

  • Plus l’on mesure des échantillons fréquemment, plus la mesure est précise à temps de mesure égal, mais plus l’on biaise le profil de performance du programme étudié en consommant des ressources systèmes au niveau du profileur.
  • La fréquence d’échantillonage ne doit pas être multiple d’une fréquence temporelle caractéristique à laquelle le programme effectue des tâches, sous peine de sur ou sous-évaluer aléatoirement le poids de ces tâches dans l’exécution du programme.

Comme le coût de mesure d’un échantillon peut varier grandement en fonction de ce qu’on mesure, il est préférable d’ajuster empiriquement la fréquence d’échantillonnage. Un moyen de le faire est de mesurer une caractéristique de performance simple du programme (par exemple le temps d’exécution) avec et sans instrumentation perf record, et de réduire la fréquence d’échantillonnage de perf record jusqu’à ce que l’on n’observe plus de dégradation de performance mesurable.

Perf permet d’ajuster la fréquence d’échantillonnage selon deux critères :

  • Mesurer 1 événement tous les N événements, via l’option --count N qui s’abbrévie en -c N. C’est en général le levier nativement utilisé par l’implémentation de perf sous le capot. Son principal défaut est que le surcoût associé à la mesure dépend de la fréquence de l’événement, qui n’est a priori pas connue à l’avance et variable dans le temps.
  • Viser une fréquence d’échantillonnage moyenne de M échantillons par seconde, via l’option --freq M qui s’abbrévie en -F M. Cette option offre des surcoûts de mesure mieux contrôlés, et est donc généralement préférable.

Pour ne pas bloquer le système, perf s’impose une limite de fréquence d’échantillonnage. Si l’on demande une fréquence plus élevée, la demande sera ignorée. On peut demander à perf d’opérer à cette fréquence maximale avec -F max. Cette limite est configurable, comme expliqué dans l’annexe sur l’installation de perf.

Fichier de sortie

perf record produit par défaut un fichier de données dans le répertoire courant, ce qui occasionne logiquement des écritures sur le périphérique associé. Cela peut être problématique dans deux cas :

  • Quand on analyse les performances d’un programme qui utilise le même périphérique, car l’activité de stockage associée à perf va se mélanger à celle du programme étudié et rendre les mesures plus difficiles à interpréter.
  • Quand on pousse perf dans ses retranchements et lui fait générer un grand flux de données, plus intense que le périphérique de stockage sous jacent ne peut absorber.

Pour gérer ces cas, on peut indiquer à perf record d’écrire ses données à un autre endroit avec l’option --output /chemin/vers/le/fichier, qui s’abbrévie en -o /chemin/vers/le/fichier. Cette option doit être couplée à une option --input équivalente dans les commandes qui analysent la sortie de perf record, comme perf annotate.

En particulier, une astuce courante est d’écrire les données dans un ramdisk, répertoire virtuel hébergé en RAM et qui dispose donc d’une bande passante très importante que le périphérique de stockage. En fin de mesure, on ramènera ensuite les données dans le répertoire courant pour ne pas encombrer inutilement la RAM et risquer de perdre ses données en cas d’arrêt de la machine.

Sur srv-calcul-ambulant, on peut le faire comme ceci :

srun --pty \
    perf record -o /dev/shm/${USER}/perf.data  ... autres options ... \
&& mv /dev/shm/${USER}/perf.data .