容量评估与压力测试

容量评估回答两个问题:现在能扛多少,以及大促或新功能上线需要多少机器。估错的代价是双向的:估低了线上被打挂,估高了资源长期闲置。本章给出从业务指标推导资源需求的标准步骤、单机容量标定方法与压测指标,并附一张容量规划表模板。

评估步骤

1. 业务指标 → 技术指标
   日活 100 万、人均 20 次请求 → 日请求 2000 万
2. 峰值系数
   按历史曲线取峰值/均值比(常见 3~10 倍),大促场景单独评估
   QPS峰值 = 日请求 / 86400 × 峰值系数
3. 单机容量标定
   压测得到单机可稳定承载的 QPS,取其中 70% 作为安全水位
4. 资源换算
   实例数 = 峰值QPS / 单机安全QPS,向上取整后再留冗余
5. 存储与带宽
   存储 = 日增数据量 × 保留天数 × 副本数;带宽 = 响应体大小 × QPS

示例:日请求 2000 万、峰值系数 5,则峰值 QPS ≈ 2000万 / 86400 × 5 ≈ 1157;若单机安全 QPS 为 300(压测 400 打七折),至少需要 4 台,考虑故障冗余与滚动发布再加 1~2 台,最终按 6 台准备。

单机容量标定

标定的关键是“稳定”而不是“极限”:把并发从低到高逐档加压,记录 QPS 与 P99,找到 P99 开始陡增的拐点。

并发  50 → QPS  300,P99  20ms   舒适区
并发 200 → QPS  900,P99  45ms   可用区
并发 400 → QPS 1100,P99 300ms   拐点,QPS 增长停滞
并发 800 → QPS 1050,P99   2s   过载,吞吐不升反降

拐点之后继续加并发,吞吐不再增长而延迟暴涨,这是排队效应。生产配置取拐点前 70% 对应的能力,并把拐点本身作为扩容触发线。

压测方法与工具

工具特点命令示意
wrk多线程加事件驱动,压 HTTP 吞吐能力强wrk -t4 -c200 -d60s --latency http://host/api
ab简单易上手,功能较少,适合快速验证ab -n 10000 -c 200 http://host/api
JMeter图形化,支持复杂业务链路与参数化场景脚本 + 聚合报告
全链路压测在生产环境染色压测,最接近真实需要流量标记与数据隔离
# wrk:4 线程、200 连接、持续 60 秒,输出延迟分位
wrk -t4 -c200 -d60s --latency "http://127.0.0.1:8080/api/order/list"

# ab:共 10000 个请求、200 并发
ab -n 10000 -c 200 http://127.0.0.1:8080/api/order/list

压测必须守三条纪律:在类生产环境压测、压测数据量级与真实一致、压测流量可识别并隔离(避免压测订单污染真实用户数据)。

关键指标

指标含义参考做法
QPS/TPS吞吐量与设计容量对比,看是否达标
P99/P95 延迟长尾延迟比平均值重要,平均值会掩盖长尾
错误率失败请求占比通常要求低于 0.1%,并区分自身错误与依赖错误
饱和度CPU、内存、连接池、队列使用率任一项长期高于 70% 就要扩容或优化
依赖负载数据库 QPS、慢查询数、缓存命中率单机能力的真正上限常在下游

只看平均值是常见误区:平均值 50ms 而 P99 是 3s,说明有 1% 的用户体验极差,而这 1% 往往正是大客户或高价值用户。

限流与扩容阈值

把“该扩容的线”和“不能超过的线”分开设定:

扩容阈值 ≈ 单机安全能力的 60%   提前扩容,留出弹性时间
限流阈值 ≈ 单机安全能力的 90%   保护自己不被拖垮
熔断阈值 ≈ 依赖错误率 > 50% 持续 10 秒   快速失败,避免线程堆积

阈值需要被验证过:新系统或大促前按真实峰值做过预演,未经验证的阈值等同于没有阈值。

容量规划表模板

模块峰值QPS单机安全QPS实例数冗余日增数据保留期备注
商品详情20000200010+2忽略-缓存命中率 95%
下单30005006+250 万行3 年写入需评估分表
支付回调15004004+230 万行5 年幂等表增长快
搜索600012005+1索引 20GB1 年搜索引擎集群单独计

填完这张表,容量评审的争论点会从“感觉不够”变成“哪个数字需要修正”,这正是容量评估最大的价值。

小结:容量评估的公式很短——峰值 QPS = 日请求 / 86400 × 峰值系数,实例数 = 峰值 QPS / 单机安全 QPS;难点在于单机容量标定与压测数据的可信度,因此要在类生产环境按真实数据量级压测,用 P99 与饱和度而非平均值决策,并把扩容、限流、熔断三档阈值固化下来。

笔记加载中…