4. 数据库压测方法论:负载模型、基准测试、压力测试、稳定性测试

数据库压测不是简单的“发请求看 QPS”,而是一套从业务理解到风险验证的完整工程方法。本章围绕四个核心维度展开:负载模型决定“测什么”,基准测试建立“对比基线”,压力测试寻找“极限拐点”,稳定性测试验证“长期耐受”。

核心原则:压测必须可重复、可对比、可归因。任何一次压测结果,如果不能复现或无法解释波动原因,则不具备工程参考价值。

4.1 负载模型:压测的“业务翻译器”

负载模型是将真实业务流量抽象为压测脚本与参数配置的过程。错误的负载模型会导致压测结果与生产表现完全脱节。

维度 说明 常见误区
并发用户数 同时保持活跃连接的客户端数量 将“并发数”等同于“TPS”,忽略思考时间
请求组成 读/写比例、简单查询/复杂 JOIN 比例 只压测主键查询,忽略慢 SQL 场景
数据倾斜 热点 Key、大商户、高频用户的数据分布 均匀分布压测,掩盖锁竞争与页分裂风险
周期性特征 秒杀波峰、日结批量、夜间维护窗口 恒定压力测试,无法暴露资源争抢问题
实战建议:从生产数据库的 general_log 或 slow_query_log 中提取 24 小时的真实 SQL 样本,按频率和耗时排序后,构建压测流量矩阵。不要“拍脑袋”定比例。
负载模型构建流程 生产流量采集 SQL 分类聚合 参数化建模 脚本生成 关键参数示例(MySQL 压测) • 并发数:阶梯递增 10/50/100/200/500 • 读写比例:OLTP 7:3 / 报表 1:9 / 混合 5:5 • 数据量:1x / 5x / 10x 生产核心表行数 • 热点倾斜:80% 流量落在 20% Key 上

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 基准测试执行步骤

  1. 环境准备:确保数据库、压测机、网络处于稳定状态,关闭非必要后台任务。
  2. 预热:使用低并发运行 5-10 分钟,让 buffer pool 填充到稳定状态。
  3. 基线采集:以固定并发(如 50)运行 15 分钟,记录 TPS、QPS、平均延迟、P99 延迟。
  4. 数据记录:将结果写入版本化文档,标注数据库版本、配置参数、压测机规格。
常见陷阱:不要在压测过程中同时运行备份、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 曲线从线性转为水平的点,就是推荐最大并发;延迟曲线出现“膝盖弯”的点,就是性能警戒线。
压力测试:性能拐点示意图 并发数 TPS / 延迟 TPS 延迟 拐点 TPS 线性增长区 延迟平稳 < 10ms 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 / 延迟 拐点并发数 性能衰减率 流量分布
输出产物 基线报告 容量评估 健康证明 压测脚本