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:

inserisci qui la descrizione dell'immagine

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.

Author: St.Antario, 2018-09-18

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.

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