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:
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.
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.