一个夜深人静的AI实验室里,GPU集群像一条热气腾腾的自助餐线。自然语言组跑来“我要40块GPU!”视觉组嚷嚷“我显存不够了!”推荐组默默说“我内存吃紧……”。如果厨师只会按人头平均分菜,结果往往是:想要大鸡腿的人只拿到半碗饭,想要甜点的人却被塞了一堆肉——谁都不满意,菜还被浪费了。今天,我们就来聊聊这位“AI大餐分菜师”的看家本领:GPU集群调度公平性。它要回答一个朴素的问题:资源有限时,怎么分,才能让每个人都觉得“这次还行”,还能让整张餐桌物尽其用? 我们会从“什么是公平”讲起,认识业界大名鼎鼎的 DRF 多资源公平调度,再看看最朴实的 max-min 公平算法,学会给不同团队开“小灶”(权重分配),用 Jain 公平指数 给满意度打分,最后聊聊“绝对公平”和“最高效率”这对天生的冤家。
对 AI 从业者来说,调度公平性是你管理多租户 GPU 集群、保障共享平台资源治理的底层能力。理解了它,你就能看懂 Slurm/K8s 的配额逻辑,在团队抢显卡时拿出有理有据的分配方案。
可视化演示
动态演示GPU集群调度公平性的核心机制,通过入门/进阶/实战/优化四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
GPU集群调度公平性:调度公平 调度公平性的定义与核心概念 经典公平调度算法 核心机制可视化 GPU集群调度公平性整体架构与关键组件
多租户资源竞争
把GPU集群想象成一家24小时营业的自助餐厅,几个AI团队是常客。自然语言组的餐盘上堆满GPU“牛排”,却几乎不碰内存“米饭”;视觉组恰好相反,显存“甜点”拿了一盘又一盘;推荐组则是每样都来一点。餐厅经理很快发现,如果按人头平均分配食材——每人一份完全相同——那自然语言组的牛排不够吃,视觉组的甜点被浪费,推荐组看着盘子里用不上的东西干瞪眼。这就是多租户GPU集群的第一课:用户的需求是异构的,平均分配并不等于公平分配。
在多租户GPU集群中,多个团队共享同一批物理GPU,有的跑大模型训练(吃GPU算力),有的做推理服务(吃显存和内存),有的做数据预处理(吃CPU和I/O)。如果调度器不考虑需求的差异,简单按比例分配资源,就会出现两种恶果:一是需要大量GPU的团队长期排队,二是某些节点的显存被低效占用,整体利用率上不去。更棘手的是,用户会为了“抢到”资源而虚报需求,进一步加剧分配不均。
因此,调度器的核心目标不是让每个用户拿到相同数量的资源,而是让每个用户感受到公平。什么叫“感受到公平”?一位用户最看重GPU,他评判公平的标准是“我拿到的GPU占我需求的占比”;另一位用户最看重内存,他则盯着内存份额。好的调度算法要同时照顾这些不同的“满意标尺”。这就是现代集群调度中“多资源公平”思想的起点——在餐厅里,让每个人都按自己真正爱吃的菜来计量“我吃没吃饱”。
DRF多资源公平
为了给自助餐厅设计一套公平分菜流程,我们引入一位“AI分菜师”,它采用的策略叫 DRF(Dominant Resource Fairness,主导资源公平)。分菜师有个独特的观察习惯:它不看每个用户拿了多少总量,而是先判断每个用户“最离不开哪种资源”——这种资源就叫他的主导资源。
假设集群总共有 100 块 GPU、200 GB 内存。用户A的训练任务每跑一个样本要 2 块 GPU 和 1 GB 内存,那么在总容量中,A对GPU的需求占比是 \(2 \div 100 = 2\%\),对内存的需求占比是 \(1 \div 200 = 0.5\%\)。GPU 占比更大,所以 GPU 就是 A 的主导资源。用户B的推理服务每路要 1 块 GPU 和 4 GB 内存,那么B对内存的需求占比是 \(4 \div 200 = 2\%\),内存是他的主导资源。DRF 的分菜逻辑很简洁:每一轮,把资源分配给当前主导份额最小的用户。它追求的是让所有用户的主导份额尽量相等。
DRF 在GPU集群中的应用特别直观。假设有三支团队:大模型训练组、视觉推理组、离线批处理组。大模型组要大量GPU,视觉组要大量显存,批处理组要内存。如果只按GPU数量平均分,视觉组和批处理组都会不满;如果只按内存平均分,大模型组会饿死。DRF 则分别计算每支团队的主导份额,然后让三者趋近相等。你会发现,大模型组拿到的GPU数量可能确实更多,但这正是因为GPU在他眼里“最珍贵”——这恰恰是公平。
回到自助餐厅的比喻:DRF 分菜师不再给每人一样的餐盘,而是先问每个客人“你最想吃什么”,然后让每个人“最想要的那种菜拿到手的比例”尽量接近。爱吃牛排的客人多吃牛排,爱吃甜点的客人多吃甜点,大家比较的不是“分量一样”,而是“我最想吃的东西,我得到了它应有的比例”。
- 对每种资源算占比对用户 \(i\),先算他拿到了多少 GPU(占集群 GPU 总量多少)、多少内存(占集群内存总量多少)。
- 找出最大值这些占比里最大的那个,就是该用户的主导份额。它代表用户最“卡脖子”的资源瓶颈。
- 每轮比较所有用户调度器循环地找到主导份额最小的用户,给他分配一小份资源,直到无资源可分。
max-min公平算法
在 DRF 诞生之前,调度界最朴素的一条公平准则是 max-min 公平:让资源最少的人,尽可能多地获得资源。用餐厅的话说,就是“最饿的人先夹菜”。这条准则源自一个基本直觉——如果你要保证所有人的最小满足度都能尽量大,就应该优先照顾那些目前获得最少的人。它是“公平”二字最原初的数学形态。
max-min 算法的执行过程很像流水线分餐:第一轮,先把资源分给当前需求量最小的用户,满足他后,剩余资源再分给需求量第二小的用户……以此类推。这样,即使某个用户的需求特别小,他也能先被满足,不会被大胃王挤掉;而那些需求极大的用户,在所有人被满足到同一水平后,剩下的资源继续按需追加。核心原则可以写成一句话:任何用户 i 获得的资源,不能因为其他用户想要更多就被剥夺。
在单资源场景——比如只看GPU张数——max-min 是最直观、也最容易实现的公平策略。许多集群调度器(比如Hadoop YARN 的 Capacity Scheduler)都内置了类似逻辑:短小的低优先级任务先完成,大任务后启动;所有队列都保证一个最小容量,不会出现某个队列永远抢不到资源的情况。当资源变成多维度时,max-min 就直接推广为 DRF——DRF 本质上就是“把每类资源换算成份额后,在份额层做 max-min”。
用餐厅的话说:max-min 策略是“让最饿的人先夹菜,等他吃上了,再让第二饿的人夹,最后还有剩,再给能吃的多加一些”。它保护的底线是——任何时候,都不会有一个人被晾在餐桌角落,连一口汤都喝不上。
- 把用户按需求从小到大排队首先处理“吃得最少”的用户,让他的需求最先被满足。
- 从最小需求开始逐级填充资源池按顺序给每个用户分菜,先满足小需求,再满足大需求。
- 剩余资源在需求未满足者中均分如果资源耗尽前还有剩余,就在还没吃饱的用户里继续平分,直到分完。
权重资源分配
自助餐厅营业一段时间后,经理发现:有些客人是 VIP——比如正在跑线上推荐服务的用户,服务断了要赔钱;有些客人是普通食客——比如离线实验团队,晚跑几小时也无所谓。如果一视同仁地公平,VIP 客人会急得跳脚。于是,公平的定义需要引入一个修正项:权重。
在 GPU 集群调度中,权重是个贴切的“优先级刻度”。某团队权重为 \(w_i=2\),另一团队权重为 \(w_j=1\),那么在公平分配时,前者分到的份额比例应该是后者的 2 倍。权重化之后,DRF 的公平目标从“主导份额相等”变成“主导份额与权重之比相等”。这样既能体现业务优先级,又不至于让低权重团队完全饿死——因为算法仍然保证每个人至少获得与权重相匹配的一个下限。
在工程实践中,权重配置要小心。比如 K8s 的 ResourceQuota 可以为每个命名空间设置请求上限;YARN 的 Capacity Scheduler 支持队列权重分配;Slurm 的 PriorityWeight 系列参数则综合了年龄、QOS、公平因子。如果你的平台有在线推理和离线训练两类任务,常见的做法是给在线推理设置更高的权重,同时给离线任务一个最低保障配额,避免高权重任务永久霸占集群。
回到餐厅:权重就是“VIP 卡”。持有 VIP 卡的客人,分菜师会优先给他端上主菜;但普通客人也永远不会被赶出门——餐厅会给每个层次都预留最基本的座位和食物。这就是现代调度器里“加权公平 + 最小保证”的智慧:让公平拥有弹性,让优先级有边界。
- 每个用户关联一个权重调度配置里,为每个队列/租户设置权重值。权重越大代表业务越重要。
- 计算加权份额主导份额除以自身权重,得到“相对满意度”。DRF 每轮比较的是这个相对值。
- 让相对满意度趋同调度器让所有用户的 WeightedShare 相等,同时保持每个用户的基本份额下限。
公平性度量方法
分菜师到底做得好不好,不能只靠感觉。就像餐厅会用“顾客满意度问卷”来打分,集群调度也需要一把尺子来度量公平。最常用的尺子叫 Jain 公平指数(Jain's Fairness Index)。假设我们有 \(n\) 个用户,每人获得了 \(x_i\) 份资源,那么 Jain 指数定义为:
这个指数有一个极好的性质:当所有用户获得完全相同的份额时,\(J = 1\),表示绝对公平;反之,若某个用户独占所有资源,\(J \to 1/n\),接近 0,表示严重不公平。它是调度器调参时最直观的仪表盘。
除了 Jain 指数,另一个常见的度量是基尼系数——经济学里衡量收入分配不均的经典指标。基尼系数为 0 表示绝对平均,为 1 表示绝对不平均。在集群场景中,基尼系数可以用来衡量不同队列获得资源量的离散程度。此外,分布式系统里还经常关注两个动态指标:饥饿时间(某个任务等待资源超过阈值的时间)和队列延迟公平(不同租户的平均排队耗时差距)。一个系统即使 Jain 指数很高,如果个别短任务被无限期饿死,也算不上真公平。
用餐厅的话说:Jain 指数就是“满意度分数卡”,基尼系数是“贫富差距曲线”,饥饿时间是“有没有客人饿晕的记录”。一个好的分菜师,三张表都要好看。这样管理者打开监控面板,一眼就能看出哪桌客人在挨饿、哪桌在被过度投喂,进而优化下一轮的配菜策略。
- 分子是所有份额之和的平方把每个用户获得的资源相加,然后取平方。这衡量了“总体分走了多少”。
- 分母是用户数乘以份额平方和平方和会放大“偏科”——如果份额差异大,平方和的增幅就大。
- 两者相除得到 0 到 1 之间的数\(x_i\) 越平均,比值越接近 1;差异越大,比值越接近 \(1/n\)。
公平效率权衡
看到这里,你可能会想:只要把公平算法调到完美,世界就太平了。但现实中的分菜师面临一个尴尬:绝对公平可能带来巨大的浪费。设想一下,餐厅为了“绝对公平”,把整块牛排切成细丝,平均分给每一位客人——每个人只吃到一口,主厨的锅却因为切了太多次而累坏了。这在计算集群中叫资源碎片化:为了维持公平,把一批 GPU 拆得七零八落,结果谁也跑不成大任务。
反过来,如果一味追求效率——谁的任务先来,就把全部空闲 GPU 都给他——那么后来的高优任务会被饿死,长此以往,低优任务永远找不到资源,整体体验崩塌。公平与效率,就像天平的两端:压低了公平,效率曲线上升但长尾恶化;压低了效率,公平指数高但资源空转。现代调度器的解法不是二选一,而是引入弹性配额与抢占回收机制。所谓弹性配额,就是允许用户突破下限去使用闲置资源,但一旦资源紧张,超出部分会被回收(preemption),低优任务可能需要被挂起或迁移,把资源让给高优任务。
一个典型的调度循环是:首先按加权公平算法给每个用户设定“保障配额”;然后如果资源有剩余,允许用户超用(即使用空闲资源);当新的高优任务到达时,系统从超用用户那里回收资源,必要时 kill 掉低优任务。这样在大多数时候保障高利用率,在竞争时刻保障公平底线。K8s 的 PriorityClass 配合 Preemption,以及 Slurm 的抢占与回填(backfill)就是这个思路的落地。
对照自助餐厅:最高级的私厨不会强求每桌分量完全一致,而是“平时随意加菜,名人到访时临时借位”。他用预约制度(配额)和“蹭座”机制(抢占)保证了黄金时段的高翻台率,也保证每位预订客人都能有位子。公平与效率从来不是单项选择题,而是一道动态平衡的配菜艺术。
AI 应用场景
多租户K8s GPU平台的配额治理
阶段:集群资源调度与治理
解决的问题:在共享 Kubernetes 集群上,多个算法团队共用一组 GPU 节点。过去靠“先到先得”下单,结果某个团队提交 50 个训练任务占满集群,其他团队的在线推理因为拿不到 GPU 而超时告警。用 DRF+权重可以让每个团队按权重分摊 GPU,在线推理权限高,离线训练在空闲期超用。
具体案例:某互联网公司 AI 平台有 200 块 A100,四个部门共享。平台组在 K8s 中为每个命名空间配置 ResourceQuota,后台用 DRF(Fairness 插件)计算主导份额:训练部需求以 GPU 为主导,广告部需求以显存为主导,调度时让两者的主导份额趋同。上线后,训练任务排队时间下降 40%,推理 P99 超时率降为 0。
离线训练与在线推理的权重分级
阶段:训练与推理混合部署的资源分配
解决的问题:离线训练任务量大但容忍等待,在线推理任务量小但要求低延迟。使用权重调度可以让推理服务获得倾斜资源,同时允许训练任务在推理低峰期使用闲置 GPU。
具体案例:某自动驾驶公司 GPU 集群同时跑夜间仿真训练和白天在线感知推理。他们将推理服务的调度权重设为 3、训练任务权重设为 1,并启用抢占策略:当推理队列积压时,超用的训练任务被挂起,推理完成后恢复。最终 GPU 利用率维持在 85%,推理延迟 SLO 达标率 99.9%。
公平性指标监控与调优
阶段:资源治理与容量规划
解决的问题:调度策略改了之后,如何量化评估“是否变得更公平”?用 Jain 指数与基尼系数制作监控面板,实时追踪每个队列的份额分布。
具体案例:某云厂商 GPU 实例租赁平台,管理员按小时计算每个租户获得的 GPU 分钟数,绘制 Jain 指数曲线。发现某时段指数跌到 0.72,定位到是某个大客户提交了超大任务,触发了抢占风暴。调整预占配额与任务大小上限后,指数回升到 0.95。
Python 演示
"""DRF 多资源公平调度模拟器(简化版)"""import copy class DRFAllocator: def __init__(self, total_res, users): self.total = total_res # dict: {'gpu': float, 'mem': float} self.users = users # list of {'name','demand','weight'} self.alloc = [] # list of dict: {'gpu':..,'mem':..} for _ in users: self.alloc.append({'gpu': 0.0, 'mem': 0.0}) self._cur_iter = 0 def _shares(self, idx): alloc = self.alloc[idx] capacity = self.total user = self.users[idx] gpu_share = alloc['gpu'] / capacity['gpu'] mem_share = alloc['mem'] / capacity['mem'] return gpu_share, mem_share def find_target(self): target = -1 best = float('inf') for i in range(len(self.users)): u = self.users[i] gs, ms = self._shares(i) dom = max(gs, ms) / u['weight'] if dom < best: best = dom target = i return target def step(self, amount=0.02): idx = self.find_target() user = self.users[idx] demand = user['demand'] for res in self.total: need = demand[res] total_res = self.total[res] avail = (need / sum(u['demand'][res] for u in self.users)) * amount take = min(avail, total_res * 0.2) self.alloc[idx][res] += take self._cur_iter += 1 return idx def metrics(self): samples = [max(self._shares(i)) for i in range(len(self.users))] n = len(samples) jain = (sum(samples) ** 2) / (n * sum(s ** 2 for s in samples)) return jain, samples def main(): cluster = {'gpu': 100.0, 'mem': 200.0} users = [ {'name': 'nlp', 'demand': {'gpu': 2.0, 'mem': 1.0}, 'weight': 1.0}, {'name': 'cv', 'demand': {'gpu': 1.0, 'mem': 4.0}, 'weight': 1.0}, {'name': 'rec', 'demand': {'gpu': 1.0, 'mem': 2.0}, 'weight': 2.0}, ] allocator = DRFAllocator(cluster, users) for _ in range(200): allocator.step(amount=0.03) jain, samples = allocator.metrics() print('DRF allocation:') for i, u in enumerate(users): a = allocator.alloc[i] print('%s -> gpu=%.1f mem=%.1f dom=%.3f' % ( u['name'], a['gpu'], a['mem'], samples[i])) print('Jain fairness: %.3f' % jain) if __name__ == '__main__': main()
demand = user['demand']取出当前用户的资源需求向量,GPU 和内存是两种独立资源。dom = max(gs, ms) / u['weight']计算主导份额并除以权重,这是 DRF 选择目标的“打分函数”。avail = (need / sum(need_all)) * amount按用户需求占总需求的比例,估算本次应分配的资源量。take = min(avail, total_res * 0.2)防止一次性分配过多,模拟调度器逐步推进的节奏。jain = (sum(samples) ** 2) / (n * sum(...))计算 Jain 公平指数,评估最终分配是否均衡。
常见误区
误区多租户共享 GPU 集群,最公平的办法是给每个团队分配相同数量的 GPU。比如 4 个团队、100 块卡,每个团队 25 块,大家都没话说。
正解平均分配 GPU 只适用于“所有任务的资源画像相同”的假设。现实中,有的任务吃 GPU 算力、有的吃显存内存,还有的吃 CPU。如果平均分配 GPU,视觉任务可能因显存不足而排队,而 NLP 任务的 GPU 却闲置。DRF 的贡献恰恰是指出:公平要基于“主导资源份额”来比较,而不是基于单一资源数量。就像自助餐,给每个人都上一样多的牛排,素食者会饿死,肉食者会浪费。
为何常见:因为 GPU 是最直观、最贵的资源,管理者习惯以它作为分配单位。忽略了多资源维度的存在。
误区DRF 和 max-min 是两个独立的调度算法,一个管多资源公平,一个管单资源公平,两者没有联系。
正解DRF 正是 max-min 公平在多资源场景的自然推广。max-min 的核心是在单资源上最大化最小份额;DRF 先把每种资源都折算成“份额”,然后在份额向量上做 max-min。所以 DRF 的内部逻辑仍然遵循“优先照顾最饿的人”这一原则,只是“饿”的定义从“资源最少”升级为“主导份额最大”。理解这个联系能帮你快速上手其他调度算法。
为何常见:教材通常分开介绍,且 DRF 的论文偏数学化,读者容易把它们当成两个独立流派。
误区给在线推理服务设置权重 10,给离线任务设置权重 1,那么在线推理就应该永远优先,离线任务在高峰期干脆别跑了。
正解权重调度通常会为低权重用户保证一个最小份额,防止长时间饥饿。DRF 加权重后,目标是加权份额相等,而不是“高权重完全抢占”。实际系统里还引入弹性配额和抢占回收:低权重用户在空闲期可以超用资源,高权重任务到达时再被回收。这种“有下限、可超用、能抢占”的设计,比单纯按权重硬切更加稳健。
为何常见:直觉上“权重=优先级=先来先得”,忽略了调度器还要兼顾公平底线与资源利用率的工程约束。
误区Jain's Fairness Index 是计算机网络领域的指标,集群调度用得少,我们看平均资源利用率就够了。
正解Jain 指数本身是个通用的分布均匀度度量,任何“一组份额是否均衡”的问题都可以用它打分。在 GPU 集群中,它是量化“不同队列资源份额离散程度”的简便工具。与平均利用率互补:利用率高的系统可能严重不公平,公平的系统也可能利用率低。Jain 指数让管理员有了一串数字,而不是模糊的感觉。
为何常见:Jain 指数常出现在 TCP 公平性的课程里,给人一种“网络专用”的错觉。
误区为了照顾每个团队的需求,把 GPU 显存做细粒度切分,每块都分给不同的任务,这样最公平。
正解过度细粒度的资源切分会导致碎片化——大任务要 8 块整卡,却被拆散成几十个小碎片组不起来;同时频繁的抢占和迁移本身会消耗重启时间。公平性需要以“任务可运行”为前提,否则分配了也白搭。现代调度器通过 bin-packing(装箱)加上回填(backfill)等手段,在保证公平的同时尽量减少碎片,这正是公平与效率的平衡点。
为何常见:因为“公平”这个词暗示着整齐,而忽略了物理资源不可无限分割的工程现实。
面试题
Q1. 在 DRF 中,用户的“主导资源”是指什么?
- A.用户需求占比最大的资源类型← 正确答案
- B.用户总共申请的资源数量
- C.集群中用户使用最多的任务类型
- D.用户所在队列的默认资源类型
答案:A。DRF 将“用户对该资源的需求量占集群总量的比例”最大的资源定义为该用户的主导资源。它并不看申请的绝对数量,也不看任务类型。GPU 主导的用户可以分配更多 GPU,但前提是与其他用户的主导份额趋近相等。
Q2. DRF 调度器每一轮会选择哪个用户优先分配资源?
- A.资源需求总量最大的用户
- B.当前主导份额最小的用户← 正确答案
- C.任务提交时间最早的用户
- D.运行时间最长的用户
答案:B。DRF 的核心理念是 max-min 公平:优先照顾“相对最饿”的用户。主导份额最小意味着该用户在所有维度中最落后,因此给他分配资源能将整体公平性推高。
Q3. max-min 公平算法的核心原则是什么?
- A.让所有用户获得完全相同的资源量
- B.最大化所有用户中的最小分配份额← 正确答案
- C.让资源需求大的用户优先获得资源
- D.按任务提交顺序依次分配全部资源
答案:B。max-min 的目标是先保证“最惨的人”不至于太惨,再考虑其他人。先满足小需求用户,剩余资源再按需分配。它强调公平底线,而不是平均主义和大小优先。
Q4. 若用户A权重为 2,用户B权重为 1,在加权 DRF 下达到公平后,两者主导份额的关系是?
- A.A是B的主导份额的2倍← 正确答案
- B.B是A的主导份额的2倍
- C.A与B的主导份额完全相同
- D.A的主导份额是B的4倍
答案:A。加权 DRF 的目标是让 DominantShare / weight 相等,所以 A 的份额 = w_A × 常数,B 的份额 = w_B × 常数,故 A 是 B 的 2 倍。权重越大,份额越大,但仍然是线性比例而非随意抢占。
Q5. Jain 公平指数取值为多少时表示分配绝对公平?
- A.1.0← 正确答案
- B.0.5
- C.0.8
- D.0
答案:A。Jain 指数在 0 到 1 之间。当所有用户获得完全相同的份额时,分子等于 n 倍平方和,指数为 1.0;当某个用户独占资源时,指数趋近于 1/n。数值越大,分配越均匀。
Q6. 在 GPU 集群调度中,过度追求绝对公平可能带来什么问题?
- A.提高整体资源利用率,减少任务排队
- B.导致资源碎片化,大任务难以获得整块 GPU← 正确答案
- C.让高优任务永远优先于低优任务
- D.使所有用户获得完全相同的 GPU 数量
答案:B。如果把资源切得太碎来“平均分”,大模型训练需要的 8 卡整机将永远凑不齐,造成碎片化浪费。公平调度还要配合 bin-packing、回填等手段,避免为了公平牺牲可用性。
Q7. 某集群总量 GPU=100、内存=200,用户1需求为 (gpu=2, mem=1),已分配 (40, 20);用户2需求为 (gpu=1, mem=4),已分配 (20, 80)。当前 DRF 下一步会选谁?
- A.用户1,因为其主导份额更小← 正确答案
- B.用户2,因为其主导份额更小
- C.用户1,因为其已分配 GPU 更多
- D.两个都不选,因为资源已耗尽
答案:A。用户1的 GPU 份额为 0.4、内存份额为 0.1,主导份额 0.4;用户2的 GPU 份额为 0.2、内存份额为 0.4,主导份额 0.4。二者主导份额相等,按题设“当前主导份额最小”的规则,两者并列,但结合具体迭代(用户1的份额略低或从序号)选 A 的逻辑是:比较主导份额小者先调度。本题关键在于理解主导份额的计算方法,而非总量。
Q8. 下列哪种机制最直接地缓解“高权重任务需资源时低权重任务不让位”的问题?
- A.弹性配额与抢占回收机制← 正确答案
- B.将低权重任务的配额设为 0
- C.关闭资源空闲检测功能
- D.将 GPU 按物理核心数均分
答案:A。抢占回收允许调度器在资源紧张时终止或挂起低优先级任务,把资源腾给高优先级任务。这是现代调度器保障优先级同时避免死锁的主要手段。配额设 0 会饿死低权重任务,均分则忽略优先级。
Q9. 下列哪些是衡量调度公平性的常见度量指标?
- A.Jain 公平指数← 正确答案
- B.基尼系数← 正确答案
- C.任务饥饿时间← 正确答案
- D.磁盘 I/O 带宽峰值
答案:ABC。Jain 指数和基尼系数都能量化“份额分布是否均匀”,饥饿时间则关注长期得不到资源的任务数量。磁盘峰值属于硬件性能指标,不直接度量公平性。
Q10. 关于权重调度,下列说法正确的有哪些?
- A.高权重用户分到的资源比例与权重成正比← 正确答案
- B.低权重用户也可能获得资源,只是份额较少← 正确答案
- C.权重策略可以同时保障最小资源配额← 正确答案
- D.权重设置后,低权重任务会被永久饿死
答案:ABC。加权 DRF 使份额之比等于权重之比,低权重用户仍有保底资源;调度器常配置最小配额防止饥饿。极端情况下若无最小保证,低权重任务可能长期等待,所以在工程上必须同时设置下限与抢占策略。