文件是什么
/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 | 当前正在运行的任务 | 可核对绑核是否按预期命中 |
| load | CFS 队列的权重负载(内部量) | 不能与 uptime 的 load average 直接类比 |
| domain 段 | 调度域与缓存域拓扑 | 用于解释负载均衡的范围与 NUMA 结构 |
输出里大量内部字段(se、cfs_rq、rt_rq 等)会随内核版本增删改名,按固定列位写解析脚本很容易在某次升级后静默失效。用它做一次性诊断、人工核对,比接进监控更稳妥。
读取该文件时内核需要遍历并生成调度器状态文本,核数多的机器输出可达数百 KB。诊断慢查询类问题时不要高频循环采集,避免观测行为本身干扰被测系统。