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

时间:2013-06-07 20:37:41

标签: 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.

但是当我尝试运行perf lock record时,我收到错误消息:invalid or unsupported event: 'lock:lock_acquire'。我看了,似乎错误可能是因为我的内核没有使用CONFIG_LOCKDEPCONFIG_LOCK_STAT进行编译。

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

2 个答案:

答案 0 :(得分:5)

  

摘要:是否执行perf lock profile pthread_mutex?

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

根据源文件tools/perf/builtin-lock.chttp://lxr.free-electrons.com/source/tools/perf/builtin-lock.c#L939cmd_lock调用__cmd_record,它定义了perf record的几个跟踪点(通过-e TRACEPOINT_NAME)和还会将选项-R -m 1024 -c 1传递给perf 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 };

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)。 根据{{​​1}}:kernel/locking/Makefile,内核中只缺少CONFIG_LOCKDEP(跟踪点在obj-$(CONFIG_LOCKDEP) += lockdep.o中无条件定义。

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

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

答案 1 :(得分:-1)

不。但是也许您可以通过记录sched_stat_sleep和sched_switch事件来完成:

$ perf record -e sched:sched_stat_sleep,sched:sched_switch -g -o perf.data.raw yourprog
$ perf inject -v -s -i perf.data.raw -o perf.data
$ perf report --stdio --no-children

注意:确保您的内核是使用CONFIG_SCHEDSTATS=y编译的,并且已在/proc/sys/kernel/sched_schedstats启用了它

https://perf.wiki.kernel.org/index.php/Tutorial#Profiling_sleep_times上了解更多。