一、为什么需要压测
性能测试是验证系统能力的重要手段,但很多时候我们发现:
- 上线前测试通过,上线后扛不住
- 单接口压测没问题,混合场景就崩了
- 压测时好好的,大促时各种异常
根本原因:
- 测试环境与生产环境差异大
- 单接口压测无法模拟真实业务场景
- 缺乏全链路压测,无法发现系统短板
全链路压测的目标:
- 验证系统在高并发下的稳定性
- 发现性能瓶颈和隐患
- 确定系统容量边界
- 为扩容和优化提供数据支撑
二、压测类型与目标
1. 压测类型分类
| 类型 | 说明 | 目的 |
|---|---|---|
| 基准测试 | 单接口压测 | 获取单个接口性能基线 |
| 负载测试 | 逐步加压 | 找到最大处理能力 |
| 压力测试 | 持续高压 | 测试系统极限 |
| 容量测试 | 持续运行 | 验证长时间稳定性 |
| 全链路测试 | 端到端压测 | 模拟真实业务场景 |
2. 关键指标定义
| 指标 | 说明 | 优秀标准 |
|---|---|---|
| QPS/TPS | 每秒处理请求数 | 根据业务定 |
| 响应时间 | P50/P90/P99 | P99小于500ms |
| 错误率 | 失败请求比例 | 小于0.1% |
| CPU使用率 | 服务器CPU占用 | 小于70% |
| 内存使用率 | 服务器内存占用 | 小于80% |
| 连接池使用率 | 数据库/Redis连接 | 小于80% |
三、压测工具选型
1. JMeter
优点:
- 图形化界面,易于使用
- 丰富的插件生态
- 支持多种协议(HTTP、JDBC、JMS等)
- 支持分布式压测
缺点:
- 资源占用较高
- 大并发下需要多机分布式
2. wrk
优点:
- 轻量级,单机支持极高并发
- 支持Lua脚本扩展
- 命令行快速测试
缺点:
- 仅支持HTTP协议
- 无法模拟复杂业务流程
3. Gatling
优点:
- 基于Scala,高性能
- 代码化测试脚本,易于版本管理
- 生成详细的HTML报告
缺点:
- 需要学习Scala DSL
- 调试相对困难
4. 工具选型建议
| 场景 | 推荐工具 | 理由 |
|---|---|---|
| 快速单接口压测 | wrk | 轻量快速 |
| 复杂业务流程 | JMeter/Gatling | 支持脚本编程 |
| 大规模分布式压测 | JMeter | 成熟的分布式方案 |
| CI/CD集成 | Gatling | 代码化,易集成 |
四、全链路压测实施
1. 压测环境准备
环境要求:
- 与生产环境配置一致
- 数据量级与生产相近
- 网络环境隔离
- 监控系统完备
2. 压测场景设计
核心交易链路压测:
- 浏览商品
- 加购下单
- 用户中心
- 搜索
秒杀场景压测:
- 瞬间高并发处理
- 库存扣减
- 订单创建
3. 压测数据标记
通过请求头标记压测流量,实现压测数据隔离
五、性能瓶颈定位
1. 常见瓶颈点
| 层级 | 常见瓶颈 | 定位方法 |
|---|---|---|
| 应用层 | 代码逻辑、GC、锁竞争 | arthas、jprofiler |
| 数据库 | 慢SQL、连接池耗尽 | 慢查询日志、explain |
| 缓存 | 热点key、大key | redis-cli monitor |
| 网络 | 带宽、连接数 | netstat、ss |
| 系统资源 | CPU、内存、磁盘IO | top、vmstat、iostat |
2. 瓶颈定位案例
案例1:数据库连接池耗尽
- 现象:大量请求超时
- 排查:查看连接池监控
- 解决:优化慢查询、增加连接池、读写分离
案例2:Full GC频繁
- 排查:jstat -gcutil pid 1000 10
- 解决:增大堆内存、优化对象创建
六、架构优化实践
1. 数据库优化
连接池配置(HikariCP):
- 最大连接数:50
- 最小空闲连接:20
- 连接超时:3秒
SQL优化:
- 添加适当索引
- 避免全表扫描
- 使用分页查询
2. 缓存优化
多级缓存架构:
- L1:本地缓存(Caffeine)
- L2:Redis分布式缓存
- L3:数据库
缓存穿透防护:
- 布隆过滤器判断是否存在
- 缓存空值防止穿透
3. 异步化优化
主流程同步处理,非关键流程异步执行
七、压测报告与容量规划
压测报告模板
测试结果:
| 指标 | 目标值 | 实际值 | 结论 |
|---|---|---|---|
| QPS | 10000 | 12000 | 达标 |
| P99响应时间 | 小于500ms | 380ms | 达标 |
| 错误率 | 小于0.1% | 0.02% | 达标 |
容量规划公式
所需服务器数 = 目标QPS / 单机QPS x (1 + 冗余比例)
八、总结
全链路压测是保障系统稳定性的重要手段:
- 真实场景:模拟生产真实流量
- 数据隔离:压测数据不影响生产
- 瓶颈定位:找到系统短板
- 容量规划:为扩容提供依据
实施建议:
- 建立完善的压测流程
- 定期进行压测演练
- 压测结果纳入版本发布标准
- 持续优化,形成闭环
思考题:你们系统最近一次压测是什么时候?发现了哪些问题?
个人观点,仅供参考