来自:https://lwn.net/Articles/837786/
内核中定义了一个 struct sched_statistics 数据结构专门用于记录任务调度相关的信息以便于开发人员进行系统的调试和优化。
这些信息包括多项非常有用的信息,例如一个线程iowait等待的次数、iowait等待的时间、sleep的时间等等挂机数据。
一旦系统使能 CONFIG_SCHEDSTATS=y,这些数据将会在关键的位置被收集到该结构体中,并导出到用户态/proc/pid/sched接口中;同时开启这个配置选项还增加了一些trace point以供调试。
例如一个典型的场景是:
有一个文件操作线程,该任务承担着部分关键文件的校验操作。一旦文件校验请求发起给到该线程, 校验线程将会被唤醒,开始进行校验工作。
发起校验请求的任务会等待校验线程返回结果。这个等待时间有一个阈值,超过这个阈值则会超期影响整个系统业务性能。
如果发现有检验偶现超期的情况,我们就可以设置一个定时监控器,通过/proc/pid/sched提供的调度信息来定时收集该线程的调度情况,并根据校验发生的时间以及结束的时间来判断校验线程是被抢占,还是因为IO阻塞导致超期。
然而,遗憾的是即使使能CONFIG_SCHEDSTATS=y配置目前的内核也只能够为普通任务(CFS调度类)提供调度信息, 而实时任务则没有提供。
从从内核当前的实现原理上来说,用于收集任务调度信息的数据结构struct sched_statistics只被内嵌到了普通任务调度实体struct sched_entity 结构中,且只在CFS调度类中才会做对应的收集。而且iowait、wait等trace point也仅仅在普通调度(CFS)才有实现。
对于上面的典型案例,如果校验线程是实时任务,CONFIG_SCHEDSTATS实际上是无法为开发和调试任务提供校验线程有效的调度信息。
为此,Yafang Shao在 https://lkml.org/lkml/2020/11/18/1176 系列补丁中给出了CONFIG_SCHEDSTATS对于RT调度类任务的支持。
目前该补丁暂时没有入主分支,但是从邮件列表讨论来看入主分支应该只是时间问题, 而对于deadline调度作者也有打算支持,不过时间可能要更晚一些.