perf 是不是锁定配置文件用户空间互斥锁?
Posted
技术标签:
【中文标题】perf 是不是锁定配置文件用户空间互斥锁?【英文标题】:Does perf lock profile user space mutexes?perf 是否锁定配置文件用户空间互斥锁? 【发布时间】:2013-06-07 20:37:40 【问题描述】:总结: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 中的这个选项看起来很有趣,但由于我无法在不编译(或获取)新内核的情况下运行它,所以我有兴趣在尝试之前更好地了解它的作用。
【问题讨论】:
【参考方案1】:总结:性能是否锁定配置文件 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)。
根据kernel/locking/Makefile
,您的内核中仅缺少 CONFIG_LOCKDEP:obj-$(CONFIG_LOCKDEP) += lockdep.o
(跟踪点在lockdep.c
中无条件定义。
根据https://www.kernel.org/doc/Documentation/trace/tracepoints.txt,所有跟踪点都仅限于内核,因此perf lock
不会分析用户空间锁。
您可以尝试来自 LTTng 的跟踪点,该项目声明了用户空间跟踪点 (http://lttng.org/ust)。但是不会有现成的锁统计信息,只有关于跟踪点的原始数据。此外,您应该使用tracef()
宏定义跟踪点(重新编译 pthreads/glibc,或尝试围绕 pthread 创建自己的包装器)。
【讨论】:
"tracepoints are kernel-only",但是有一些 uprobes 需要用 perf 来分析 - brendangregg.com/blog/2015-06-28/linux-ftrace-uprobe.html 和 kernel.org/doc/html/v4.17/trace/uprobetracer.html【参考方案2】:没有。但也许你需要的可以通过记录 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 上查看更多信息。
【讨论】:
以上是关于perf 是不是锁定配置文件用户空间互斥锁?的主要内容,如果未能解决你的问题,请参考以下文章