La compréhension de la perf.cartographie


Je connais l'excellent outil async_profiler et je l'utilise pour profiler mes projets de production. Ici, je veux comprendre perf et comment comprendre sa sortie.

Je joue avec perf pour échantillonner les traces de pile. J'exécute la JVM avec les options -XX:+UnlockDiagnosticVMOptions -XX:+PreserveFramePointer -XX:+ShowHiddenFrames pour éviter les problèmes de trace de pile.

Je l'ai exécuté avec la commande sudo perf record -e cycles -g -p <my_pid> afin d'échantillonner à la fois les traces de la pile du noyau et de comparer le pourcentage résultant. Voici ce que j'ai obtenu:

entrez la description de l'image ici

Le symbole start_thread me semble clair. Ils sont venus du libjvm.so et je peux supposer que j'ai exécuté mon thread de travail 3 pour faire du travail et c'est exactement ce que je vois ici. Les nombres hexidécimaux semblent être des adresses d'instructions de code java compilées par runtime.

QUESTION: Mais d'où vient le perf-27405.map viennent et pourquoi il est apparu sur le dessus.

Author: St.Antario, 2018-09-18

1 answers

perf-<pid>.map file est un moyen de fournir à perf une carte de symboles spécifique à l'application.

Dans votre cas, l'un des pointeurs d'instructions échantillonnés 0x00000000008e06e0 appartient à libjvm.so - perf peut facilement le montrer. Mais l'autre 0x00007f557d10c19f appartient à la région de mémoire anonyme non soutenue par un fichier objet. C'est du code généré dynamiquement, et perf ne peut rien dire à ce sujet à moins que quelqu'un ne l'aide. perf-<pid>.map fichier est l'interface de l'application ou des outils externes pour fournir des informations de symbole pour code généré dynamiquement.

Perf-carte-agent est un exemple d'un tel outil pour Java. Il remplit le fichier perf-<pid>.map avec les informations sur les méthodes compilées JIT, afin que perf puisse mapper ces adresses aux noms de méthodes Java.

 3
Author: apangin, 2018-09-18 22:42:36