详细解释
自动扩缩容(Autoscaling,简称 AS)是云原生与大模型推理服务中的核心资源调度能力,指系统根据实时负载(如 GPU/CPU 利用率、请求队列深度、P99 延迟、QPS、消息队列堆积长度等)在无人干预的前提下,自动增加副本数(扩容)或减少副本数(缩容),从而在「流量高峰时避免服务雪崩」与「流量低谷时避免算力浪费」之间达成最优平衡。对 LLM 推理服务来说,单个 GPU 副本每小时费用高达几十元,自动扩缩容通常可在不降低 延迟百分位 的前提下,将月度 GPU 成本下降 30% 至 60%。
自动扩缩容的实现谱系可分为五大类:(1) HPA(Horizontal Pod Autoscaler,水平扩缩容):Kubernetes 原生方案,基于 CPU/GPU 利用率、自定义指标增减 Pod 副本数,最通用;(2) VPA(Vertical Pod Autoscaler,垂直扩缩容):自动调整单个 Pod 的 CPU/GPU/内存规格,适合有状态服务或单机就能扛住的轻量场景;(3) KEDA(Kubernetes Event-Driven Autoscaling):事件驱动扩缩容,基于 Kafka/RabbitMQ/Redis 队列长度、Prometheus 自定义指标等扩缩容,对异步批处理任务极友好;(4) 队列驱动(Queue-based)的 LLM 专用扩缩容:基于推理请求在 GPU 前排队的平均等待时长、Pending 请求数、P99 延迟阈值等触发;(5) 预测式扩缩容(Predictive):基于历史流量模式(如每天 9-12 点高峰)提前扩容,彻底消除 HPA 「滞后反应」的冷启动空窗。
唯元智创 的 API 网关默认提供「预测 + 队列驱动 + HPA」的三级混合自动扩缩容:预测层提前 30 分钟为可预期的历史高峰预热 20% 至 30% 副本;队列驱动层在 P99 排队等待时长超过 200ms 时秒级触发扩容;HPA 做兜底的 CPU/GPU 利用率兜底;同时每 24 小时回放近 7 天真实流量与成本曲线,持续优化「目标利用率 / 扩容阈值 / 缩容冷却时间」三组参数。也可与 多地域容灾 的跨地域负载调度结合使用。
五种主流自动扩缩容方案对比表
| 方案名称 | 核心指标来源 | 扩容反应速度 | 适合场景 | LLM 推理适配度 | 落地复杂度 | 月度 GPU 成本节省率 | 推荐度 |
|---|---|---|---|---|---|---|---|
| HPA 水平扩缩容(原生 K8s) | CPU/GPU 利用率、QPS | 慢(1 至 3 分钟) | 通用 Web/API | 中(利用率指标滞后) | 极低 | 25% 至 40% | ⭐⭐⭐⭐ |
| VPA 垂直扩缩容 | 历史资源用量 | 慢(小时级/天级) | 单实例有状态服务、数据库 | 低(GPU 规格难动态改) | 低 | 15% 至 25% | ⭐⭐⭐ |
| KEDA 事件驱动 | 队列长度、Cron、自定义 PromQL | 中(秒级至 1 分钟) | 异步批处理、离线任务 | 高(离线推理/队列型) | 中 | 35% 至 55% | ⭐⭐⭐⭐⭐(异步场景) |
| Queue-based 队列驱动(LLM 专用) | 请求排队时长、Pending 数、P99 延迟 | 快(10 秒级) | LLM 在线推理、实时对话 | 极高 | 中高 | 40% 至 60% | ⭐⭐⭐⭐⭐(在线 LLM) |
| Predictive 预测式 | 历史流量时间序列 + ML 预测 | 最快(提前 5 至 60 分钟) | 有明显日/周规律流量 | 高(提前预热消除冷启动) | 高 | 40% 至 65% | ⭐⭐⭐⭐ |
实战经验与避坑
- LLM 在线推理的扩容触发指标一定不能只用「GPU 利用率」,必须引入「排队等待时长」:GPU 利用率是天然滞后的指标——当 GPU 利用率达到 70% 时,请求已经在队列里堆了好几十毫秒,P99 延迟已经暴涨;正确做法是用「推理请求队列平均等待时长(如 >200ms 连续 30 秒)」或「Pending 请求数 / 运行中副本数 > 某阈值」作为第一优先扩容触发,GPU 利用率做第二兜底;实践中仅这一项改动,P99 延迟就能比纯 GPU-HPA 下降 30% 至 50%。
- 缩容必须极度保守,冷却时间要比扩容慢 5 至 10 倍:扩错了(多开了几台 GPU)只是多花几十几百块钱;缩错了(把正在处理长请求的 Pod 杀了)会直接导致正在生成中的 20 至 100 条请求失败返回 5xx,用户体验严重受损,且 错误预算 被快速消耗。正确做法:① 缩容冷却窗口设 10 至 30 分钟,扩容冷却仅 1 至 2 分钟;② 缩容前先给 Pod 打 Draining 标记,停止接新请求,等待所有进行中请求处理完毕再 Kill;③ 每次缩容最多杀 N-1 副本中的 10% 至 20%,不做断崖式缩容。
- 务必留 5% 至 10% 的「永久热备副本」,即使利用率低也不缩:真实线上永远会有不可预期的流量脉冲(如一条小红书/微博火了、一次营销活动提前、某个大客户流量突增 5 倍),如果所有副本都按「刚好够用」来配,脉冲到来时 HPA 的 2 至 3 分钟冷启动时间足以让 P99 延迟冲到 30 秒以上,SLA 直接穿底;维持少量热备的成本极低(相比每次事故赔付 + 客户流失可忽略),却能在 90% 的脉冲场景下救场。
- HPA 目标利用率设置有黄金区间:LLM 推理推荐目标 GPU 利用率 = 60% 至 70%,不要设到 85% 以上:大模型推理的单个请求负载方差极大(输入 1K 输出 50 和输入 32K 输出 4K 的耗时可能差百倍),如果目标利用率设 85%,在真实方差下,平均 85% 的系统会有 30% 的时间跑到 95% 以上甚至 GPU OOM,尾部 P99 延迟会出现灾难性爆炸;60% 至 70% 的目标利用率是在「方差容忍」和「成本节省」之间的 Pareto 最优点,长期看综合成本最低。
- 预测式扩缩容的训练集必须剔除异常日,否则会放大错误:如果你的历史数据里包含「618 / 双 11 促销」「系统故障日」「周末异常低流量」这类特殊日子,不加过滤直接喂给预测模型,预测出来的曲线会在普通日错误地预测出高峰,导致不必要的 GPU 浪费;正确做法是先对历史流量做 3σ 异常剔除 + 日历特征(工作日/节假日/特殊活动标签)打标,再预测,普通日的预测准确率通常可达到 85% 至 93%。
- 新模型/新地域上线前务必做「扩容演练」,不要等真实流量来了才发现扩不起来:常见的扩容失败陷阱包括:① GPU 配额不够(云厂商给的总 A100 上限 16 卡,HPA 想扩到 20 卡直接失败);② 镜像拉取时间过长(大镜像 + PVC 挂载导致 Pod 启动要 8 分钟);③ 模型权重加载慢(未预热的权重冷启动花 5 分钟以上);④ 网络安全组/Service Mesh sidecar 注入失败。这些问题在流量真实来临前完全可以通过「手动扩容演练 + PDB/Disruption Budget 验证」提前发现并解决。