10

摘要:是否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_LOCKDEPor编译CONFIG_LOCK_STAT

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

4

2 回答 2

5

摘要:性能是否锁定配置文件 pthread_mutex?

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

根据源文件tools/perf/builtin-lock.c( http://lxr.free-electrons.com/source/tools/perf/builtin-lock.c#L939 )cmd_lock调用 ,它为(via )__cmd_record定义了几个跟踪点,并将选项传递给. 定义的跟踪点列表::perf record-e TRACEPOINT_NAME-R -m 1024 -c 1perf reportlock_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: 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 创建自己的包装器)。

于 2014-04-08T01:45:16.703 回答
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上查看更多信息。

于 2018-11-12T19:29:27.687 回答