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_LOCKDEPCONFIG_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 是不是锁定配置文件用户空间互斥锁?的主要内容,如果未能解决你的问题,请参考以下文章

项目启动的时候就会把oracle用户锁了,报错提示账户被锁定,如何看出是哪里导致了oracle用户被锁定?

提升进程间互斥锁崩溃而不是等待锁定?

在同一个互斥锁上的锁定和解锁顺序是不是一致?

如果我想制作分布式互斥库,我是不是必须创建一个线程?

如何制作 Blazor 页面互斥锁

PThread 强大的互斥锁不起作用