magic-trace raccoglie e visualizza tracce ad alta risoluzione di ciò che sta facendo un processo. Le persone lo hanno usato per:
- capire perché un’applicazione in esecuzione, in produzione gestisce alcune richieste lentamente mentre gestisce contemporaneamente un mare di richieste non interessanti;
- verificare cosa sta effettivamente facendo il codice invece di quello che si pensi stia facendo;
- ottenere una cronologia di ciò che l’applicazione stava facendo prima che si arrestasse in modo anomalo, invece di un semplice stacktrace in quell’ultimo istante;
- …e altro ancora!
Magic trace:
- ha un overhead del 2%-10%,
- non richiede modifiche all’applicazione per l’uso
- traccia ogni chiamata di funzione con una risoluzione di ~40ns
- interpreta una timeline di call stacks che tornano indietro (configurabile) di circa 10 ms.
Si usa come perf
: si punta su un processo e si spegne. La differenza fondamentale rispetto a perf
è che, invece di campionare gli stack di chiamate nel tempo, magic-trace utilizza Intel Processor Trace per eseguire lo snapshot di un buffer ad anello di tutto il flusso di controllo che porta a un determinato momento 1 . Quindi, si può esplorare una timeline interattiva di quanto accaduto.
Puoi puntare magic-trace su una funzione in modo tale che quando la tua applicazione la chiama, magic-trace acquisisca un’istantanea. In alternativa, collegalo a un processo in esecuzione e staccalo con Ctrl+ C, per vedere traccia di un punto arbitrario nel tuo programma.
Installazione
-
Assicurati che il sistema che vuoi tracciare sia supportato. I vincoli più comunemente limitanti sono: le macchine virtuali per lo più non sono supportate, solo Intel (Skylake 2 o successivo), solo Linux.
-
Prendi un binario di rilascio dall’ultima pagina di rilascio.
- Se si scarica il binario precompilato (non il pacchetto),
chmod +x magic-trace
3 - Se stai scaricando il pacchetto, esegui
sudo dpkg -i magic-trace*.deb
Quindi, provalo eseguendo
magic-trace -help
, che dovrebbe far apparire del testo della guida. - Se si scarica il binario precompilato (non il pacchetto),
Si inizia
-
Ecco un esempio di programma C da provare. È una versione leggermente modificata dell’esempio in
man 3 dlopen
. Scaricalo, compilalo congcc demo.c -ldl -o demo
, quindi lascialo in esecuzione./demo
. Useremo quel programma per imparare come funzionadlopen
. -
Esegui
magic-trace attach -pid $(pidof demo)
. Quando vedi il messaggio che è stato allegato correttamente, attendi un paio di secondi e Ctrl+ Cmagic-trace
. Verrà generato un file chiamatotrace.fxt
nella tua directory di lavoro. - Apri magic-trace.org , fai clic su “Apri file di traccia” in alto a sinistra e fornisci il file di traccia generato nel passaggio precedente.
- Questo avrebbe dovuto espandersi in una traccia. Aumenta lo zoom fino a visualizzare un singolo loop attraverso
dlopen
/dlsym
/cos
/printf
/dlclose
.- W ingrandisce ovunque sia puntato il cursore del mouse (dovrai ingrandire un sacco per vedere qualcosa di utile),
- S rimpicciolisce,
- A si muove a sinistra,
- D si muove a destra,
- la rotellina di scorrimento sposta la vista su e giù.
5. Fare clic e trascinare sullo spazio bianco attorno ai call stacks da misurare. Pianta le bandiere facendo clic nella timeline in alto. Utilizzando lo strumento di misurazione, misurare quanto tempo ci vuole per eseguire cos
. Sul mio schermo ci vogliono circa 5,7 us.
Così hai appena tracciato magicamente il tuo primo programma!
Contrariamente ai workflow tradizionali perf
, magic-trace eccelle nella generazione di ipotesi. Ad esempio, potresti notare che impiegare 6us per eseguire cos
è davvero molto tempo! Se ingrandisci ancora di più, vedrai che in realtà ci sono cinque celle rosa “[non tracciate]”. Se esegui nuovamente magic-trace con root e gli trasmetti -trace-include-kernel
, vedrai stacktrace per quelli. Sono gestori di errori di pagina! Il programma demo in realtà chiama cos
due volte. Se ingrandisci ancora di più verso la fine dei 6us della call cos
, vedrai che la seconda call richiede molto meno tempo e non provoca errori di pagina.
Per approfondimenti e maggiori dettagli https://github.com/janestreet/magic-trace#readme