崔阿姨是青柳大学 7 号宿舍楼的宿管,管着一栋楼、8 个楼层、每层 20 个房间。新生入住时,每间宿舍会领到一张“入住卡”:最多住 4 人、每月用电 40 度、每层公共热水房限时开放。你以为规则定完就万事大吉?不,A 层四个房间挤了 16 人,B 层只住 8 人却霸着朝阳的房间;深夜一二十个学生同时想用电吹风,崔阿姨就得举着手电筒从一楼爬到八楼,看谁家电流超了、哪间房还能再加一张床。她的终极难题是:怎样让整栋楼住得满满当当,又不让任何一层打架。 这其实就是 AI 算力集群中“资源配额与限制”要解决的事。Slurm 像崔阿姨用了二十年的纸质账本——规则分明、老辣可靠;K8s 则像一台联网的智能管理 App——自动检查、实时门禁。但无论工具是什么,宿管的核心工具永远是一句话:你最多能用多少,超过多少就要被拦下。

岗位关联

对 AI 从业者的价值:GPU 集群是 AI 训练的命脉,配额设计直接决定团队产能与账单之间的平衡,是大模型时代 AI 工程师绕不开的资源规划课。

目录
  1. 可视化演示
  2. 基础概念:入住卡上的三个数字
  3. 调度器视角:宿管阿姨的全局视角
  4. Slurm配额:一本用了二十年的纸质账本
  5. K8s配额:会联网的智能门禁
  6. 算法原理:分蛋糕的精确数学
  7. 性能优化:让宿舍住得更满
  8. 实际案例:宿舍事故现场还原
  9. 最佳实践:宿舍管理手册
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示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)给出了一个朴素而优雅的答案:先让所有需要小份的人吃饱,再把剩余的继续分给需要大份的人。这在排队模型里表现为多级反馈队列:短任务优先快速通过,长任务让位与后补。当有任务长期等待时,“老化”机制会逐步提升它的优先级,防止饿死。抢占策略则解决另一个问题:当高优先任务插队且资源不足时,调度器把低优先级任务暂时挂起,先让位。数学保证了规则的可计算性,也让“分蛋糕”不再是宿管拍脑袋。

Qi=Btotal×Wi∑j=1nWjQ_i = B_{\text{total}} \times \frac{W_i}{\sum_{j=1}^{n} W_j}
这个公式的意思是:团队 i 的配额 = 集群总资源 × 该团队权重在全体权重中的占比。权重是“话语权”,比例是“分蛋糕的刀子”。
  1. 团队权重 $W_i$第 i 个团队的权重值,代表它在集群中的“地位系数”——答辩季给毕业班加权,重要业务组权重大。权重是人为配置的输入参数,来自管理员对业务重要性的判断。
    WiW_i
  2. 总权重池 $\sum_{j=1}^{n} W_j$把所有 n 个团队的权重全部加起来,得到一个“基准分母”。它决定了整个集群的话语权总和,是衡量单个团队占比的依据。
    ∑j=1nWj\sum_{j=1}^{n} W_j
  3. 份额比例 $\frac{W_i}{\sum_{j=1}^{n} W_j}$团队 i 的权重除以总权重,得到它在整个集群中的“份额比例”。这是一个介于 0 到 1 之间的数,表示该团队在蛋糕中的理论占比。
    Wi∑j=1nWj\frac{W_i}{\sum_{j=1}^{n} W_j}
  4. 资源总量 $B_{\text{total}}$集群可分割的总资源,包括 GPU 卡数、CPU 核数、内存总量等。它是蛋糕本身的大小,由物理硬件决定,不随配额调整而改变。
    BtotalB_{\text{total}}
  5. 相乘得配额 $Q_i$用资源总量乘以份额比例,得到团队 i 的配额上限。这是调度器实际执行时使用的限额数字——比如总池 100 卡、团队占比 30%,则配额就是 30 卡。
    Qi=Btotal×Wi∑j=1nWjQ_i = B_{\text{total}} \times \frac{W_i}{\sum_{j=1}^{n} W_j}

性能优化:让宿舍住得更满

制度定好了,崔阿姨还想让每层楼都住得满满的。首先要有“台账”——监控指标。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=1nui∑i=1nCiU = \frac{\sum_{i=1}^{n} u_i}{\sum_{i=1}^{n} C_i}
通俗理解:把所有节点的“实际占用”加起来,除以所有节点的“标称容量”之和,得到整个集群的“入住率”。
  1. 节点用量 $u_i$第 i 个节点当前实际使用的资源量,比如某台 8 卡 GPU 服务器上住了 6 个任务,$u_i$ 就是 6。
    uiu_i
  2. 节点容量 $C_i$第 i 个节点的标称容量,即这台机器总共有多少资源。8 卡服务器的 $C_i$ 就是 8。
    CiC_i
  3. 集群总用量 $\sum_{i=1}^{n} u_i$把所有 n 个节点的实际用量逐一相加,得到整个集群的“已入住人数”。这是监控台上最直接的一个数字。
    ∑i=1nui\sum_{i=1}^{n} u_i
  4. 集群总容量 $\sum_{i=1}^{n} C_i$把所有节点的容量全部加起来,得到集群的“总床位数”。它决定了宿舍楼能容纳多少任务。
    ∑i=1nCi\sum_{i=1}^{n} C_i
  5. 利用率 $U$二者相除得到集群整体利用率。理想区间通常在 70%-85%:太低说明资源闲置浪费,太高则意味着排队严重、任务响应慢。
    U=∑i=1nui∑i=1nCiU = \frac{\sum_{i=1}^{n} u_i}{\sum_{i=1}^{n} C_i}

实际案例:宿舍事故现场还原

排队风暴。某个星期天晚上,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 演示

python57 行
"""极简集群配额模拟器:展示 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()
目的:用 Python 模拟调度器的配额检查与排队补位机制,演示“配额是上限许可,排队是超额后的兜底”这一核心思想。
  1. self.quota_map = quota_map保存每个团队的配额上限,相当于崔阿姨账本上的“房间最大人数”。
  2. submit(self, team, cpu)提交新任务时先查配额,没超就分配,超了就进等待队列。
  3. if self.wait[team] or self.usage[team] + cpu > self.quota_map[team]:一旦该团队已有任务在排队,新任务也必须排队,防止插队乱序。
  4. self.wait[team].append(cpu)把任务请求放入队列,对应 Slurm 中作业排队等待调度。
  5. finish(self, team, cpu)任务完成释放资源,触发“补位”逻辑。
  6. 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 核的机制属于?

单选题 · easy

  • A.资源配额(Quota)← 正确答案
  • B.节点预留(Reservation)
  • C.作业依赖(Dependency)
  • D.拓扑感知(Topology)

答案:A。资源配额定义“最多能用多少”的上限,对应 Slurm 的 GrpTRES 等参数。节点预留是提前锁定时段和节点;作业依赖控制作业先后关系;拓扑感知关注网络布局,都与配额无关。就像“宿舍最多住 4 人”是配额,“这间房周五留给考研组”是预留。

Q2. 在 Kubernetes 中,ResourceQuota 与哪个对象绑定最紧密?

单选题 · easy

  • A.Namespace← 正确答案
  • B.NodePool
  • C.Ingress
  • D.ServiceAccount

答案:A。ResourceQuota 是命名空间级对象,对该命名空间内所有 Pod 的总资源做限制。NodePool 是节点分组概念,Ingress 管理七层路由,ServiceAccount 管身份权限,都与资源总量控制无直接关系。

Q3. 下列关于配额与限制的描述,正确的是?

单选题 · easy

  • A.配额等于实际分配到资源
  • B.配额是允许使用的上限← 正确答案
  • C.配额会随任务实时增加
  • D.配额只能管理员可删除

答案:B。配额是“上限许可”而非实物分配,物理上能否满足由调度器根据节点资源决定。配额不会因任务提交而自动增长,需要管理员调整。就像信用卡额度是消费上限,不等于卡里真的有那么多钱。

Q4. Slurm 的 QoS 机制最核心的作用是什么?

单选题 · mid

  • A.提高作业运行速度
  • B.定义优先级配额与抢占资格← 正确答案
  • C.自动修复故障的节点
  • D.镜像创建容器实例

答案:B。QoS(服务质量)定义作业的优先级、资源上限与抢占资格,决定“谁先进、谁能抢”。它不直接加速作业运行,不修复节点,更不涉及容器镜像。类比崔阿姨给不同楼层签发的取水卡:等级不同,权限不同。

Q5. 某团队将 ResourceQuota 的 limits 从 8 核调到 16 核,但 16 个申请 1 核的 Pod 仍只有 8 个能启动。最可能的原因是?

单选题 · hard

  • A.配额变更没有生效
  • B.节点可用 CPU 不足← 正确答案
  • C.Pod 镜像存在问题
  • D.网络策略阻断了流量

答案:B。配额只是“允许上限”,实际能否启动取决于节点可分配资源是否足够。16 个 1 核 Pod 需要 16 核可用,若节点只剩 8 核,调度器无法放置其余 8 个,Pod 会处于 Pending 状态。就像门禁放你进楼,但楼里没床,你只能站着等。

Q6. 加权公平共享中,分配比例由什么决定?

单选题 · mid

  • A.权重占比来决定← 正确答案
  • B.历史的使用量
  • C.随机抽签的方式
  • D.提交时间的先后

答案:A。加权公平共享按权重成比例分配资源:权重高拿的配额高。历史使用量用于 FairShare 动态调整,随机抽签和先来先服务都不是加权公平的核心机制。就像分蛋糕时,手里盘子大的人拿到的份额自然更大。

Q7. 集群利用率 U = 实际使用总和 / 配置总和,某集群 10 个节点各 8 卡 GPU,某时刻 60 卡被占用,则 U 是多少?

单选题 · mid

  • A.60%
  • B.75%← 正确答案
  • C.80%
  • D.85%

答案:B。总配置容量为 10 × 8 = 80 卡,实际占用 60 卡,利用率 = 60 / 80 = 75%。这相当于 80 张床住了 60 人,入住率七成五,还有 20 卡闲置。

Q8. 下面哪些机制属于 Slurm/K8s 常见的“配额限制”手段?

多选题 · mid

  • A.Slurm 的 Partition← 正确答案
  • B.K8s 的 ResourceQuota← 正确答案
  • C.K8s 的 HPA 自动扩缩
  • D.Slurm 的 QoS← 正确答案

答案:ABD。Partition 通过物理分区实现硬隔离,ResourceQuota 限制命名空间资源总量,QoS 定义用户级配额与优先级,这三者都是配额限制手段。HPA 是弹性扩缩容组件,负责“加房间”,不是限制手段。

Q9. 关于“资源超卖(overcommit)”,下列说法正确的是?

多选题 · extreme

  • A.多 Pod 请求总和可超节点容量← 正确答案
  • B.限制总和必须小于节点容量
  • C.超卖提高利用率但会争抢← 正确答案
  • D.Slurm 中称为 OverSubscribe← 正确答案

答案:ACD。K8s 中多个 Pod 的 requests 总和可以超过节点容量,这是超卖的基础;limits 总和同样可以超过节点容量,B 错误。超卖提高了资源利用率,但资源争抢时可能触发限流或 OOM。Slurm 通过 OverSubscribe 参数允许同一节点超额运行,概念一致。就像宿舍名义上住 4 人,高峰期挤 6 人,能住下但可能打地铺。

Q10. 任务长时间排队,为排查根因应检查哪些信息?

多选题 · hard

  • A.查看账户已用配额量← 正确答案
  • B.检查队列的优先级← 正确答案
  • C.确认是否有空闲节点← 正确答案
  • D.查看 Pod 内应用日志

答案:ABC。排队根因通常是三类:配额用尽(A)、优先级不足(B)、节点无匹配资源(C)。D 是排查已运行任务的状态,与排队原因无关。如同食堂排队,要么是你饭卡限额用尽,要么是你排队优先级低,要么是窗口没位子——跟窗口里菜好不好吃无关。