L'adresse de chargement des bibliothèques partagées est stockée dans le fichier perf.data enregistré au cours de la phase d'exécution du projet. perf record
commande. Vous pouvez utiliser la commande perf script -D
pour extraire les données de perf.data dans un format partiellement décodé. Lorsque votre programme est chargé par ld-linux*.so.2
(ou si nécessaire avec dlopen), le chargeur recherchera la bibliothèque et chargera ses segments à l'aide de la fonction mmap
syscall. Ces événements mmap sont enregistrés par le noyau et ont le type PERF_RECORD_MMAP ou PERF_RECORD_MMAP2 dans le fichier perf.data. Et perf report
(et perf script
) reconstruira les décalages de mémoire pour décoder les noms de symboles.
$ perf record echo 1
$ perf script -D|grep MMAP -c
7
$ perf script -D|less
PERF_RECORD_MMAP2 ... r-xp /bin/echo
...
PERF_RECORD_MMAP2 ... r-xp /lib/x86_64-linux-gnu/libc-2.27.so
Idées de base perf
sont décrits dans https://github.com/torvalds/linux/blob/master/tools/perf/design.txt fichier. Pour commencer le profilage, il y a perf_event_open
syscall qui a perf_event_attr *attr
argument. Page de manuel décrit les champs de l'attr liés à la mémoire tampon :
The perf_event_attr structure provides detailed configuration
information for the event being created.
mmap : 1, /* include mmap data */
mmap_data : 1, /* non-exec mmap data */
mmap2 : 1, /* include mmap with inode data */
Le noyau Linux dans son perf_events
(kernel/events) enregistrera les événements requis pour les processus profilés et exportera les données avec fd et mmap vers le profileur. perf record
déverse généralement ces données du noyau dans le fichier perf.data sans traitement lourd (vérifiez les impressions "Woken up 1 times to write data" de votre fichier perf record
sortie). Les événements Mmap dans le noyau sont enregistrés par perf_event_mmap_output
appelé par perf_event_mmap_event
qui est appelé à partir de perf_event_mmap
. Mise en œuvre de l'appel sélectif mmap dans mm/mmap.c
a des appels inconditionnels à perf_event_mmap
.
Le design.txt de perf mentionne munmap, mais la mise en œuvre actuelle n'a pas de champ ou d'événement munmap, le code d'événement 2 a été réutilisé pour PERF_RECORD_LOST . Des idées ont été émises quant à l'utilité de munmap. https://www.spinics.net/lists/netdev/msg524414.html avec des liens vers https://lkml.org/lkml/2016/12/10/1 y https://lkml.org/lkml/2017/1/27/452
L'outil perf fait partie des sources du noyau linux et peut être consulté en ligne sur le site LXR/elixir : https://elixir.bootlin.com/linux/v5.4/source/tools/perf/ Le code de traitement des événements mmap/mmap2 se trouve dans perf/util/machine.c machine__process_mmap_event
y machine__process_mmap2_event
Les arguments mmap enregistrés, l'adresse renvoyée, le décalage et le nom du fichier sont enregistrés à l'aide de la fonction map__new
y thread__insert_map
pour le processus (pid/tid) et utilisé ultérieurement pour convertir l'adresse de l'événement échantillon en nom de symbole.
PS : Votre perf.data a une taille de plus de 300 MB, ce qui est énorme et le traitement peut être lent. Pour les programmes de longue durée, vous pouvez réduire la fréquence d'échantillonnage des événements de l'enregistrement de perf avec -F freq
option de perf record
: perf record -F40
ou avec -c
opción.