Fork me on GitHub
侧边栏

Linux scheduler statistic 翻译

原文网址:

https://www.kernel.org/doc/html/v6.6/scheduler/sched-stats.html

Scheduler Statistics

schedstats的第15版移除了部分sched_yield相关的计数器:yld_exp_empty、yld_act_empty和yld_both_empty。除此之外,其内容与第14版完全一致。

schedstats的第14版增加了对sched_domains的支持,该功能在2.6.20版本的主线内核中被引入,但其统计信息与第12版相同(第12版存在于2.6.13至2.6.19的内核中,而第13版从未正式发布)。部分计数器更适合按运行队列统计,而另一些则更适合按调度域统计。需要注意的是,调度域(及其相关信息)仅在启用CONFIG_SMP配置的机器上有效且可用。

在schedstat的第14版中,每个列出的CPU至少包含一个层级的域统计信息,且可能存在多个域。在此实现中,域没有特定的名称,但编号最高的域通常负责协调整个机器上所有CPU的负载均衡,而domain0是最紧密的域,有时仅在成对的CPU之间进行平衡。目前没有任何架构需要超过三个域层级。域统计信息中的第一个字段是一个位图,用于指示哪些CPU受该域的影响。

这些字段均为计数器,其值只会递增。使用这些计数器的程序需要先获取一个基准观测值,然后在每次后续观测时计算计数器的变化量。一个针对多数字段执行此操作的Perl脚本可在以下地址获取:

http://eaglet.pdxhosts.com/rick/linux/schedstat/

需要注意的是,此类脚本必然与特定版本相关,因为版本变更的主要原因正是输出格式的改变。对于希望自行编写脚本的用户,此处对各字段进行了详细说明。

CPU statistic

字段说明(每一列对应的含义)

对于 cpu<N> 1 2 3 4 5 6 7 8 9 这一行,字段含义如下:

  1. sched_yield() 调用次数
    (“calling sched_yield() 的次数”)
  2. 遗留字段(总是为 0)
    在早期 O(1) 调度器中用于记录某种 “array expiration count”(数组过期计数),现已保留仅为 ABI 兼容,实际始终为 0。
  3. schedule() 调用次数
    调用 schedule() 函数的次数。
  4. schedule() 导致 CPU 空闲的次数
    schedule() 被调用时,CPU 变为空闲状态的次数。
  5. try_to_wake_up() 调用次数
    尝试唤醒任务的调用次数。
  6. 尝试唤醒本地 CPU 的次数
    try_to_wake_up() 用于唤醒当前 CPU 的次数。
  7. 任务在该 CPU 上运行的总时间(纳秒)
    所有任务在此 CPU 上运行所花费时间总和,以纳秒计。
  8. 任务在该 CPU 上等待运行的总时间(纳秒)
    所有任务在此 CPU 的运行队列上等待所花费时间总和,以纳秒计。
  9. 该 CPU 上运行的时间片次数
    任务在该 CPU 上被调度运行的次数。

域统计(Domain statistics)

对于每个 CPU,每个调度域(domain)都会产生一行统计信息。仅启用了 CONFIG_SMP 的多核系统才会出现这些行 Linux Kernel 文档内核.org

格式如下:

domain<N> <cpumask> 1 2 … 24 25 … 33 34 … 36
  • <cpumask>:第一项,是一个位掩码,表示该域涉及哪些 CPU。

其后的统计字段可以按以下分类翻译说明:

A. 关于 load_balance() 的统计(根据 CPU 空闲状态分为三组:Idle、Busy、Just-Becoming-Idle)

类型 字段编号 中文说明
Idle(CPU 空闲) 1 load_balance() 在该域被调用时 CPU 处于空闲状态的次数
2 检查时发现负载无需平衡的次数(空闲)
3 尝试移动任务但失败的次数(空闲)
4 每次调用 load_balance() 时发现的不平衡之和(空闲)
5 pull_task() 被调用的次数(空闲)
6 即使目标任务缓存依然热时仍调用 pull_task() 的次数(空闲)
7 load_balance() 被调用但未找到更繁忙队列的次数(空闲)
8 找到更忙队列但未找到更忙组时的次数(空闲)
Busy(CPU 繁忙) 9–16 与 Idle 类似,对应 CPU 繁忙状态下的相同统计项
Just-Becoming-Idle(刚变为空闲) 17–24 对应 CPU 刚变为空闲时的统计项,与上述类似的意义

B. active_load_balance() 统计(接在上述之后,字段 25–27)

  • 25active_load_balance() 被调用的次数
  • 26:调用后尝试移动任务失败的次数
  • 27:调用后成功移动任务的次数

C. sched_balance_exec() 统计(字段 28–30,未使用)

  • 28sbe_cnt(不使用)
  • 29sbe_balanced(不使用)
  • 30sbe_pushed(不使用)

D. sched_balance_fork() 统计(字段 31–33,未使用)

  • 31sbf_cnt(不使用)
  • 32sbf_balanced(不使用)
  • 33sbf_pushed(不使用)

E. try_to_wake_up() 统计(字段 34–36)

  • 34:唤醒任务运行在该域中其他不同 CPU 上的次数
  • 35:尝试唤醒任务,但因其在原 CPU 缓存已冷,就转到了唤醒的 CPU 上的次数
  • 36:启动被动负载平衡(passive balancing)的次数

/proc/<pid>/schedstat:每进程级别的调度统计

该文件提供了与系统级类似的统计,但针对单个进程。它包含三个字段(字段之间以空格分隔):

  1. 进程在 CPU 上运行的总时间(纳秒)
  2. 进程在运行队列上等待的总时间(纳秒)
  3. 该进程运行的时间片次数

这些数据可以用于分析某一个进程在调度器策略下的表现和行为趋势

posted @ 2025-08-30 15:16  yooooooo  阅读(21)  评论(0)    收藏  举报