第73期 | 截止期到了,谁都得让路

操作系统 · · 九羲科技

第六章第八期。前面几期排了队、算了账、讲了堵车和插队,这一期问一个更硬的问题:有些活不是"越快越好",而是"到点必须完"。音频一帧晚了会爆音,电机控制环晚了会抖,错过就是错过,跑得再快也补不回来。普通调度器只管公平,管不了"到点"。

一、截止期排队,不看谁官大

Linux 的调度分层,实时类站在普通类上面。普通任务走 CFS/EEVDF 讲公平,实时任务走另一套规矩:SCHED_FIFO 和 SCHED_RR 按 1 到 99 的静态优先级排队,99 最大;FIFO 同级先到先跑、跑到自己让出为止,RR 同级轮流分一小段。站在它们上面的,是 SCHED_DEADLINE¹。

DEADLINE 不看优先级,看截止期。每个任务进门时要交三张数字:每周期最多跑多久(runtime)、截止期(deadline)、周期(period)。内核按"最早截止期优先"(EDF)排队,截止期最近的先跑;再配一个"恒定带宽服务器"(CBS)看门:预算用完了就停下来,等下一个周期再续,防止一个任务把别人的份额也吃掉。内核还会算总账:所有 deadline 任务的带宽加起来超了机器的承载,新任务进不了门——不是先挤进来再说,而是门口就拒绝。

这里藏着一段漫长的工程史。EDF 的理论 1973 年就写进了 Liu 与 Layland 的论文²:固定优先级能保证的利用率上限约 69%,动态按截止期排可以到单核 100%。可理论进了内核,等了四十多年:第一版 2009 年以 SCHED_EDF 之名递到社区,改了名、改了接口、走了九版,2014 年才随 3.14 合进主线¹。这就是杨振宁说的中间层:原理不缺,缺的是把它变成能跑的东西的工程。

还有一道平时看不见的口子:deadline 任务被锁挡住时,拿着锁的低优先级任务会"继承"它的截止期往前赶,免得高截止期的任务被一把锁活活拖死¹。公平讲的是分法,截止期讲的是约法——约好了到点,就得有机制保证约能兑现。

二、先报截止期,再谈跑多久

如果 AI 的操作系统先出现,它的调度器不会先问"你跑了多久",而是先问"你几点前必须交卷"。一个 agent 的任务天然带着截止期:用户等在屏幕前的回答,200 毫秒内要出第一字;后台批量整理,今晚跑完就行;控制环的每一步,错过节拍就不是"慢了",而是"错了"。

原生的做法,是让每个任务进门先交一张契约:截止期、预算、错过怎么办。错过可降级(先给草稿再补全)的,和错过即作废(过期帧直接丢)的,不能进同一个队。调度器按契约算总账:接得下就接,接不下就当面拒绝,让调用方早做打算——降级、换模型、排队,而不是先答应、后超时、再道歉。

旧抽象在这里又露一次馅:按时间片切指令流的调度器,能量一段代码跑了多久,却量不出"这次推理的截止期在几毫秒后"。向量阵列时代还多一笔账:一个推理任务的预算不只是 CPU 时间,还包括显存里的 KV 缓存、权重是不是热的——截止期到了,缓存冷了,预算表上那几毫秒根本不够用。调度器若只看时间账,等于只看了契约的一半。

还有一层看不见的东西:谁在受益,谁在买单。截止期优先听起来最讲理,可一旦任何人都能自报"我的截止期最近",调度器就成了抢话筒的比赛。所以 DEADLINE 的门口有两道闸:带宽总账和预算节流——报得出截止期,还得付得起预算。这道闸,才是"到点必须完"这句话成立的前提。

三、给任务写一张时间契约

今晚就能试的一步,不用改内核,先给手头的任务写一张"时间契约"并数一数它失约几次。写个每 100 毫秒醒一次的循环,记下每次实际花了多久、超了多少次:

import time

miss = 0

for i in range(600):

t = time.monotonic(); time.sleep(0.1)

d = time.monotonic() - t

if d > 0.1: miss += 1

print(f"60 秒里,失约 {miss} 次")

先空载跑一遍,再把一台机器塞满批量任务跑一遍,对比失约次数被拉高了多少。这个数就是那台机器上"到点"这件事的真实成色:失约少,说明周期任务站得住;失约多,说明它只是在空闲时显得准。

再看一眼现成的分层,知道任务现在站在哪一层:

chrt -m

它列出实时策略的优先级上下限;再用 ps 看某个进程的调度类:

ps -o pid,cls,pri,rtprio -p <进程号>

CLS 一栏告诉你它走的是普通类还是实时类。普通任务的"准",是系统空闲时赏的;实时类的"准",是内核在门口算过账、签过契约的。先分清站在哪一层,再谈"为什么它有时候准、有时候不准"。

落到普遍场景里,同一张契约表能直接套:一台跑本地模型的机器上,在线问答的截止期按百毫秒计、批量评测按小时计,两张契约不能混进同一个队;一台边缘算力盒上,控制环的每一步是硬截止,日志整理可以排队;视频 AI 平台里一帧视频的推理过期即丢,不必追着补;企业私有智能中心里 agent 回用户消息时,先报截止期再排队,错过可降级的先给草稿。先写契约,再谈调度。

觉 然 小 注

公平分的是时间,截止期守的是约定。没有约,准只是运气;有了约,调度器才敢说"到点必到"。

引 用 与 出 处

  1. [1] Juri Lelli 等. Deadline scheduling in the Linux kernel. Software: Practice and Experience, 2016. https://www.academia.edu/125507188/Deadline_scheduling_in_the_Linux_kernel
  2. [2] C. L. Liu, J. W. Layland. Scheduling Algorithms for Multiprogramming in a Hard-Real-Time Environment. Journal of the ACM, Vol. 20, No. 1, 1973.

· · ·

← 返回资讯中心