摘要: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_LOCKDEP
或CONFIG_LOCK_STAT
进行编译。
我的问题是:perf lock
是否报告与用户空间锁相关的事件(如pthread_mutex)或仅报告内核锁?我对分析主要在用户空间中运行的应用程序更感兴趣。我觉得perf中的这个选项看起来很有意思,但是因为我没有编译(或获得)新内核就无法运行它,我有兴趣在尝试之前更好地了解它的作用。
答案 0 :(得分:5)
摘要:是否执行perf lock profile 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
的几个跟踪点(通过-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上了解更多。