持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情
Linux内核为开发者提供了丰富的进程调度信息,这些调度信息都需要在内核配置时打开CONFIG_SCHED_DEBUG选项。
查看与进程相关的调度信息
有时候我们需要查看进程相关的调度信息,如进程的nice值、优先级、调度策略、vruntime以及量化计算能力等信息。在Linux的proc目录中,为每个进程提供一个独立的目录,该目录包含了与进程相关的信息。图所示为ID为560的进程的proc目录。
在进程proc目录里,看到和进程调度相关的节点为sched,读者可以使用cat命令来读取这个节点的信息,如图
我们可以得到很多有用的信息,这些信息是在proc_sched_show_task()函数中输出的,该函数实现在kernel/sched/debug.c文件中。这些信息如下。 进程的名称为systemd,ID是560,线程有1个。 进程的优先级为120。 进程的调度策略是SCHED_NORMAL,使用的调度类是CFS调度类(fair_sched_class)。 当前进程的虚拟时间(vruntime)是176.812354ms。总运行时间为631.815280ms。 进程发生过3次迁移,61次进程上下文切换,其中主动调度有18次,被抢占调度有43次。 进程的权重se.load.weight和se.runnable_weight相等,都是1048576。注意,这两个值均为原本的权重值乘以1024。进程优先级为120,nice值为0,它原本的权重值为1024。 当前时刻,进程的se.avg.load_sum值和se.avg.runnable_load_sum相等,都是39064。 进程的se.avg.load_avg和se.avg.runnable_load_avg是相等的,都是851。对于该进程来说,它的量化负载的最大值就等于它的权重值,即1024,这是在100%占用CPU的情况下得到的。 进程的量化计算能力(se.avg.util_avg)为832。
Linux内核还提供一个与调度信息相关的数据结构sched_statistics,其中包含了非常多和调度相关的统计信息。要查看这些统计信息,需要打开CONFIG_SCHEDSTATS配置选项。另外,还需要打开sched_schedstats节点。
echo 1 > /proc/sys/kernel/sched_schedstats
查看CFS的信息
Linux内核在调度方面实现了一些调试接口,为开发者提供窥探调度器内部信息的接口。在proc目录下面有一个sched_debug节点
显示了如下信息。 Sched调试信息的版本号:v0.11。 Linux内核版本号:5.0.0。 内核时间(ktime)的值。 sched_clock和cpu_clk的值。 当前jiffies的值。 和调度相关的sysctl_sched的值。
查看调度域信息
在理解SMP负载均衡机制的过程中,CPU的拓扑关系是一个难点。Linux内核新增了一个调试节点来帮助开发者理解(详见kernel/sched/topology.c文件)。在编译内核时,不仅需要打开CONFIG_SCHED_DEBUG选项,还需要在内核启动参数里传递sched_debug参数。 在内核启动之后,可以通过dmesg命令来得到CPU拓扑关系
可以看出,该系统只有MC层级,从CPU0角度看,它对应的调度域是domain-0,管辖的范围是CPU[0~3],调度层级是MC。同理,可以得出CPU1、CPU2以及CPU3的CPU拓扑关系。