perf是否锁定配置文件用户空间互斥?

Gab*_*ern 9 linux perf

摘要:perf lock配置文件pthread_mutex?

细节:

该工具perf有一个选项perf lock.手册页说:

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.
Run Code Online (Sandbox Code Playgroud)

但是当我试着跑步时,perf lock record我得到一个错误说:invalid or unsupported event: 'lock:lock_acquire'.我看了,似乎错误可能是因为我的内核没有编译CONFIG_LOCKDEPCONFIG_LOCK_STAT.

我的问题是:是否perf lock报告与用户空间锁(如pthread_mutex)或仅内核锁相关的事件?我对分析主要在用户空间中运行的应用程序更感兴趣.我认为perf中的这个选项看起来很有意思,但是因为我没有编译(或获得)新内核就无法运行它,我有兴趣在尝试之前更好地了解它的作用.

osg*_*sgx 5

摘要:perf锁定配置文件pthread_mutex?

摘要:否,因为在用户空间pthread_mutex中没有定义任何跟踪点.

根据源文件tools/perf/builtin-lock.c(http://lxr.free-electrons.com/source/tools/perf/builtin-lock.c#L939)cmd_lock调用 __cmd_record,它定义perf record(via -e TRACEPOINT_NAME)的几个跟踪点并将选项传递-R -m 1024 -c 1perf report.定义的跟踪点列表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 };
Run Code Online (Sandbox Code Playgroud)

TRACE_EVENT(lock_acquire,..定义于 trace/events/lock.h.并且 trace_lock_acquire仅在kernel/locking/lockdep.c中定义(在debian代码库中重新检查:http://codesearch.debian.net/search?q = trace_lock_acquire ).根据以下内容,只有内核中缺少CONFIG_LOCKDEP kernel/locking/Makefile:( obj-$(CONFIG_LOCKDEP) += lockdep.o跟踪点是无条件定义的lockdep.c.

根据https://www.kernel.org/doc/Documentation/trace/tracepoints.txt,所有跟踪点都是仅内核的,因此perf lock不会分析用户空间锁.

您可以尝试LTTng中的跟踪点,LTTng是声明用户空间跟踪点的项目(http://lttng.org/ust).但是没有现成的锁定统计信息,只有跟踪点上的原始数据.您还应该使用tracef()宏定义跟踪点(重新编译pthreads/glibc,或者尝试在pthread周围创建自己的包装器).