第77期 | 调度器,到底在算什么?
第六章第十二期。十一期下来,调度器算过时间、算过公平、算过电费、算过组账,账本越算越细。这一期收个尾,退后一步问:它到底在算什么?答案有点凉:调度器从没见过"活"本身。
一、调度器,到底在算什么?
从时间片到电费,账本换了四套。O(1) 时代算时间片:一百四十个优先级,每人一格;CFS 时代算 vruntime:谁欠的虚拟时间少,谁先跑;截止期调度算 deadline:谁的最后期限近,谁插队;EAS 时代算电费:放哪颗核上最省电。账本越换越精,但有一点始终没变——调度器排的,从来不是"这份活重要不重要",而是"这份活的代理量是多少"。时间片是代理,vruntime 是代理,功耗是代理,截止期也是代理。就像食堂打饭只认饭票,不认你饿不饿。
维纳在《控制论》里说,控制的本质是反馈回路:感知、比较、执行¹(思想化用)。调度器就是这么一台回路机器:感知利用率,比较 vruntime,执行"下一个是谁"。它算得越准,离"活"本身反而越远——因为它比较的那个量,从一开始就是人为立的刻度。
这里藏着本章最值得带走的一层:公平从来不是算出来的真理,是账本格式选定的结果。换一本账,"公平"就换一个样子。CFS 的公平是"虚拟时间拉平",EAS 的公平是"电费最省",截止期调度的公平是"谁都不误事"。问调度器公不公平之前,先问它拿的是哪本账。
二、意图,才是真正的账本
如果 AI 的操作系统先出现,排队的东西会再换一次。Agent 派出的二十个子任务、一次工具调用、一段正在生成的回答,都是可排实体;它们共享的不再是内存页,而是同一个目标和同一份上下文。调度器排的不再是"谁先上 CPU",而是"哪一份意图先拿到算力"。
账本的单位跟着换。时间片之外,意图进场时就该声明三件事:这份活值多少、等多久会过期、失败了能不能重排。没有这三本账,调度器只能把二十个子任务当二十个互不相干的排队者——一个用户,不声不响占了二十个号。
范式之眼再看一层:向量阵列时代,真正的稀缺物早已不是 CPU 时间,而是 Tensor Core 的占用、显存带宽、KV cache 占着的显存。调度器该按"一次算力占用申请"排队,账本从时间、能量,一路算到价值。谁受益、谁买单,也要跟着算清楚:今天的公平是"每个线程平分",受益的是会开线程的程序,买单的是后来者;意图调度里,买单的是意图的发起者——账算到人头上,才算清。
三、翻一翻调度器的账本
今晚就能试的一步。手边任何一台 Linux 机器,挑一个正在跑的进程,翻它的调度账本:
cat /proc/<进程号>/sched | grep -E "se.vruntime|sum_exec_runtime|nr_switches"
se.vruntime 是这份活的虚拟欠账²,sum_exec_runtime 是它实打实跑过的时间,nr_switches 是它被换上换下的次数。再开一个死循环占满一颗核:
while :; do :; done &
cat /proc/$!/sched | grep se.vruntime
隔几秒再看一次,vruntime 在涨——涨的,就是调度器眼里"这份活已经拿走的份额"。对比一个睡着的进程,它的 vruntime 几乎不动:没拿,就不欠。公平不是口号,是这串数字此消彼长的样子。
落到今天的机器上,同一本账直接能套。一台跑本地模型的机器上,推理任务的 vruntime 涨得快不快,决定了它会不会被批量任务挤到队尾;边缘小盒子上,控制环任务的 nr_switches 若异常高,说明它总在被打断;视频 AI 平台里一路视频的推理任务再多,也只花这一路的预算;企业私有智能中心里一个 agent 的二十个子任务,先在意图这一层分好账,再往线程层落。先看账本,再谈公平。
觉 然 小 注
鸠摩罗什译《金刚经》里有一句:"是法平等,无有高下。"³时间片、vruntime、电费、截止期,没有哪本账更高贵,各从其用。调度器十二期讲下来,账本会换,算账的动作不会换——看清自己拿的是哪本账,就是公平的开始。
引 用 与 出 处
- [1] Norbert Wiener. Cybernetics: Or Control and Communication in the Animal and the Machine. MIT Press, 1948(思想化用)
- [2] Linux 内核. /proc/<pid>/sched 调度统计接口(se.vruntime、se.sum_exec_runtime、nr_switches 字段,本机实测核对)
- [3] 鸠摩罗什译. 《金刚般若波罗蜜经》.
· · ·