崔阿姨是青柳大学 7 号宿舍楼的宿管,管着一栋楼、8 个楼层、每层 20 个房间。新生入住时,每间宿舍会领到一张“入住卡”:最多住 4 人、每月用电 40 度、每层公共热水房限时开放。你以为规则定完就万事大吉?不,A 层四个房间挤了 16 人,B 层只住 8 人却霸着朝阳的房间;深夜一二十个学生同时想用电吹风,崔阿姨就得举着手电筒从一楼爬到八楼,看谁家电流超了、哪间房还能再加一张床。她的终极难题是:怎样让整栋楼住得满满当当,又不让任何一层打架。 这其实就是 AI 算力集群中“资源配额与限制”要解决的事。Slurm 像崔阿姨用了二十年的纸质账本——规则分明、老辣可靠;K8s 则像一台联网的智能管理 App——自动检查、实时门禁。但无论工具是什么,宿管的核心工具永远是一句话:你最多能用多少,超过多少就要被拦下。
对 AI 从业者的价值:GPU 集群是 AI 训练的命脉,配额设计直接决定团队产能与账单之间的平衡,是大模型时代 AI 工程师绕不开的资源规划课。
目录
可视化演示
展示K8s/Slurm资源配额三维度:60-30-10配额分配原则(生产/实验/弹性缓冲命名空间配额隔离)、QoS优先级与公平份额调度(fair-share因子决定调度顺序、Guaranteed优先于BestEffort触发抢占)、弹性配额借用与回收(团队间配额动态借还、guarantee与max双重约束提升集群利用率),三模式切换理解AI集群资源管理核心机制。
本节配有交互动效(进入视口后自动加载,约 3KB)。
'+C1+'
基础概念:入住卡上的三个数字
崔阿姨发入住卡之前,要先搞清楚楼里有什么。7 号楼有 8 层,每层 20 间房,每间房 4 张床、2 个插座、1 个水龙头。换算到 AI 集群里,“床”就是 CPU/GPU 核,“插座”是内存,“水龙头”是存储与网络带宽。资源类型决定了配额要管什么。在 Slurm 的命令里,你会看到 --gres=gpu:8 来申请 8 块 GPU;在 K8s 的 yaml 里则是 resources.requests.cpu。每一种资源都可能成为稀缺品,都需要被一张“入住卡”管住。
崔阿姨继续发卡。卡上有两个数字容易混淆:配额(Quota)和限制(Limit)。配额是“这个学期你最多能用多少”——好比一整学期你能用 40 度电,用完了就断电,不能用超。限制则是“单个设备单次最多用多少”——好比宿舍里电吹风功率不能超过 1200 瓦,防的是瞬时过载烧坏电路。配额管总量,限制管瞬时,两者配合才安全。在 K8s 里,这种区别对应 ResourceQuota 管理的总量与 LimitRange 约束的单容器上限。
没有配额和限制的宿舍会怎样?一个学生偷偷搬进 30 台服务器,把走廊电闸烧了,整层楼黑灯,所有人的台灯全灭。换成集群,就是某个团队的业务突发跑满 500 张卡,把其他团队的训练任务全部挤到后面饿死。隔离故障、保护公平、约束资源,这是配额的三大价值。所以拿到入住卡先别急着搬家,看懂数字,才知道自己家底多厚、能接多少活。
调度器视角:宿管阿姨的全局视角
崔阿姨管理整栋楼时,不会只看一层。她把 8 层楼看成一个“大资源池”:哪层空、哪层满、哪层电表走得快,心里有本账。这个模型叫做资源池抽象——不关心具体节点,只看总容量与剩余容量。调度器(无论是 Slurm 还是 K8s)都把集群当做一个个可分割的资源块,随时回答一个问题:“还能塞下这个 8 卡任务吗?” Slurm 用 sinfo 展示节点分区状态,K8s 用 kubectl describe node 查看可分配资源,本质都在看水池水位。
但资源池不能是独裁者的。崔阿姨要做到公平:A 层住 16 人,C 层只住 4 人,她不能一直让 C 层空着。公平性思路在调度器中有多种体现——时间片轮转、公平份额(FairShare)、加权比例。Slurm 的 FairShare 根据用户历史使用量动态调整权重:用多则权重降,等久则优先级升。K8s 的 kube-scheduler 则按请求量打分,尽量让节点资源用量均衡,本质都是追求“不患寡而患不均”。
公平之后是优先级:答辩季,崔阿姨会优先给马上毕业的学生安排网络,这就是“优先级机制”。同理,集群里在线推理服务的业务 Pod 往往有更高的 QoS 优先级,能在资源紧张时抢到运行权,而离线的数据清洗任务只能排在后面。多个队列共存让不同团队互相隔离——A 公司的训练任务不会挤爆 B 公司的推理服务,就像 A 层的电闸不会连累 C 层。调度器手里那把全局尺子,一边量公平,一边量优先级。
Slurm配额:一本用了二十年的纸质账本
崔阿姨的账本上,每层楼、每间房是一个“账户”(Account)。每个账户会记录“这个月用了多少电、还欠多少”。Slurm 的账户体系就是这样的分层账本,用 sacctmgr 命令管理:root -> engineering -> vision -> zhangsan,一个研究生的所有任务都会记在他所属的账户下。这种层级结构让管理员可以按部门、按项目逐级设置限额,也能追溯每一卡时的去向。
账户之上还有 QoS(服务质量)档位。崔阿姨给不同楼层签发不同等级的取水卡:一楼实验室 24 小时热水,二楼自习区晚 11 点断水。在 Slurm 里,QoS 可以定义 MaxWallDuration(最长运行时长)、MaxTRESPerUser(单人资源上限)、GrpTRES(组总上限)、抢占资格等。QoS 是限制的“权限级别”——重要业务组的 QoS 高,能抢资源;测试组的 QoS 低,只能捡漏。提交作业时用 --qos=high 就能申领高权限。
第三层工具是分区 Partition。崔阿姨把坐北朝南的楼层划给考研学生,其他楼层留给普通学生。Slurm 中 partition 就是物理分区:GPU 节点归 gpu 分区,CPU-only 节点归 cpu 分区,作业必须用 --partition=gpu 才能提交到对应分区。相比 QoS 的软性弹性,分区是硬的物理边界——就像一堵墙,不让普通学生溜进考研区抢座位。
但即使把一切规则写在纸上,总有冲突:当 QoS 高的用户提交任务而资源已满时,Slurm 可以选择抢占低优先级任务——把低优先级作业挂起(preempt),腾出资源给高优先级作业。被抢的作业不会丢失,但会回到队列重新排队。这是账本里最残酷的一页,也是集群保持秩序的关键。账本旧,但规矩齐全。
K8s配额:会联网的智能门禁
K8s 的“宿舍管理”不再是一本账本,而是一套自动化的门禁系统。核心组件 ResourceQuota 像一个住在楼门口的数字管家:每个命名空间(Namespace)配一个,它能统计“这个命名空间里所有 Pod 的 CPU、内存加起来不能超过 X”。K8s 在接收 Pod 创建请求时先问管家:“这单能过吗?”能过就放行,不能过就 403 拒绝,Pod 创建直接失败。比如 spec.hard.limits.cpu: "16" 就表示该命名空间所有容器的 CPU 上限总和不得超过 16 核。
与 ResourceQuota 配套的是 LimitRange(限额范围)。ResourceQuota 管总量,LimitRange 管“每个房间的单户限额”——好比崔阿姨规定每间宿舍最多 4 人,每人功率不超过 800W。LimitRange 给命名空间里的每个容器设置默认的 request/limit 值,并约束最大值最小值,防止某个 Pod 狮子大开口,一次要光整个集群的 GPU。
Namespace 隔离则是整个门禁系统的“楼层隔离”:不同团队有各自独立的空间,A 团队看不见 B 团队的 Pod。每个命名空间里配置各自的配额策略,互不干扰,一个团队把配额耗尽不会影响另一个团队。这在多租户场景里尤其重要——算法团队的训练任务和运维团队的监控任务,物理上住在两套门禁里。
配额硬上限体现在 ResourceQuota 的 hard 字段中:requests.cpu: "32"、limits.memory: "64Gi"。注意,配额是“放行许可”,不是“给到资源”——真正的资源分配还取决于节点上是否有足够的可分配量。门禁放你进门,但屋里没床,你也只能站着。这就是为什么很多人发现配额定得很大,Pod 却依然 Pending 的原因。
算法原理:分蛋糕的精确数学
分配的核心问题可以类比成:崔阿姨手里有一块大蛋糕(总资源池),要怎么分给各层楼?最简单的方案是平均分,但考研层需要更多学习时间、毕业层冲刺实验、新生层刚入住需求少——一刀切不公平。加权公平分配(Weighted Fair Share)是调度器们的标准答案:每层楼有一个权重,分到的蛋糕与权重成正比。权重高的团队配额高,权重低的团队配额低。
但只有权重还不够,还要回答“蛋糕不够分时谁先吃”。最大最小公平(Max-Min Fairness)给出了一个朴素而优雅的答案:先让所有需要小份的人吃饱,再把剩余的继续分给需要大份的人。这在排队模型里表现为多级反馈队列:短任务优先快速通过,长任务让位与后补。当有任务长期等待时,“老化”机制会逐步提升它的优先级,防止饿死。抢占策略则解决另一个问题:当高优先任务插队且资源不足时,调度器把低优先级任务暂时挂起,先让位。数学保证了规则的可计算性,也让“分蛋糕”不再是宿管拍脑袋。
- 团队权重 $W_i$第 i 个团队的权重值,代表它在集群中的“地位系数”——答辩季给毕业班加权,重要业务组权重大。权重是人为配置的输入参数,来自管理员对业务重要性的判断。
- 总权重池 $\sum_{j=1}^{n} W_j$把所有 n 个团队的权重全部加起来,得到一个“基准分母”。它决定了整个集群的话语权总和,是衡量单个团队占比的依据。
- 份额比例 $\frac{W_i}{\sum_{j=1}^{n} W_j}$团队 i 的权重除以总权重,得到它在整个集群中的“份额比例”。这是一个介于 0 到 1 之间的数,表示该团队在蛋糕中的理论占比。
- 资源总量 $B_{\text{total}}$集群可分割的总资源,包括 GPU 卡数、CPU 核数、内存总量等。它是蛋糕本身的大小,由物理硬件决定,不随配额调整而改变。
- 相乘得配额 $Q_i$用资源总量乘以份额比例,得到团队 i 的配额上限。这是调度器实际执行时使用的限额数字——比如总池 100 卡、团队占比 30%,则配额就是 30 卡。
性能优化:让宿舍住得更满
制度定好了,崔阿姨还想让每层楼都住得满满的。首先要有“台账”——监控指标。Slurm 提供 sreport、sacct 查看历史资源使用;K8s 有 metrics-server 和 Prometheus 采集每个 Pod 的 CPU、内存仪表。看不见用量,就无法优化配额。很多团队随意配了一个数字就再也不看,直到线上事故才回头查数据。
衡量宿舍满不满的标准是利用率。假如 7 号楼有 10 个房间,每间 8 张床,某晚 60 张床有人住,利用率就是 75%。集群利用率的数学定义是实际使用总量除以配置总量:
利用率不高往往因为“碎片”:2 个 7 卡的任务占领 8 卡的节点,剩下 1 卡没人能用——就像两个宿舍各住 7 人,剩余 2 张床拼不成一个房间。碎片消除的手段包括:把多个小任务打包(bin packing)填充边角料、使用 K8s 的 Pod 调度预算做重平衡、Slurm 里选择 packing 的节点分配策略。弹性伸缩是终极优化术:K8s 的 HPA 根据 CPU 使用率自动增减 Pod,Slurm 也支持弹性脚本在队列变长时向云上申请更多节点。配额不是死的,弹性配额让集群在高峰时借用邻居资源,低谷时归还。
- 节点用量 $u_i$第 i 个节点当前实际使用的资源量,比如某台 8 卡 GPU 服务器上住了 6 个任务,$u_i$ 就是 6。
- 节点容量 $C_i$第 i 个节点的标称容量,即这台机器总共有多少资源。8 卡服务器的 $C_i$ 就是 8。
- 集群总用量 $\sum_{i=1}^{n} u_i$把所有 n 个节点的实际用量逐一相加,得到整个集群的“已入住人数”。这是监控台上最直接的一个数字。
- 集群总容量 $\sum_{i=1}^{n} C_i$把所有节点的容量全部加起来,得到集群的“总床位数”。它决定了宿舍楼能容纳多少任务。
- 利用率 $U$二者相除得到集群整体利用率。理想区间通常在 70%-85%:太低说明资源闲置浪费,太高则意味着排队严重、任务响应慢。
实际案例:宿舍事故现场还原
排队风暴。某个星期天晚上,A 组一次提交了 1000 个训练任务,每个任务请求 2 张卡。他们的配额是 200 卡,于是 100 个任务同时运行,剩下 900 个任务排成一条长龙。B 组同样提交了任务,却悲哀地发现队列排在 A 组的 900 个任务之后——这就是“排队风暴”。真实生产中,训练平台常遇到某团队刷任务导致全集群排队,解决方式是限制每用户最大作业数 MaxSubmitJobs,从源头掐住风暴。
资源饿死。另一个经典事故:低优先级的“数据预处理”任务永远排在最后,高优先级任务一个接一个插队,导致预处理任务等了 3 天还没跑上——这就是资源饿死。Slurm 的“老化”机制缓解此问题:等待时间越久的作业优先级越高;K8s 则建议把长尾低优任务放入独立的 QoS 类别,避免被高优任务无限抢占。
超卖故障。运维同学把团队配额从 100 卡调到 500 卡,以为“多给点总是好的”。但物理集群只有 300 卡。瞬间 500 个任务被放行进集群,节点上 CPU 负载飙到 400%,GPU 显存溢出,全部任务 OOM 崩溃——超卖故障。配额设计必须保持“配额总和 与 物理资源”匹配(或刻意超卖并配套驱逐策略),否则门禁放行太多人,屋里全是人叠人。
死锁场景。最诡异的是两个团队互相“卡脖子”:A 团队持有一台 8 卡节点上的 4 张卡,等 B 团队释放 GPU;B 团队持有另一台节点,等 A 释放 CPU 资源。双方都不释放,任务永远僵持。实际调度器用依赖检测、弹性迁移或超时强杀来打破死锁。事故不是配额的错,而是配额设计缺少对极端场景的预案。
最佳实践:宿舍管理手册
崔阿姨的经验最终沉淀成一本手册。第一条:配额设计必须自上而下——先统计整楼容量,再按团队业务重要性和历史用量分权重,最后用公式算每个团队的初始配额。不要“拍脑袋给数字”,以 sreport 或监控系统的真实数据为准。没有数据的配额设计,就像不看楼层图纸就乱分房间。
第二条:团队协商与动态调整。配额不是签了字就一劳永逸。每周与各团队对齐需求——上线前的算法团队需要临时冲刺配额,数据团队在收敛期可以缩减额度。Slurm 用 sacctmgr modify account set GrpTRES 动态更新;K8s 直接修改 ResourceQuota 对象即可。要让“改配额”成为一个低摩擦的流程,而不是层层审批的马拉松。
第三条:成本控制。GPU 是 AI 时代最贵的“电费”。给团队配额的同时也要给“预算意识”:展示每个账户的 GPU 卡时消耗、CPU 小时数、收支账单。Slurm 提供 sacct 做计费审计,K8s 生态有 Kubecost 等工具。配额不单是技术指标,更是财务工具——把集群当成资源生意来经营,每个团队都是要交租金的住户。
第四条:持续调优。观察周期建议“月度复盘”:找出利用率最低的团队、长期排队任务、异常高的配额闲置率,然后迭代下一轮配额。好的配额制度像一个会自动呼吸的有机体,而不是铁板一块的管理规则。手册的第一页永远写着:一切配额都可以改,只要你用数据说话。
AI 应用场景
大模型训练任务的 GPU 配额分配
阶段:资源规划与配额管理
解决的问题:传统方式下,训练平台管理员手工分配 GPU,某团队一次拿 200 卡跑满整个集群,其他团队的测试任务排队多天。配额化以后,各团队在 Slurm 中有明确的 GrpTRES 上限,无法超额占用,训练与测试互不干扰,集群整体利用率显著提升。
具体案例:某自动驾驶公司内部集群有 512 张 A100,算法团队、仿真团队、数据标注团队共用。管理员在 Slurm 上为每个账户配置 QoS 与 GrpTRES:仿真团队配额 256 卡、算法团队 128 卡、标注团队 64 卡,并启用抢占规则,保证仿真高峰时段可抢占标注低优任务。
多团队共享 Kubernetes 集群的公平调度
阶段:资源隔离与限制
解决的问题:传统方式下,一个团队的高负载 Pod 可能占满整个节点,其他团队的 Pod 无限等待。K8s 的 ResourceQuota 与 LimitRange 在命名空间级别做硬隔离,再配合 Pod 优先级保证共享集群的高可用,防止“一个租户带崩所有人”。
具体案例:某互联网公司用容器化部署 AI 推理服务,几十个业务线共享一个 K8s 集群。平台团队为每个业务线设 ResourceQuota(CPU 16 核、内存 32 Gi),并设置默认 LimitRange(每 Pod 最多 4 核 8 Gi),防止个别服务占用过多节点资源导致其他业务线故障。
突发流量的弹性配额
阶段:动态扩缩容与突发配额
解决的问题:传统方式下配额固定,电商大促或竞赛冲刺时服务扩容被配额卡住,导致高峰期响应超时。弹性配额(Burst)结合 HPA 与集群自动扩缩容,在高峰时自动扩容 Pod 与节点,低谷时回收,兼顾服务质量与账单成本。
具体案例:某 AI 推理服务在大促期间流量翻 5 倍,平台通过 HPA 将 Pod 副本从 20 升到 100,同时 K8s 的 Cluster Autoscaler 将节点从 8 台扩到 20 台。配额设计时预留了 burst 缓冲,大促后自动回收,账单依然可控。
Python 演示
"""极简集群配额模拟器:展示 Slurm/K8s 中按团队配额排队与补位的核心逻辑。"""from collections import deque class ClusterQuota: def __init__(self, quota_map): self.quota_map = quota_map self.usage = {team: 0 for team in quota_map} self.wait = {team: deque() for team in quota_map} self.granted = 0 def submit(self, team, cpu): """提交任务:配额内有空位直接分配,否则进队等待。""" if self.wait[team] or self.usage[team] + cpu > self.quota_map[team]: self.wait[team].append(cpu) return "queued" self.usage[team] += cpu self.granted += 1 return "running" def finish(self, team, cpu): """任务完成释放资源,并从等待队列中补位。""" self.usage[team] = max(0, self.usage[team] - cpu) moved = 0 while self.wait[team] and self.usage[team] + self.wait[team][0] <= self.quota_map[team]: need = self.wait[team].popleft() self.usage[team] += need self.granted += 1 moved += 1 return moved def snapshot(self): return {t: {"使用": self.usage[t], "排队": len(self.wait[t])} for t in self.quota_map} def demo(): q = ClusterQuota({"alpha": 24, "beta": 16, "gamma": 16}) steps = [ ("submit", "alpha", 8), ("submit", "beta", 16), ("submit", "gamma", 8), ("submit", "alpha", 16), ("submit", "gamma", 12), ("submit", "beta", 4), ("finish", "alpha", 8), ("finish", "gamma", 8), ("submit", "alpha", 8), ("finish", "beta", 16), ] for step in steps: op, team, cpu = step if op == "submit": result = q.submit(team, cpu) print(f"[提交] {team} 申请 {cpu} 核 -> {result}") else: moved = q.finish(team, cpu) print(f"[完成] {team} 释放 {cpu} 核 -> 补位 {moved} 个任务") print(" 状态:", q.snapshot()) print("总成功分配任务数:", q.granted) if __name__ == "__main__": demo()
self.quota_map = quota_map保存每个团队的配额上限,相当于崔阿姨账本上的“房间最大人数”。submit(self, team, cpu)提交新任务时先查配额,没超就分配,超了就进等待队列。if self.wait[team] or self.usage[team] + cpu > self.quota_map[team]:一旦该团队已有任务在排队,新任务也必须排队,防止插队乱序。self.wait[team].append(cpu)把任务请求放入队列,对应 Slurm 中作业排队等待调度。finish(self, team, cpu)任务完成释放资源,触发“补位”逻辑。while self.wait[team] and self.usage[team] + self.wait[team][0] <= self.quota_map[team]:只要队列头部任务能塞进配额剩余空间,就把它推出队列开始运行。
常见误区
误区把团队配额从 100 卡调到 500 卡,训练速度应该翻五倍吧?毕竟“资源多了嘛”。
正解配额只是“允许使用的上限”,不是“实际分到的资源”。物理集群总共只有 300 卡,你把配额改成 500,任务照样只能在 300 卡上排队。而且配额定得超过物理容量,反而会引发超卖:调度器放行大量任务,节点资源不够用,全部任务 OOM 崩溃。正确的做法是先看物理总容量,再按业务权重分配,而不是盲目调大数字。
为何常见:人们容易把“配额”误解为“分配到的资源”,就像把“信用卡额度”当成“银行卡余额”——额度再高,账户里没钱也取不出来。
误区K8s 不是很智能吗?它会自动帮每个 Pod 分配资源,不需要我们手动配什么 ResourceQuota 吧?
正解K8s 的调度器只是一套“执行规则”的机器,规则本身需要人来定。如果不配置 ResourceQuota 和 LimitRange,任何一个 Pod 都可以声明巨大的资源请求,占满整个节点的 CPU 和内存,导致其他 Pod 被驱逐。K8s 提供了 cgroup 做容器隔离,但“谁能用多少”是策略问题,必须由平台管理员通过配额对象来声明。
为何常见:初学者把“自动化”等同于“自动优化”,忽略了自动化的前提是“人工定义策略”——就像智能门禁也要先有人告诉它“哪些人能进”。
误区我的任务提交后第二天还在排队,是不是调度器出 bug 了?要不要重启集群?
正解排队是配额制度和优先级机制的正常表现。任务排队说明集群资源暂时不足,或该任务的优先级不够高,调度器按规则把它延后了。排查时用 squeue 查看 Reason 列(例如 Resources 表示资源不足),或 kubectl describe pod 看 Events 中的 FailedScheduling 原因。盲目重启集群反而会让所有队列状态丢失,造成更大损失。
为何常见:人们习惯了“提交即运行”的本地电脑模式,不理解分布式调度器中“排队等待”是设计的一部分——就像饭点去食堂,排队是常态,不是食堂坏了。
误区K8s 里 requests 和 limits 都填一样的数字最简单,反正都是限制资源用的。
正解两者语义完全不同。requests 是调度器用来做“放置决策”的保底份额——调度器保证节点至少有这么多资源给 Pod;limits 是运行时强制上限——超过就会被 cgroup 限流或 OOM。将两者都填成相同数值虽然可行,但失去了“超卖”能力:requests 小于 limits 时,节点可以塞进更多 Pod 提高利用率,就像宿舍允许“四人间的床先按三人铺,有人来再挤一挤”。合理分配 requests 和 limits 是 K8s 资源优化的重要手段。
为何常见:官方文档把两者并列列出,初学者不深究语义差异,以为只是“上限”的两种写法。
面试题
Q1. 在 Slurm 中,限制某个账户最多使用 100 个 CPU 核的机制属于?
- A.资源配额(Quota)← 正确答案
- B.节点预留(Reservation)
- C.作业依赖(Dependency)
- D.拓扑感知(Topology)
答案:A。资源配额定义“最多能用多少”的上限,对应 Slurm 的 GrpTRES 等参数。节点预留是提前锁定时段和节点;作业依赖控制作业先后关系;拓扑感知关注网络布局,都与配额无关。就像“宿舍最多住 4 人”是配额,“这间房周五留给考研组”是预留。
Q2. 在 Kubernetes 中,ResourceQuota 与哪个对象绑定最紧密?
- A.Namespace← 正确答案
- B.NodePool
- C.Ingress
- D.ServiceAccount
答案:A。ResourceQuota 是命名空间级对象,对该命名空间内所有 Pod 的总资源做限制。NodePool 是节点分组概念,Ingress 管理七层路由,ServiceAccount 管身份权限,都与资源总量控制无直接关系。
Q3. 下列关于配额与限制的描述,正确的是?
- A.配额等于实际分配到资源
- B.配额是允许使用的上限← 正确答案
- C.配额会随任务实时增加
- D.配额只能管理员可删除
答案:B。配额是“上限许可”而非实物分配,物理上能否满足由调度器根据节点资源决定。配额不会因任务提交而自动增长,需要管理员调整。就像信用卡额度是消费上限,不等于卡里真的有那么多钱。
Q4. Slurm 的 QoS 机制最核心的作用是什么?
- A.提高作业运行速度
- B.定义优先级配额与抢占资格← 正确答案
- C.自动修复故障的节点
- D.镜像创建容器实例
答案:B。QoS(服务质量)定义作业的优先级、资源上限与抢占资格,决定“谁先进、谁能抢”。它不直接加速作业运行,不修复节点,更不涉及容器镜像。类比崔阿姨给不同楼层签发的取水卡:等级不同,权限不同。
Q5. 某团队将 ResourceQuota 的 limits 从 8 核调到 16 核,但 16 个申请 1 核的 Pod 仍只有 8 个能启动。最可能的原因是?
- A.配额变更没有生效
- B.节点可用 CPU 不足← 正确答案
- C.Pod 镜像存在问题
- D.网络策略阻断了流量
答案:B。配额只是“允许上限”,实际能否启动取决于节点可分配资源是否足够。16 个 1 核 Pod 需要 16 核可用,若节点只剩 8 核,调度器无法放置其余 8 个,Pod 会处于 Pending 状态。就像门禁放你进楼,但楼里没床,你只能站着等。
Q6. 加权公平共享中,分配比例由什么决定?
- A.权重占比来决定← 正确答案
- B.历史的使用量
- C.随机抽签的方式
- D.提交时间的先后
答案:A。加权公平共享按权重成比例分配资源:权重高拿的配额高。历史使用量用于 FairShare 动态调整,随机抽签和先来先服务都不是加权公平的核心机制。就像分蛋糕时,手里盘子大的人拿到的份额自然更大。
Q7. 集群利用率 U = 实际使用总和 / 配置总和,某集群 10 个节点各 8 卡 GPU,某时刻 60 卡被占用,则 U 是多少?
- A.60%
- B.75%← 正确答案
- C.80%
- D.85%
答案:B。总配置容量为 10 × 8 = 80 卡,实际占用 60 卡,利用率 = 60 / 80 = 75%。这相当于 80 张床住了 60 人,入住率七成五,还有 20 卡闲置。
Q8. 下面哪些机制属于 Slurm/K8s 常见的“配额限制”手段?
- A.Slurm 的 Partition← 正确答案
- B.K8s 的 ResourceQuota← 正确答案
- C.K8s 的 HPA 自动扩缩
- D.Slurm 的 QoS← 正确答案
答案:ABD。Partition 通过物理分区实现硬隔离,ResourceQuota 限制命名空间资源总量,QoS 定义用户级配额与优先级,这三者都是配额限制手段。HPA 是弹性扩缩容组件,负责“加房间”,不是限制手段。
Q9. 关于“资源超卖(overcommit)”,下列说法正确的是?
- A.多 Pod 请求总和可超节点容量← 正确答案
- B.限制总和必须小于节点容量
- C.超卖提高利用率但会争抢← 正确答案
- D.Slurm 中称为 OverSubscribe← 正确答案
答案:ACD。K8s 中多个 Pod 的 requests 总和可以超过节点容量,这是超卖的基础;limits 总和同样可以超过节点容量,B 错误。超卖提高了资源利用率,但资源争抢时可能触发限流或 OOM。Slurm 通过 OverSubscribe 参数允许同一节点超额运行,概念一致。就像宿舍名义上住 4 人,高峰期挤 6 人,能住下但可能打地铺。
Q10. 任务长时间排队,为排查根因应检查哪些信息?
- A.查看账户已用配额量← 正确答案
- B.检查队列的优先级← 正确答案
- C.确认是否有空闲节点← 正确答案
- D.查看 Pod 内应用日志
答案:ABC。排队根因通常是三类:配额用尽(A)、优先级不足(B)、节点无匹配资源(C)。D 是排查已运行任务的状态,与排队原因无关。如同食堂排队,要么是你饭卡限额用尽,要么是你排队优先级低,要么是窗口没位子——跟窗口里菜好不好吃无关。