如何分析 perf sched 脚本和 perf sched 延迟?

Posted

技术标签:

【中文标题】如何分析 perf sched 脚本和 perf sched 延迟?【英文标题】:How to analyze perf sched script and perf sched latency? 【发布时间】:2018-06-08 13:45:07 【问题描述】:

我使用 perf sched record 来记录一些东西。

我从 perf sched 脚本

得到了一些 上下文切换 事件
filebench  2646 [000] 21159.177699:       sched:sched_switch: filebench:2646 [120] **R** ==> rcu_sched:8 [120]

filebench  2611 [000] 21159.172060:       sched:sched_switch: filebench:2611 [120] **T** ==> filebench:2645 [120]

filebench  2618 [000] 21159.193692:       sched:sched_switch: filebench:2618 [120] **S** ==> rcu_sched:8 [120]

filebench  2620 [000] 21159.193724:       sched:sched_switch: filebench:2620 [120] **D** ==> filebench:2628 [120]

字符 R/T/S/D 的意思是什么?

另一个问题: 为什么 perf sched 延迟和 perf sched 脚本的 cs 时间不同?

【问题讨论】:

抱歉我的格式不好.. 【参考方案1】:

字符R/T/S/D 代表各种任务状态。

字符“R”表示任务处于TASK_RUNNING状态。字符“S”表示任务已进入TASK_INTERRUPTIBLE 状态。字符“D”表示任务已被调度程序置于 TASK_UNINTERRUPTIBLE 状态。最后,字符“T”表示任务当前处于TASK_STOPPED状态。要了解如何从字符确定任务状态,请查看 linux 内核 (4.17) 源代码:-

TASK_STATE_TO_CHAR_STR macro

#define TASK_STATE_TO_CHAR_STR "RSDTtZXxKWP"

/* task state bitmask, copied from include/linux/sched.h */
#define TASK_RUNNING        0
#define TASK_INTERRUPTIBLE  1
#define TASK_UNINTERRUPTIBLE    2
#define __TASK_STOPPED      4
#define __TASK_TRACED       8
/* in tsk->exit_state */
#define EXIT_DEAD       16
#define EXIT_ZOMBIE     32
#define EXIT_TRACE      (EXIT_ZOMBIE | EXIT_DEAD)
/* in tsk->state again */
#define TASK_DEAD       64
#define TASK_WAKEKILL       128
#define TASK_WAKING     256
#define TASK_PARKED     512

这就像将第一个字符'R'引用到第一种任务状态一样简单——即TASK_RUNNING,第二个字符'S'引用TASK_INTERRUPTIBLE状态,类似地,第三个字符'D'引用到TASK_UNINTERRUPTIBLE ...继续下去,最后'W'指的是TASK_WAKING,'P'指的是TASK_PARKED。请注意,任务状态EXIT_TRACE 不对应于宏字符串TASK_STATE_TO_CHAR_STR 中的任何字符。

对于第二个问题,很难看出哪个输出代表perf sched latency,哪个输出代表perf sched script。也很难看出您是如何分析这两个输出的。您必须记住 perf sched latency 按任务汇总调度程序延迟。它向您显示每个任务的最大延迟是多少,它的运行时间是多少,以及在执行过程中除了一些其他细节之外有多少次上下文切换。另一方面,perf sched script 将转储类似于perf script 命令的所有调度程序事件。

这两个命令有很大的不同,任何直接比较都必然会得出错误的结论。

【讨论】:

非常感谢您的回答!我使用“perf sched script | grep 'sched:sched_switch: filebench' | wc -l” 来计算 filebench 的 cs 时间,并将其与 perf sched 延迟数据进行比较。那么 perf sched 脚本 cs 次包含多线程任务中的 cs 吗?而 perf sched 延迟只计算任务之间的 cs? 我还使用了相同的命令来计算 perf sched 脚本中单线程任务的 cs 次数。而且脚本和延迟之间的 cs 时间确实不同,而延迟仅计 1 个 cs。 已经提出了一个关于此的问题:here - 这也适用于您吗?基本上延迟是寻找唤醒事件来计算上下文切换的数量。

以上是关于如何分析 perf sched 脚本和 perf sched 延迟?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 perf 脚本将字符串参数显示为文本而不是指针值?

perf 分析进程

开发工具perf性能分析工具perf的编译和使用说明

开发工具perf性能分析工具perf的编译和使用说明

开发工具perf性能分析工具perf的编译和使用说明

开发工具perf性能分析工具perf的编译和使用说明