2013-06-07 13 views
6

Sommario: il profilo perf lock pthread_mutex?Lo spazio utente del profilo di blocco perfode si modifica?

Dettagli:

Lo strumento perf ha un'opzione perf lock. La pagina man dice:

You can analyze various lock behaviours and statistics with this perf lock command. 
    'perf lock record <command>' records lock events 
    between start and end <command>. And this command 
    produces the file "perf.data" which contains tracing 
    results of lock events. 

    'perf lock trace' shows raw lock events. 

    'perf lock report' reports statistical data. 

Ma quando ho provato a fare funzionare perf lock record ho ottenuto un errore che dice: invalid or unsupported event: 'lock:lock_acquire'. Ho guardato e sembra che l'errore è probabilmente perché il mio kernel non è compilato con CONFIG_LOCKDEP o CONFIG_LOCK_STAT.

La mia domanda è: fa perf lock segnalare eventi relativi a blocchi dello spazio utente (come pthread_mutex) o solo blocchi del kernel? Sono più interessato alla profilazione di applicazioni che funzionano principalmente nello spazio utente. Ho pensato che questa opzione in perf fosse interessante, ma dal momento che non posso eseguirla senza compilare (o ottenere) un nuovo kernel, mi interessa avere un'idea migliore di ciò che fa prima di provare.

risposta

3

Riepilogo: Il profilo di blocco perf pthread_mutex?

Riepilogo: no, perché non è stato definito alcun punto di traccia nello spazio utente pthread_mutex.

Secondo sorgente tools/perf/builtin-lock.c (http://lxr.free-electrons.com/source/tools/perf/builtin-lock.c#L939) cmd_lock chiama __cmd_record, che definisce vari tracepoint per perf record (via -e TRACEPOINT_NAME) e passa opzioni -R -m 1024 -c 1 a perf report. Elenco dei tracepoint definiti: lock_tracepoints:

842 static const struct perf_evsel_str_handler lock_tracepoints[] = { 
843   { "lock:lock_acquire", perf_evsel__process_lock_acquire, }, /* CONFIG_LOCKDEP */ 
844   { "lock:lock_acquired", perf_evsel__process_lock_acquired, }, /* CONFIG_LOCKDEP, CONFIG_LOCK_STAT */ 
845   { "lock:lock_contended", perf_evsel__process_lock_contended, }, /* CONFIG_LOCKDEP, CONFIG_LOCK_STAT */ 
846   { "lock:lock_release", perf_evsel__process_lock_release, }, /* CONFIG_LOCKDEP */ 
847 }; 

TRACE_EVENT(lock_acquire,.. è definito in trace/events/lock.h. E trace_lock_acquire è definito solo in kernel/locking/lockdep.c (ricontrollare in codebase debian: http://codesearch.debian.net/search?q=trace_lock_acquire). Solo CONFIG_LOCKDEP non è presente il kernel in base alle kernel/locking/Makefile:. obj-$(CONFIG_LOCKDEP) += lockdep.o (tracepoint sono definiti incondizionatamente nel lockdep.c

Secondo https://www.kernel.org/doc/Documentation/trace/tracepoints.txt tutti tracepoint sono kernel-soltanto, in modo perf lock non saranno profilo user-space serrature

. Puoi provare tracepoints da LTTng, il progetto che dichiara i tracepoint dello spazio utente (http://lttng.org/ust), ma non ci saranno statistiche di blocco pronto, ma solo dati grezzi su tracepoints. Dovresti anche definire i tracepoint con la macro tracef() (ricompilare pthreads/glibc o provare per creare il tuo wrapper attorno a pthread)

Problemi correlati