我一直在尝试在 perf 上启用上下文切换事件,并使用 perf 脚本的 perf.data 转储来调查线程阻塞时间。
到目前为止,唯一两个似乎有用的记录选项是上下文切换和所有计划事件。
这是我在 perf 上运行的命令:
perf record -g -a -F 999 -e cpu-clock,sched:sched_stat_sleep,sched:sched_switch,sched:sched_process_exit,context-switches
Run Code Online (Sandbox Code Playgroud)
然而,两者似乎都不完整,通常 sched_switch 事件看起来像这样:
comm1 0/0 [000] 0.0: 1 sched:sched_switch: prev_comm=comm1 prev_pid=0 prev_prio=0 prev_state=S ==> next_comm=comm2 next_pid=1 next_prio=1
stacktrace...
Run Code Online (Sandbox Code Playgroud)
根据我的理解,prev_comm始终是要被阻塞的线程,而next_comm是要被解除阻塞的线程。这是一个正确的假设吗?如果是,我似乎无法获得有关事件的完整数据,因为有许多线程在 prev_comm 上被阻止,但似乎从未获得相应的 next_comm。
启用上下文切换似乎没有多大作用,因为没有有关线程被阻塞或解除阻塞的信息(除非我完全遗漏了一些东西,我希望能解释它们如何工作)。
典型的上下文切换事件如下所示:
comm1 0/0 [000] 0.0: 1 context-switch:
stacktrace...
Run Code Online (Sandbox Code Playgroud)
tl;dr,如何通过 perf 脚本的输出在 Linux 上进行阻塞时间调查以及需要在 perf 记录上启用哪些选项?
谢谢。