如何分析 perf sched script 和 perf sched latency?
How to analyze perf sched script and perf sched latency?
我用perf sched record记录了一些东西
我从 perf sched script[=11= 得到了一些 context switch 事件]
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 时间不同?
字符R/T/S/D
代表各种任务状态。
字符'R'表示任务处于TASK_RUNNING状态。字符'S'表示任务已经进入TASK_INTERRUPTIBLE状态。字符 'D' 表示任务已被调度程序置于 TASK_UNINTERRUPTIBLE 状态。最后字符'T'表示任务当前处于TASK_STOPPED状态。要了解如何根据字符确定任务状态,请查看 linux 内核 (4.17) 源代码:-
#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 record记录了一些东西
我从 perf sched script[=11= 得到了一些 context switch 事件]
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 时间不同?
字符R/T/S/D
代表各种任务状态。
字符'R'表示任务处于TASK_RUNNING状态。字符'S'表示任务已经进入TASK_INTERRUPTIBLE状态。字符 'D' 表示任务已被调度程序置于 TASK_UNINTERRUPTIBLE 状态。最后字符'T'表示任务当前处于TASK_STOPPED状态。要了解如何根据字符确定任务状态,请查看 linux 内核 (4.17) 源代码:-
#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
命令的所有调度程序事件。
这两个命令有很大的不同,任何直接比较都必然会得出错误的结论。