3196 字
约 10 分钟
15
S16-A22 · 预算的两种用途:限额控制与容量预留放在一起
2024-12-31
2026-11-09

给每个团队划了资源额度,月初一切正常,利用率报表也漂亮。到了大促,几个团队同时扩容,全部撞上"申请不到"——不是没额度,是额度对应的资源根本不够;也不是没人提前申请,是提前申请的那部分被别人平时的用量吃掉了。

这套机制本来要干两件事:限制每个团队能用多少(限额控制),以及保证峰值时一定拿得到(容量预留)。它们被实现成了同一个数字:一个额度。而额度天然只能表达一种含义——要么是上限,要么是下限,不能同时是两者。共用之后,被牺牲的一定是预留那一侧:上限会被执行,下限只存在于账面。


1. 两种用途的分配逻辑相反

维度 限额控制 容量预留
目标 总量约束 + 团队间公平 峰值时确定能拿到
这个数字是什么 上限:不得超过 下限:不得少于
判据 周期用量不超上限,拒绝可解释 峰值窗口内资源可用,无需临时申请
分配逻辑 按历史用量与权重切分,可动态调整 按峰值独占,不可被他人消费
时间尺度 计费周期(月 / 日) 峰值时刻(分钟级)
失效形态 超限被拒(硬,立刻可见) 抢不到(软,表现为排队、超时、降级)
需要的机制 计量 + 上限 + 拒绝 独占 + 隔离 + 抢占规则
归谁管 财务 / 平台 容量规划 / SRE

一个数字被两种目的读取,含义就分叉了:

// 同一行额度记录
quota: team-a = 100 (cores)
// 限额读法:本周期最多用 100,超出即拒绝 → 这是上限
// 预留读法:峰值时刻必须能拿到 100 → 这是下限
// 上限与下限用同一个数字表达时,两者互相解释
// 结果:拒绝逻辑一定被执行(它有人工审批与告警),保障逻辑没人执行(它没有触发器)

2. 共用一个额度池的三个后果

后果 机理 症状
谁先用谁占 额度按周期累计,先到者占用,后到者被拒 月初宽松月末排队,与业务节奏完全无关
预留被挪用 预留只是账面数字,共享池允许"临时借用" 峰值时预留不生效,所有团队一起超限
峰值集体超限 各团队按均值申请,峰值叠加超过物理容量 "额度都够,但谁都跑不起来"

第三条可以算出来:各团队峰值不同时,叠加需求的上界是各自峰值之和;而按均值申请,峰值时的需求大约是均值的 2–5 倍(倍数按自己的流量曲线核对,不要套用)。也就是说,按均值核出来的额度,在峰值时刻注定不够——而额度是按周期结算的,周期内它看起来一直够。

// 均值核对与峰值核对的差额(示意,倍数按自己的曲线核)
// 团队 A:均值 30 核,峰值 90 核
// 团队 B:均值 20 核,峰值 70 核
// 均值口径合计:50 核 → 物理池 60 核,看起来通过
// 峰值口径合计:160 核 → 物理池 60 核,缺口 100 核
// 大促当天:额度都"没超",资源全部抢不到

3. 被牺牲的是预留的确定性

共用一套额度之后,被牺牲的是容量预留的确定性——也就是"峰值时一定拿得到"这个承诺。它会静默失效,原因是三件事同时成立:

  1. 预留失效没有触发器。超额拒绝有拒绝码、有告警、有工单;而"预留没生效"没有事件,它只表现为峰值时排队变长,被归因为流量太大。
  2. 挪用预留会让指标变好。把预留拿出来共享,利用率立刻上升——利用率是额度体系里最常被考核的指标,于是机制在奖励挪用。等到峰值,被考核的指标依然是"利用率",不是"满足率"。
  3. 超卖以债务形式存在,不进账单。例:按 1.3 倍超卖,平时账单漂亮,峰值时约三成需求拿不到资源;这笔债不体现在成本报表里,只体现在峰值满足率里,而后者往往没有指标。

"额度用完"与"资源不足"是两件不同的事,混在一起就无法判断该扩容还是该排队:

现象 真实含义 该做什么 误判的代价
请求被拒,原因是额度 计量口径的上限到了 调额度、借调、或排队降级 误判为容量不足 → 盲目扩容,成本上升而拒绝率不变
请求抢不到资源 物理容量不够,或预留已失效 扩容 / 恢复独占 误判为额度问题 → 调额度,峰值仍然抢不到
两者同时发生 额度与容量都紧 先恢复独占,再按峰值核容量 只处理一个 → 下次重复同样的事故

预留必须有独占性,否则它只是账面数字。可验证的预留至少满足三条:

// 预留的三项检查:缺一条,它就不是预留
// 1) 独占:别人能不能借走?能借走 = 不是预留
// 2) 可验证:峰值时刻能否实测"我确实拿到了"?不能测 = 无法追责
// 3) 有代价:被借走时借用方付什么?没有代价 = 借用必然发生
reserved(team-a, peak) = 100
actual  = min(quota, capacity_not_consumed_by_others)   // 峰值时实测
if actual < reserved → 记一次挪用,并且这是可追责事件

配额与优先级的关系是"有优先级才有借调规则":

借调机制 规则 失效方式
共享池 + 优先级抢占 高优先级可抢低优先级 低优先级没有 SLO,被反复抢占后彻底不可用
预留 + 借用登记 借用需登记并限期归还 归还不落实,等于永久挪用
硬隔离(独立资源池) 物理隔离,不可能被借 成本高、利用率低,需要接受浪费

突发流量的处理是这套机制最容易退化的地方:一旦"临时可借",预留当天就会被借空。三条规则缺一条,突发额度就变成人人可抢:

// 突发额度的三条约束
// 1) 突发只能来自共享池,永远不许动预留(一旦允许,预留就失去意义)
// 2) 抢占必须带优先级与回收时限(到期自动归还,不依赖人记着)
// 3) 被抢占方必须收到明确信号(降级 / 排队),否则它不知道自己已被降级
// 反例:只写"可临时借用",等于把预留变成了公共池,且没有任何归还记录

超卖比例是这套机制里唯一真正的债务,需要单独记账:

// 超卖的债算得出来,只是不以成本形式出现
// 承诺量 = 物理容量 × (1 + 超卖比例)
// 峰值缺口 = 承诺量 - 物理容量 = 物理容量 × 超卖比例
// 这笔债的偿付方式是"峰值时 x% 的请求排队或降级"
// 允许超卖的前提:峰值不同步 + 存在降级通道;两者缺一,超卖就是欠债

还有一处结构性错位值得单独指出:付钱的是成本中心,占额的是团队。团队多占不付钱,成本中心压缩不用资源,于是"额度调整谈判"取代了容量规划——每次大促前谈一轮数字,谈完谁都不负责峰值时刻的真实可用性。

额度调整周期与业务节奏的错配也是同一类问题:额度按月结算,业务按周变化,大促需要提前数周申请。于是额度窗口变成了发布窗口的瓶颈,紧急扩容走"特批",而特批不留记录、不进下一轮基线。

四个口径能把"确定性是否被牺牲"变成可观测事实:

quota_utilization             // 已用 / 额度;按周期看趋势,不看单点
reject_ratio_at_peak          // 峰值窗口内因额度被拒的比例
reservation_preemption_count  // 预留被挪用/借走的次数,应为 0 或极少
peak_satisfaction_ratio       // 峰值窗口内成功获得资源的请求占比 ← 关键
// 判据:利用率高 + 峰值满足率低 = 预留已被挪用,且指标在奖励这件事

4. 排错

现象 可能原因 验证方式 处置方向
大促时"额度都够但都跑不起来" 预留没有独占性 峰值实测各团队实际可获资源 恢复独占或改硬隔离
月度前松后紧 额度按周期累计,先到先得 看用量曲线形状与拒绝时间分布 改成峰值口径 + 借调规则
调了额度仍然被拒 混淆额度与容量 对比拒绝原因码(额度 vs 容量) 分开定位,分别扩容或排队
利用率很高但峰值满足率很低 挪用预留抬高了利用率 两个指标对着看 利用率不再作为唯一考核项
预留申请越批越多 没有到期与回收 统计预留总量与实际峰值 预留带到期日与季度复核
成本归属与额度归属不一致 付钱方与占额方不是同一责任人 对比成本中心与额度归属清单 归到同一责任人

5. 边界

场景 结论 理由
资源由单一团队独占 不需要额度体系 没有分配冲突,计量成本大于收益
成本可忽略(内部小集群) 正式额度是负担 管理成本高于浪费的绝对值
业务无峰值(负载平稳) 均值口径即可 峰值 ≈ 均值,预留没有意义
资源弹性极强(分钟级扩容) 用软配额 + 告警 容量不是稀缺品,确定性可以用速度换
团队数少于 3 口头协调更快 审批链与计量体系的固定成本过高
核心链路有强 SLO 必须硬预留 SLO 的确定性不能靠额度表达
// 最小可用体系:两本账,永远不要合并
// 账 A(限额):周期用量、上限、拒绝策略、超限告警  → 结算单位是钱
// 账 B(预留):峰值独占量、借出与归还记录、到期时间  → 结算单位是可用性
// 合并成一本账的那天,上限与下限开始互相解释,最后只剩一个能被执行的

6. 自测

  1. 为什么"额度"这个数字无法同时表达上限与下限?合并之后哪一侧会被执行?
  2. 按均值核额度,在峰值时刻会出现什么?缺口与哪些因素成正比?
  3. 预留要成为预留,必须同时满足哪三个条件?缺一个会怎样?
  4. 为什么"利用率"这个指标会奖励挪用预留?它应该和哪个指标一起看?
  5. "额度用完"与"资源不足"各自的处置动作是什么?误判的代价分别是什么?
  6. 什么情况下正式额度体系反而比不设额度更贵?
S16-A22 · 预算的两种用途:限额控制与容量预留放在一起
https://www.clxhxhhr.top/posts/6367/
作者
clxstart
发布于
2024-12-31
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。