首页/系统/Linux 内核与性能调优速查/sched_debug 调度器视图
CPU 与调度60 条

sched_debug 调度器视图

/proc/sched_debug 展示每 CPU 运行队列、当前任务、负载与调度域,用于确认绑核、隔离与负载分布是否按预期生效。

文件是什么

/proc/sched_debug 把调度器的内部视图以文本形式导出:每个 CPU 的运行队列(rq)及其负载、当前运行任务、就绪任务列表,还有调度域与缓存域的结构和统计计数。它最实用的地方是验证「绑核或隔离是否真的生效」——例如 taskset 之后任务是否只出现在目标核的队列里、被隔离的核上是否还有外来任务在跑。文件内容随内核版本变化,属于调试视图而非稳定接口。

基本信息

读取方式cat /proc/sched_debug,一般普通用户可读
内核前提CONFIG_SCHED_DEBUG=y(部分发行版默认开启)
容器内常被权限或命名空间限制,看到的内容可能是宿主视图
关注片段cpu#N 段中的 nr_running、curr、load 与调度域段
配套文件/proc/schedstat、/proc/<pid>/sched、/proc/loadavg
采集开销每次读取生成大量文本,有可观开销

典型使用场景

  • 验证 taskset/tuna 绑核结果:目标核的 rq 中是否出现指定任务
  • 验证 isolcpus/nohz_full 隔离效果:被隔离核的队列是否保持干净
  • 观察负载分布:比较各 CPU 的 nr_running,判断是否出现单核堆积
  • 了解调度域与缓存域划分,为 NUMA 感知的进程布局提供依据
  • 配合 schedstat 判断唤醒与迁移计数是否异常,缩小调度问题范围

查看方式

查看方式
grep -m1 -A8 'cpu#0' /proc/sched_debug  # 只看 CPU0 段的前几行,避免刷屏
awk '/^cpu#/{print} /nr_running|curr/{print}' /proc/sched_debug | head -40  # 提取关键行
grep -c '^cpu#' /proc/sched_debug  # 确认导出段数与逻辑核数是否一致
cat /proc/schedstat  # 更紧凑的调度统计,适合做趋势对比
cat /proc/12345/sched  # 单任务视图:亲和掩码、累计运行时间与迁核次数
chrt -p 12345  # 顺带确认该任务的调度策略与优先级

关键片段读法

片段含义判读要点
cpu#N第 N 个 CPU 的运行队列与逻辑核数对齐,先确认段数
nr_running该队列上的就绪任务数持续大于 0 说明该核有排队
curr当前正在运行的任务可核对绑核是否按预期命中
loadCFS 队列的权重负载(内部量)不能与 uptime 的 load average 直接类比
domain 段调度域与缓存域拓扑用于解释负载均衡的范围与 NUMA 结构
输出里大量内部字段(se、cfs_rq、rt_rq 等)会随内核版本增删改名,按固定列位写解析脚本很容易在某次升级后静默失效。用它做一次性诊断、人工核对,比接进监控更稳妥。
读取该文件时内核需要遍历并生成调度器状态文本,核数多的机器输出可达数百 KB。诊断慢查询类问题时不要高频循环采集,避免观测行为本身干扰被测系统。

易错点

  • 把 rq 里的 load 与 uptime 的 load average 当作同一指标:前者是权重口径的内部量,后者混合了运行与不可中断任务,结论会完全失真
  • 高频采集:文件生成开销不小,密集读取会污染性能观测结果
  • 在容器里下结论:容器内可能读不到或读到宿主视图,报告问题时应写清观察视角
  • 依赖固定格式写监控脚本:内核升级后字段改名或层级变化,脚本静默失效且不报错
  • 把它当稳定 ABI 用于生产判定:该文件是调试接口,不能作为长期依赖的判定依据

数据来源与参考

  • Linux 内核 Documentation/scheduler/
  • Linux 内核源码 kernel/sched/debug.c
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌