4. 数据库压测方法论:负载模型、基准测试、压力测试、稳定性测试
数据库压测不是简单的“发请求看 QPS”,而是一套从业务理解到风险验证的完整工程方法。本章围绕四个核心维度展开:负载模型决定“测什么”,基准测试建立“对比基线”,压力测试寻找“极限拐点”,稳定性测试验证“长期耐受”。
核心原则:压测必须可重复、可对比、可归因。任何一次压测结果,如果不能复现或无法解释波动原因,则不具备工程参考价值。
4.1 负载模型:压测的“业务翻译器”
负载模型是将真实业务流量抽象为压测脚本与参数配置的过程。错误的负载模型会导致压测结果与生产表现完全脱节。
| 维度 | 说明 | 常见误区 |
|---|---|---|
| 并发用户数 | 同时保持活跃连接的客户端数量 | 将“并发数”等同于“TPS”,忽略思考时间 |
| 请求组成 | 读/写比例、简单查询/复杂 JOIN 比例 | 只压测主键查询,忽略慢 SQL 场景 |
| 数据倾斜 | 热点 Key、大商户、高频用户的数据分布 | 均匀分布压测,掩盖锁竞争与页分裂风险 |
| 周期性特征 | 秒杀波峰、日结批量、夜间维护窗口 | 恒定压力测试,无法暴露资源争抢问题 |
实战建议:从生产数据库的
general_log 或 slow_query_log 中提取 24 小时的真实 SQL 样本,按频率和耗时排序后,构建压测流量矩阵。不要“拍脑袋”定比例。
4.2 基准测试:建立“健康基线”
基准测试(Benchmark)是在可控环境下,使用标准化负载对数据库进行性能摸底,目的是获得一组可重复的性能基线数据。基准测试不追求“压垮系统”,而是回答“当前配置下,系统正常能跑多快”。
4.2.1 常用基准测试工具
| 工具 | 适用数据库 | 典型场景 |
|---|---|---|
| sysbench | MySQL / PostgreSQL | OLTP 混合读写、CPU/IO 压测 |
| pgbench | PostgreSQL | TPC-B 类负载、自定义 SQL 脚本 |
| HammerDB | Oracle / SQL Server / MySQL | TPC-C 标准事务模型 |
| mysqlslap | MySQL | 快速并发模拟、简单 SQL 压测 |
4.2.2 基准测试执行步骤
- 环境准备:确保数据库、压测机、网络处于稳定状态,关闭非必要后台任务。
- 预热:使用低并发运行 5-10 分钟,让 buffer pool 填充到稳定状态。
- 基线采集:以固定并发(如 50)运行 15 分钟,记录 TPS、QPS、平均延迟、P99 延迟。
- 数据记录:将结果写入版本化文档,标注数据库版本、配置参数、压测机规格。
常见陷阱:不要在压测过程中同时运行备份、DDL 或大查询。基准测试要求“单一变量原则”,任何干扰都会污染基线数据。
4.3 压力测试:寻找“性能拐点”
压力测试(Stress Test)通过逐步增加负载,观察数据库在超过设计容量时的行为。核心目标是找到性能拐点——即 TPS 不再线性增长、延迟急剧上升的临界并发数。
4.3.1 压力测试关键指标
| 指标 | 正常区间 | 拐点信号 |
|---|---|---|
| TPS / QPS | 随并发线性增长 | 增长停滞或下降 |
| 平均延迟 | < 10ms | 超过 50ms 且持续上升 |
| P99 延迟 | < 50ms | 超过 200ms 或出现毛刺 |
| CPU 使用率 | < 70% | 持续 90%+ 且 sys 占比高 |
| 磁盘 IOPS | 低于设备上限 80% | 达到上限且 await > 30ms |
4.3.2 阶梯加压策略
# sysbench 阶梯加压示例(并发从 10 到 500)
for concurrency in 10 50 100 200 300 500
do
sysbench oltp_read_write \
--threads=$concurrency \
--time=120 \
--report-interval=10 \
run >> result_${concurrency}.log
sleep 30 # 冷却时间,让数据库恢复
done
分析要点:绘制“并发数 vs TPS”和“并发数 vs 延迟”两条曲线。TPS 曲线从线性转为水平的点,就是推荐最大并发;延迟曲线出现“膝盖弯”的点,就是性能警戒线。
4.4 稳定性测试:验证“长期耐受”
稳定性测试(Soak Test / Endurance Test)在接近生产峰值的负载下,持续运行 4-24 小时,观察数据库是否存在内存泄漏、连接泄漏、磁盘增长、性能衰减等问题。
4.4.1 稳定性测试检查清单
| 检查项 | 监控方式 | 异常阈值 |
|---|---|---|
| 内存使用 | top / SHOW ENGINE INNODB STATUS |
RSS 持续增长超过 5%/h |
| 连接数 | SHOW PROCESSLIST |
Time 状态连接数超过 10% |
| 事务年龄 | information_schema.innodb_trx |
最长事务超过 300 秒 |
| 磁盘增长 | df -h / 监控工具 |
数据文件增长超过预期 20% |
| 慢查询 | slow_query_log |
慢查询数量随时间递增 |
4.4.2 稳定性测试通过标准
- TPS 波动:每 10 分钟平均 TPS 波动不超过 ±15%。
- 延迟趋势:P99 延迟在测试期间无持续上升趋势。
- 资源回收:测试结束后,内存、连接数能回落到初始水平。
- 无错误:测试期间无
Deadlock found、Lock wait timeout等错误日志。
重要提醒:稳定性测试必须在变更窗口前完成。如果在稳定性测试中发现性能衰减,说明数据库存在资源泄漏或配置缺陷,需要修复后才能进行变更操作。
4.5 四种测试方法对比总结
| 维度 | 基准测试 | 压力测试 | 稳定性测试 | 负载模型 |
|---|---|---|---|---|
| 目的 | 建立基线 | 找拐点 | 验持久 | 定流量 |
| 负载特征 | 固定并发 | 阶梯递增 | 峰值持续 | 业务仿真 |
| 运行时长 | 15-30 分钟 | 30-60 分钟 | 4-24 小时 | 前置设计 |
| 核心指标 | TPS / 延迟 | 拐点并发数 | 性能衰减率 | 流量分布 |
| 输出产物 | 基线报告 | 容量评估 | 健康证明 | 压测脚本 |