第74期 | 十个进程,算一个人的账
第六章第九期。前面几期排了队、算了账、讲了堵车、插队和截止期,这一期问一个藏在"公平"底下的问题:公平,到底分给谁?是分给每一个进程,还是分给每一个"人"?一台机器上,一个人在编译内核,开了十个并行任务;另一个人在放视频,只有一个进程。按人头分,前者拿走十分之十一,后者卡成幻灯片。按人分,一人一半。这两种分法,账都算对了,世界却不一样。
一、先分组,再分时间
CFS 的账本一开始是按任务记的:每个任务一个 vruntime,账上最欠的先跑。这套账在单任务对单任务时很漂亮,一遇到"一个人开一堆任务"的场面就露了馅——任务数多的一方,天然占便宜。这不是算错了,是分的单位错了。
2010 年底递到社区、随 Linux 2.6.38 合进主线的一组补丁,改的就是这个单位,叫 autogroup¹。规则简单得像一句日常判断:一个会话,就是一组。setsid() 创建新会话时,一个新的 autogroup 随之诞生,比如新开一个终端窗口;fork 出来的子进程继承父进程的组;组里最后一个进程退出,组自动消失¹。开关在 /proc/sys/kernel/sched_autogroup_enabled,默认是 1¹。
分法于是变成两层:组间先平分,组内再按权重分。man 手册里举的例子就是上面那一幕:make -j10 的十个编译进程是一组,视频播放器是一个进程、另一组,两个组各拿一半 CPU——播放器不再是十分之一,而是一半;十个编译进程平分剩下的一半,每人 5%¹。编译没有停,只是慢下来;视频没有特权,只是没被人数淹没。
这里有个平时看不见的代价。按组分,对"人"公平了,对"活"却未必:一个会话里跑着几十个 worker 的批量任务,会被一个单进程会话压到同等份额——吞吐量让位于体感。公平没有免费的定义,每一次改单位,都是在"谁受益、谁买单"之间重新划线。组调度本身早就有,cgroup 里手动建组、配 cpu.shares 也能做到;autogroup 的妙处不在新算法,在于不用人动手:会话一开,组就有了。像书法里先定间架再布字,格子定对了,字才站得住。
二、先按会话分,再按任务分
如果 AI 的操作系统先出现,它的调度单位一开始就不会是进程。Agent 干活的方式,天然就是"一个人开一堆任务":一个意图派生出二十个子 agent 去查资料、跑工具、互相校验。按进程分账,这个意图能拿走二十倍份额,把屏幕前等回答的人挤到墙角。按意图分账,才是这台机器该有的公平:一个意图就是一个组,组内二十个子任务平分这个意图的份额。
Brooks 1987 年那篇《没有银弹》正好量这件事²:他把困难分成"本质"与"偶然"——概念构造本身的难度是本质,表示与工具带来的摩擦是偶然。vruntime 怎么算、红黑树怎么排,那是偶然层面的手艺;"公平分给谁",是概念层面的问题,换了单位,整个系统的性情就变了。autogroup 没有发明新算法,它只改了一个概念:被公平对待的单位,从进程换成了会话。
向量阵列时代,这道题还多一层。CFS 的账本只记 CPU 时间,一个意图派生的子任务如果在 GPU 上排队占显存、占 KV 缓存,那笔账根本不在本子上。原生系统里,意图的预算得是立体的:CPU 时间、显存占用、带宽、截止期,合在一起才算一个意图的份额。只按进程数分时间,是线性时代的账法;按意图分立体资源,才是向量时代的账法。
三、开两个终端,对比着看
今晚就能试的一步,先看自己机器上的开关和分组:
cat /proc/sys/kernel/sched_autogroup_enabled
cat /proc/$$/autogroup
第一行是 1,说明 autogroup 开着;第二行会印出当前 shell 所在的组。再开一个新会话看分组换没换:
setsid bash -c 'cat /proc/$$/autogroup'
新会话的组号和原来不一样——组不是配出来的,是会话一开就自动有的。组号变了,分组的存在就被亲眼看见了。
再往前一步,可以绑在一颗 CPU 上对比:一个会话里起十个忙循环,另一个会话里起一个忙循环,用 ps 看 %CPU 的分布。autogroup 开着时,两边的份额会向"组间平分"靠拢,而不是十比一。要注意一个时代差:今天很多发行版上,服务与终端由 systemd 各自放进不同的 scope,分组逻辑换了地方,结果可能不像 2010 年的手册例子那么干净——如果测出来不是五五开,先看进程所在的 cgroup,再下结论。测出"不一样",本身就是一条信息:分组的权力从内核的会话组,挪到了更上层的编排手里。
落到普遍场景里,同一条规则直接能套:一台跑本地模型的机器上,在线问答是一个意图、批量评测是另一个意图,两个意图各拿一份预算,评测开再多并发也不能把问答挤走;一台边缘算力盒上,控制环的意图和日志整理的意图分属两组,控制环的份额不被日志的进程数淹没;视频 AI 平台里一路视频的推理任务再多,也只占这一路的组份额;企业私有智能中心里一个 agent 的二十个子任务共享这个 agent 的预算,而不是二十倍的预算。先定组,再谈分。
觉 然 小 注
公平先问分给谁,再问怎么分。单位定错了,账算得再精,也是错的账。
引 用 与 出 处
- [1] Linux man-pages 项目. sched(7) — CPU 调度概述. Linux man-pages. https://manpages.debian.org/unstable/manpages/sched.7.en.html
- [2] Frederick P. Brooks Jr. No Silver Bullet: Essence and Accidents of Software Engineering. Computer, 1987. https://doi.org/10.1109/MC.1987.1663532
· · ·