1d29360ffSTang Yizhou.. SPDX-License-Identifier: GPL-2.0
2d29360ffSTang Yizhou.. include:: ../disclaimer-zh_CN.rst
3d29360ffSTang Yizhou
4d29360ffSTang Yizhou:Original: Documentation/scheduler/sched-stats.rst
5d29360ffSTang Yizhou
6d29360ffSTang Yizhou:翻译:
7d29360ffSTang Yizhou
8d29360ffSTang Yizhou  唐艺舟 Tang Yizhou <tangyeechou@gmail.com>
9d29360ffSTang Yizhou
10d29360ffSTang Yizhou==============
11d29360ffSTang Yizhou调度器统计数据
12d29360ffSTang Yizhou==============
13d29360ffSTang Yizhou
14d29360ffSTang Yizhou第15版schedstats去掉了sched_yield的一些计数器:yld_exp_empty,yld_act_empty
15d29360ffSTang Yizhou和yld_both_empty。在其它方面和第14版完全相同。
16d29360ffSTang Yizhou
17d29360ffSTang Yizhou第14版schedstats包括对sched_domains(译注:调度域)的支持,该特性进入内核
18d29360ffSTang Yizhou主线2.6.20,不过这一版schedstats与2.6.13-2.6.19内核的版本12的统计数据是完全
19d29360ffSTang Yizhou相同的(内核未发布第13版)。有些计数器按每个运行队列统计是更有意义的,其它则
20d29360ffSTang Yizhou按每个调度域统计是更有意义的。注意,调度域(以及它们的附属信息)仅在开启
21d29360ffSTang YizhouCONFIG_SMP的机器上是相关的和可用的。
22d29360ffSTang Yizhou
23d29360ffSTang Yizhou在第14版schedstat中,每个被列出的CPU至少会有一级域统计数据,且很可能有一个
24d29360ffSTang Yizhou以上的域。在这个实现中,域没有特别的名字,但是编号最高的域通常在机器上所有的
25d29360ffSTang YizhouCPU上仲裁平衡,而domain0是最紧密聚焦的域,有时仅在一对CPU之间进行平衡。此时,
26d29360ffSTang Yizhou没有任何体系结构需要3层以上的域。域统计数据中的第一个字段是一个位图,表明哪些
27d29360ffSTang YizhouCPU受该域的影响。
28d29360ffSTang Yizhou
29d29360ffSTang Yizhou这些字段是计数器,而且只能递增。使用这些字段的程序将需要从基线观测开始,然后在
30d29360ffSTang Yizhou后续每一个观测中计算出计数器的变化。一个能以这种方式处理其中很多字段的perl脚本
31d29360ffSTang Yizhou可见
32d29360ffSTang Yizhou
33d29360ffSTang Yizhou    http://eaglet.pdxhosts.com/rick/linux/schedstat/
34d29360ffSTang Yizhou
35d29360ffSTang Yizhou请注意,任何这样的脚本都必须是特定于版本的,改变版本的主要原因是输出格式的变化。
36d29360ffSTang Yizhou对于那些希望编写自己的脚本的人,可以参考这里描述的各个字段。
37d29360ffSTang Yizhou
38d29360ffSTang YizhouCPU统计数据
39d29360ffSTang Yizhou-----------
40d29360ffSTang Yizhoucpu<N> 1 2 3 4 5 6 7 8 9
41d29360ffSTang Yizhou
42d29360ffSTang Yizhou第一个字段是sched_yield()的统计数据:
43d29360ffSTang Yizhou
44d29360ffSTang Yizhou     1) sched_yield()被调用了#次
45d29360ffSTang Yizhou
46d29360ffSTang Yizhou接下来的三个是schedule()的统计数据:
47d29360ffSTang Yizhou
48d29360ffSTang Yizhou     2) 这个字段是一个过时的数组过期计数,在O(1)调度器中使用。为了ABI兼容性,
49d29360ffSTang Yizhou	我们保留了它,但它总是被设置为0。
50d29360ffSTang Yizhou     3) schedule()被调用了#次
51d29360ffSTang Yizhou     4) 调用schedule()导致处理器变为空闲了#次
52d29360ffSTang Yizhou
53d29360ffSTang Yizhou接下来的两个是try_to_wake_up()的统计数据:
54d29360ffSTang Yizhou
55d29360ffSTang Yizhou     5) try_to_wake_up()被调用了#次
56d29360ffSTang Yizhou     6) 调用try_to_wake_up()导致本地CPU被唤醒了#次
57d29360ffSTang Yizhou
58d29360ffSTang Yizhou接下来的三个统计数据描述了调度延迟:
59d29360ffSTang Yizhou
60*4116ff79SYanteng Si     7) 本处理器运行任务的总时间,单位是纳秒
61*4116ff79SYanteng Si     8) 本处理器任务等待运行的时间,单位是纳秒
62d29360ffSTang Yizhou     9) 本CPU运行了#个时间片
63d29360ffSTang Yizhou
64d29360ffSTang Yizhou域统计数据
65d29360ffSTang Yizhou----------
66d29360ffSTang Yizhou
67d29360ffSTang Yizhou对于每个被描述的CPU,和它相关的每一个调度域均会产生下面一行数据(注意,如果
68d29360ffSTang YizhouCONFIG_SMP没有被定义,那么*没有*调度域被使用,这些行不会出现在输出中)。
69d29360ffSTang Yizhou
70d29360ffSTang Yizhoudomain<N> <cpumask> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
71d29360ffSTang Yizhou
72d29360ffSTang Yizhou第一个字段是一个位掩码,表明该域在操作哪些CPU。
73d29360ffSTang Yizhou
74d29360ffSTang Yizhou接下来的24个字段是load_balance()函数的各个统计数据,按空闲类型分组(空闲,
75d29360ffSTang Yizhou繁忙,新空闲):
76d29360ffSTang Yizhou
77d29360ffSTang Yizhou
78d29360ffSTang Yizhou    1)  当CPU空闲时,load_balance()在这个调度域中被调用了#次
79d29360ffSTang Yizhou    2)  当CPU空闲时,load_balance()在这个调度域中被调用,但是发现负载无需
80d29360ffSTang Yizhou        均衡#次
81d29360ffSTang Yizhou    3)  当CPU空闲时,load_balance()在这个调度域中被调用,试图迁移1个或更多
82d29360ffSTang Yizhou        任务且失败了#次
83d29360ffSTang Yizhou    4)  当CPU空闲时,load_balance()在这个调度域中被调用,发现不均衡(如果有)
84d29360ffSTang Yizhou        #次
85d29360ffSTang Yizhou    5)  当CPU空闲时,pull_task()在这个调度域中被调用#次
86d29360ffSTang Yizhou    6)  当CPU空闲时,尽管目标任务是热缓存状态,pull_task()依然被调用#次
87d29360ffSTang Yizhou    7)  当CPU空闲时,load_balance()在这个调度域中被调用,未能找到更繁忙的
88d29360ffSTang Yizhou        队列#次
89d29360ffSTang Yizhou    8)  当CPU空闲时,在调度域中找到了更繁忙的队列,但未找到更繁忙的调度组
90d29360ffSTang Yizhou        #次
91d29360ffSTang Yizhou    9)  当CPU繁忙时,load_balance()在这个调度域中被调用了#次
92d29360ffSTang Yizhou    10) 当CPU繁忙时,load_balance()在这个调度域中被调用,但是发现负载无需
93d29360ffSTang Yizhou        均衡#次
94d29360ffSTang Yizhou    11) 当CPU繁忙时,load_balance()在这个调度域中被调用,试图迁移1个或更多
95d29360ffSTang Yizhou        任务且失败了#次
96d29360ffSTang Yizhou    12) 当CPU繁忙时,load_balance()在这个调度域中被调用,发现不均衡(如果有)
97d29360ffSTang Yizhou        #次
98d29360ffSTang Yizhou    13) 当CPU繁忙时,pull_task()在这个调度域中被调用#次
99d29360ffSTang Yizhou    14) 当CPU繁忙时,尽管目标任务是热缓存状态,pull_task()依然被调用#次
100d29360ffSTang Yizhou    15) 当CPU繁忙时,load_balance()在这个调度域中被调用,未能找到更繁忙的
101d29360ffSTang Yizhou        队列#次
102d29360ffSTang Yizhou    16) 当CPU繁忙时,在调度域中找到了更繁忙的队列,但未找到更繁忙的调度组
103d29360ffSTang Yizhou        #次
104d29360ffSTang Yizhou    17) 当CPU新空闲时,load_balance()在这个调度域中被调用了#次
105d29360ffSTang Yizhou    18) 当CPU新空闲时,load_balance()在这个调度域中被调用,但是发现负载无需
106d29360ffSTang Yizhou        均衡#次
107d29360ffSTang Yizhou    19) 当CPU新空闲时,load_balance()在这个调度域中被调用,试图迁移1个或更多
108d29360ffSTang Yizhou        任务且失败了#次
109d29360ffSTang Yizhou    20) 当CPU新空闲时,load_balance()在这个调度域中被调用,发现不均衡(如果有)
110d29360ffSTang Yizhou        #次
111d29360ffSTang Yizhou    21) 当CPU新空闲时,pull_task()在这个调度域中被调用#次
112d29360ffSTang Yizhou    22) 当CPU新空闲时,尽管目标任务是热缓存状态,pull_task()依然被调用#次
113d29360ffSTang Yizhou    23) 当CPU新空闲时,load_balance()在这个调度域中被调用,未能找到更繁忙的
114d29360ffSTang Yizhou        队列#次
115d29360ffSTang Yizhou    24) 当CPU新空闲时,在调度域中找到了更繁忙的队列,但未找到更繁忙的调度组
116d29360ffSTang Yizhou        #次
117d29360ffSTang Yizhou
118d29360ffSTang Yizhou接下来的3个字段是active_load_balance()函数的各个统计数据:
119d29360ffSTang Yizhou
120d29360ffSTang Yizhou    25) active_load_balance()被调用了#次
121d29360ffSTang Yizhou    26) active_load_balance()被调用,试图迁移1个或更多任务且失败了#次
122d29360ffSTang Yizhou    27) active_load_balance()被调用,成功迁移了#次任务
123d29360ffSTang Yizhou
124d29360ffSTang Yizhou接下来的3个字段是sched_balance_exec()函数的各个统计数据:
125d29360ffSTang Yizhou
126d29360ffSTang Yizhou    28) sbe_cnt不再被使用
127d29360ffSTang Yizhou    29) sbe_balanced不再被使用
128d29360ffSTang Yizhou    30) sbe_pushed不再被使用
129d29360ffSTang Yizhou
130d29360ffSTang Yizhou接下来的3个字段是sched_balance_fork()函数的各个统计数据:
131d29360ffSTang Yizhou
132d29360ffSTang Yizhou    31) sbf_cnt不再被使用
133d29360ffSTang Yizhou    32) sbf_balanced不再被使用
134d29360ffSTang Yizhou    33) sbf_pushed不再被使用
135d29360ffSTang Yizhou
136d29360ffSTang Yizhou接下来的3个字段是try_to_wake_up()函数的各个统计数据:
137d29360ffSTang Yizhou
138d29360ffSTang Yizhou    34) 在这个调度域中调用try_to_wake_up()唤醒任务时,任务在调度域中一个
139d29360ffSTang Yizhou        和上次运行不同的新CPU上运行了#次
140d29360ffSTang Yizhou    35) 在这个调度域中调用try_to_wake_up()唤醒任务时,任务被迁移到发生唤醒
141d29360ffSTang Yizhou        的CPU次数为#,因为该任务在原CPU是冷缓存状态
142d29360ffSTang Yizhou    36) 在这个调度域中调用try_to_wake_up()唤醒任务时,引发被动负载均衡#次
143d29360ffSTang Yizhou
144d29360ffSTang Yizhou/proc/<pid>/schedstat
145d29360ffSTang Yizhou---------------------
146d29360ffSTang Yizhouschedstats还添加了一个新的/proc/<pid>/schedstat文件,来提供一些进程级的
147d29360ffSTang Yizhou相同信息。这个文件中,有三个字段与该进程相关:
148d29360ffSTang Yizhou
149*4116ff79SYanteng Si     1) 在CPU上运行花费的时间(单位是纳秒)
150*4116ff79SYanteng Si     2) 在运行队列上等待的时间(单位是纳秒)
151d29360ffSTang Yizhou     3) 在CPU上运行了#个时间片
152d29360ffSTang Yizhou
153d29360ffSTang Yizhou可以很容易地编写一个程序,利用这些额外的字段来报告一个特定的进程或一组进程在
154d29360ffSTang Yizhou调度器策略下的表现如何。这样的程序的一个简单版本可在下面的链接找到
155d29360ffSTang Yizhou
156d29360ffSTang Yizhou    http://eaglet.pdxhosts.com/rick/linux/schedstat/v12/latency.c
157