ARTICLE / 3 MIN READ
QPS、并发数与响应时间的容量估算方法
用 Little 定律和分层容量表,把“系统能扛多少流量”变成可以验证的数字。
容量规划最怕拍脑袋。只说“准备十台机器”没有意义,必须把用户量转换为请求量,再把请求量转换为 CPU、连接、缓存和磁盘的预算。
先区分四个指标
- QPS:每秒完成的请求数,适合描述接口吞吐。
- TPS:每秒完成的事务数,通常关注提交成功的业务事务。
- 并发数:同一时间处于处理中的请求数。
- P95/P99:尾部响应时间,决定用户是否感受到卡顿。
平均响应时间很好看,并不能掩盖少量请求被锁、慢 SQL 或 GC 拖到几秒的事实。容量目标至少要写成“峰值 3000 QPS,P99 小于 200ms,错误率低于 0.1%”。
用 Little 定律连接指标
Little 定律可以写成:
并发数 = 吞吐量 × 平均响应时间
如果接口稳定在 2000 QPS,平均响应时间 100ms,那么应用层平均并发约为 200。若 P99 变成 800ms,连接、协程和线程需求会同时放大,数据库连接池也可能先被耗尽。
从业务事件反推峰值
假设一次营销活动有 50 万用户,10% 在 5 分钟内打开页面,平均每人触发 8 次 API 请求:
总请求 = 500000 × 10% × 8 = 400000
平均 QPS = 400000 / 300 ≈ 1333
峰值 QPS = 平均 QPS × 2.5 ≈ 3333
2.5 不是固定答案,需要通过历史活动、埋点和压测修正。没有历史数据时,应把峰值系数、缓存命中率和重试率作为显式假设。
画出分层容量表
| 组件 | 单实例安全容量 | 目标峰值 | 需要实例 |
|---|---|---|---|
| API 服务 | 450 QPS | 3333 | 8 |
| Redis 分片 | 80000 ops/s | 120000 | 2 个分片 |
| 主库写入 | 1500 TPS | 900 | 1 主 + 1 备 |
| 消费者 | 250 条/s | 1200 | 6 |
单实例安全容量应取压测曲线中 P99 和错误率都满足目标的点,再留出 30% 至 50% 余量。不能把 CPU 跑到 95% 的极限吞吐当成生产容量。
连接池是隐藏上限
应用实例数增加后,数据库总连接数会线性增加。8 个实例、每个连接池 50,意味着数据库可能面对 400 个连接。若主库只能稳定处理 180 个活跃连接,就算应用还有 CPU,整体仍会排队。
更稳妥的做法是:
- 先确定数据库可接受的总连接数;
- 按实例数和读写比例分配连接池;
- 监控等待连接时间,而不只监控连接数;
- 把超时请求从连接池中及时释放。
压测验收
压测报告至少保留并发曲线、吞吐曲线、P50/P95/P99、错误分类、CPU、内存、GC、连接池、缓存命中率和数据库锁等待。用阶梯加压找到拐点,再用峰值流量持续 30 分钟验证稳定性。
容量数字只有在压测环境、数据量、缓存命中率和依赖版本都写清楚时,才具备可复用价值。
GITHUB DISCUSSION
评论与回复
评论保存在 GitHub Discussions,登录 GitHub 后即可参与,发布和回复都在本页完成。
评论区进入视口后自动加载。