容量预测、水位阈值与扩容决策
容量规划回答三个问题:现在够不够、什么时候不够、扩多少。指标要看峰值而不是平均值,扩缩容要看 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。
容量评审决策规则:
合上页面,先回答,再展开对照。