Comprensione perf.mappa
Sono a conoscenza del grande strumento async_profiler e lo uso per profilare i miei progetti di produzione. Qui voglio capire su perf
e come capire il suo output.
Sto giocando con perf per campionare le tracce dello stack. Eseguo la JVM con le opzioni -XX:+UnlockDiagnosticVMOptions -XX:+PreserveFramePointer -XX:+ShowHiddenFrames
per evitare che la traccia dello stack si incasini.
L'ho eseguito con il comando sudo perf record -e cycles -g -p <my_pid>
per campionare sia l'utente che le tracce dello stack del kernel e confrontare la percentuale risultante. Ecco quello che ho ottenuto:
Il simbolo start_thread
mi sembra chiaro. Sono venuti da libjvm.so
e posso fare l'ipotesi che ho eseguito il mio thread di lavoro 3 per fare un lavoro e questo è esattamente quello che vedo qui. I numeri esidecimali sembrano essere un runtime compilato indirizzi istruzioni java-code.
DOMANDA: Ma da dove viene il perf-27405.map
e perché è apparso in cima.
1 answers
perf-<pid>.map
file è un modo per fornire perf
con mappa simbolo specifico dell'applicazione.
Nel tuo caso uno dei puntatori di istruzioni campionati 0x00000000008e06e0
appartiene a libjvm.so
- perf può facilmente mostrarlo. Ma l'altro 0x00007f557d10c19f
appartiene alla regione di memoria anonima non supportata da alcun file oggetto. Questo è un codice generato dinamicamente e perf non può dire nulla a meno che qualcuno non aiuti. perf-<pid>.map
file è l'interfaccia per l'applicazione o gli strumenti esterni per fornire informazioni sui simboli codice generato dinamicamente.
Perf-map-agent è un esempio di tale strumento per Java. Riempie il file perf-<pid>.map
con le informazioni sui metodi compilati da JIT, in modo che perf possa mappare questi indirizzi ai nomi dei metodi Java.