容量不够怎么演变成事故
回顾一下上一次大促事故,多半是这么个剧本:流量涨到平时的三倍,系统开始变慢、然后开始报错、最后直接挂掉。根因往往不是代码突然写崩,而是容量从来没规划过——不知道现在的机器到底能扛多少流量,所以也不知道三倍够不够。
容量规划要回答的就是这个问题:现在这套系统,正常能扛多少?峰值能扛多少?离扛不住还有多远?压测则是回答这个问题的手段——别等大促那天才知道答案。
在实验室里把它压垮,好过在大促当天被用户压垮。
- 压测在测试环境模拟高流量,先把系统压垮一次。
- 瓶颈定位找到慢在数据库、缓存还是应用层。
- 容量模型推算一台机器能扛多少 QPS,好按需扩容。
- 余量永远留着冗余,别把机器用满。
压测:先在实验室里压垮它
压测(压力测试)就是在测试环境人为制造高并发流量,看系统什么时候扛不住。常用工具里,JMeter 适合搭场景、上手快;想压更大规模可以用 wrk 或更专业的分布式压测平台。核心思路都一样:模拟真实用户请求,逐步加流量,记录每一档下的响应时间和错误率。
最简单的一轮压测流程:
1. 在测试环境准备和生产同等配置的一套系统
2. 从 100 并发开始,每档跑 5 分钟
3. 记录每档的:QPS、平均响应时间、错误率
4. 一直加压,直到响应时间明显变长或开始报错
5. 那个临界点,就是这套系统的容量上限
千万别在生产环境直接压——压测是为了发现极限,压崩测试环境没事,压崩生产就是事故了。
压测怎么设计:场景和目标
压测不是「越多人越好」,得按真实业务来设计场景。一个网站的真实流量构成里,首页打开、商品列表、下单这些接口的调用比例是不一样的——下单接口最重,却被调得少;首页最轻,却被调得最多。压测场景得按这个真实比例配比,而不是无脑全压首页。
还要定清楚目标:我们想达到多少 QPS?在这个 QPS 下,响应时间要在多少毫秒以内、错误率要低于多少?没有目标,压完了也不知道算不算合格。一般做法是:按历史峰值流量的 1.5 到 2 倍设目标,留好未来增长的余量。
找瓶颈:慢在哪一层
压到一定程度,系统开始变慢。这时候要定位到底卡在哪一层。常见的瓶颈位置:
先看各层资源:
- CPU 打满?→ 应用层计算瓶颈,考虑加机器或优化代码
- 内存打满?→ 可能有内存泄漏或缓存过大
- 数据库慢查询多?→ SQL 没走索引,加索引或加缓存
- 数据库连接数满?→ 连接池配置或慢查询堆积
- 磁盘 IO 高?→ 日志写太猛或数据库在大量读写
经验上,大多数 Web 系统的第一个瓶颈都在数据库——一个慢查询把连接占住,后面的请求全排队。所以压测时第一件事是盯着数据库的慢查询日志和连接数,十有八九问题就出在那儿。配合前面讲的全链路监控,每一跳的耗时都能看到,定位就快了。
容量模型:一台机器能扛多少
压测出「整套系统能扛多少 QPS」之后,下一步是建一个容量模型:一台机器大概扛多少 QPS?这样流量涨了,就知道该加几台机器:
容量推算示例:
- 压测测出:4 台机器共扛 4000 QPS 时响应还正常
- 推算:单台约 1000 QPS
- 大促预估流量:6000 QPS
- 需要:6000 / 1000 = 6 台,再加 30% 冗余 = 8 台
关键:永远按 70% 水位设计,留 30% 余量应对突发。
别想着把机器用到 100%——一旦真打满,再涨一点就雪崩。留 30% 余量不是浪费,是保险。这个模型建好后,扩容决策就从「拍脑袋加几台」变成按算式推算。
上线后持续观测
压测是上线前的一次性动作,但真实流量会持续变化——业务涨了、新功能上线了,容量模型就过时了。所以要配合前面讲的监控,持续看两件事:当前水位在容量模型的百分之几?有没有接近警戒线?
一个简单做法:设一个「水位 70%」的告警。当某服务的 CPU 或 QPS 持续爬到容量的 70% 以上,告警通知——这时候离真正扛不住还有距离,但足够从容地安排扩容。别等到 90% 才动,那时候扩容都来不及。
一份压测清单
如果你团队还没正经压测过,按这份清单走一遍:
第一周:搭压测环境
- 测试环境一套与生产同配置
- 跑通一次最小压测,能出 QPS 和响应时间曲线
第二周:定场景和目标
- 按真实业务比例配接口
- 目标 QPS = 历史峰值 × 1.5
第三周:压到瓶颈并定位
- 找到第一个扛不住的点
- 看是数据库还是应用层,先优化最明显的
第四周:建容量模型并设水位告警
- 算出单台 QPS,定扩容公式
- 加 70% 水位告警
每个季度:复测一次
- 业务变了就重新压,更新模型
容量规划这件事,最怕的是「从不压测、凭感觉扩容」。把上面这套跑起来,下次大促前你心里就有数了——知道自己能扛多少、还差多少、该备几台,而不是到时候提心吊胆地盯着监控面板。