capacity-forecasting

容量预测、水位阈值与扩容决策

补充说明

容量规划回答三个问题:现在够不够、什么时候不够、扩多少。指标要看峰值而不是平均值,扩缩容要看 request 而不是 limit。预测周期至少覆盖采购或节点启动的提前期;GPU、裸金属和专线通常要提前 1–3 个月。

扩容公式(按并发):所需副本 = ceil(峰值 QPS × P99 延迟(秒) / (单副本安全并发 × 目标利用率))。

常用示例

算例:峰值 2000 QPS,P99 50ms,单副本安全并发 50,目标利用率 70%:

awk 'BEGIN {qps=2000; lat=0.05; per=50; util=0.7; r=qps*lat/(per*util);
  printf "并发: %.0f,所需副本: %d\n", qps*lat, int(r)+(r>int(r))}'

容量水位阈值:

资源 预警 扩容触发 说明
CPU request 利用率 60% 75% 持续 15 分钟 按 request 算,不按 limit
内存 70% 80% 持续 15 分钟 看 RSS 趋势,防止 OOM
磁盘 75% 85% 预留 compaction、WAL、日志
连接池 70% 85% 先调池和查询,再扩实例
P99 延迟 SLO 的 80% 达到 SLO 延迟可能先于 CPU 暴露瓶颈

从历史数据做线性趋势预测:

# qps.csv 每行一个采样点,第二列为峰值 QPS,至少 6 周数据
awk -F, '{n++; x[n]=n; y[n]=$2; sx+=n; sy+=$2; sxx+=n*n; sxy+=n*$2}
END {b=(n*sxy-sx*sy)/(n*sxx-sx*sx); a=(sy-b*sx)/n;
  printf "每日增长 %.2f QPS,30 天后 %.0f QPS,60 天后 %.0f QPS\n",
  b, a+b*(n+30), a+b*(n+60)}' qps.csv

Kubernetes 资源申请基线:

resources:
  requests:
    cpu: "500m"
    memory: "512Mi"
  limits:
    memory: "1Gi"

不要给 CPU 设过低 limit,否则节流会造成延迟毛刺;内存 limit 要高于实际峰值,避免 OOMKilled。

容量评审决策规则:

易错点与排错

读完自测

合上页面,先回答,再展开对照。

  1. 为什么容量规划要看 request 而不是 limit?
  2. 预测峰值达到当前可分配容量的多少时应启动扩容?
  3. HPA 能替代容量规划吗?为什么?
答案
  1. Kubernetes 调度按 request 预留资源;limit 只限制运行上限,按 limit 计算会高估可调度容量。
  2. 70% 左右;留出突发、故障切换和扩容延迟的余量。
  3. 不能。HPA 只应对分钟级负载波动,无法解决节点、数据库、GPU 和采购提前期的问题。

相关条目