4. 压力测试基础:目标、分类与常用工具
压力测试是性能工程的核心环节,其目标并非单纯“让系统崩溃”,而是通过可控的负载注入,提前暴露系统在资源争用、并发竞争、容量瓶颈下的行为边界。本节将系统梳理压力测试的三大分类及其对应目标,并介绍四款主流压测工具的适用场景与基本用法。
4.1 压力测试的核心目标
压力测试围绕以下三个维度展开,每个维度对应不同的测试设计与评估标准:
| 目标维度 | 核心问题 | 典型评估指标 |
|---|---|---|
| 容量边界 | 系统在何种并发/吞吐量下开始出现性能拐点? | TPS、QPS、并发用户数、CPU 使用率 |
| 稳定性 | 系统在持续负载下是否出现内存泄漏、连接池耗尽、GC 抖动? | 内存占用趋势、Full GC 频率、错误率 |
| 弹性恢复 | 系统在突发流量或资源降级后能否自动恢复至正常水位? | 恢复时间、降级策略触发率、PSI 指标 |
4.2 压力测试的三大分类
根据测试目的与负载模式,压力测试通常分为以下三类。下图展示了三类测试在负载曲线上的典型差异:
4.2.1 负载测试(Load Testing)
负载测试通过逐步增加并发请求量,观察系统吞吐量(TPS)、响应时间(RT)和资源利用率的变化曲线,找到性能拐点(即“膝盖点”)。典型场景包括:
- 阶梯增压: 每 30 秒增加 100 并发,直至 TPS 不再线性增长或错误率超过 1%。
- 目标水位验证: 在预估峰值流量的 1.5 倍水位下运行 10 分钟,确认系统无降级。
4.2.2 稳定性测试(Stability / Soak Testing)
稳定性测试在恒定负载(通常为系统容量的 70%-80%)下长时间运行(数小时至数天),用于暴露内存泄漏、连接池耗尽、磁盘 IO 堆积等慢性问题。关键观察点包括:
- 内存占用是否随时间线性增长(疑似泄漏)。
- Full GC 频率是否逐渐升高。
- 数据库连接池活跃数是否持续上升。
- PSI 指标的
some和full值是否出现周期性尖峰。
4.2.3 尖峰测试(Spike Testing)
尖峰测试模拟流量在极短时间内(如 1-2 秒)突增数倍,观察系统是否触发限流、熔断或自动扩缩容,以及流量回落后能否快速恢复。典型场景包括:
- 秒杀活动开始瞬间的流量洪峰。
- 热点新闻导致的内容服务突发请求。
- Kubernetes HPA 触发后的扩容延迟与冷启动影响。
4.3 常见压力测试工具
不同工具在协议支持、资源开销、场景灵活性上各有侧重。下表对比了四款工具的适用场景与核心参数:
| 工具 | 协议/场景 | 核心优势 | 典型命令示例 |
|---|---|---|---|
| wrk | HTTP/HTTPS | 多线程 + 事件驱动,单机可产生高并发;支持 Lua 脚本定制请求 | wrk -t12 -c400 -d30s http://target |
| ab (Apache Bench) | HTTP/HTTPS | 简单易用,适合快速验证;单线程模型,高并发时性能受限 | ab -n 10000 -c 100 http://target/ |
| sysbench | 数据库、CPU、内存、IO | 内置多种基准测试模式;支持 MySQL/PostgreSQL 压测 | sysbench cpu --cpu-max-prime=20000 run |
| stress-ng | 系统资源(CPU/内存/IO/网络) | 精细控制资源压力类型与强度;适合模拟 PSI 异常场景 | stress-ng --cpu 4 --vm 2 --vm-bytes 1G -t 60s |
4.3.1 wrk — HTTP 高并发压测
wrk 利用多线程和 epoll/kqueue 事件循环,单机即可产生数万并发连接。配合 Lua 脚本可模拟登录态、随机参数等复杂场景。
# 基本用法:12 线程,400 连接,持续 30 秒
wrk -t12 -c400 -d30s http://192.168.1.100:8080/api/v1/query
# 使用 Lua 脚本发送 POST 请求
wrk -t4 -c200 -d60s -s post.lua http://target/api
4.3.2 ab — 快速 HTTP 基准测试
ab 是 Apache 自带的压测工具,适合快速验证单机 HTTP 性能。注意其单线程模型在并发超过 1000 时可能成为瓶颈。
# 总请求 10000,并发 100
ab -n 10000 -c 100 http://localhost:3000/health
4.3.3 sysbench — 数据库与系统基准测试
sysbench 支持多模式压测,常用于数据库连接池、CPU 素数计算、内存带宽和文件 IO 的基准测试。
# CPU 基准测试:计算 20000 以内的素数
sysbench cpu --cpu-max-prime=20000 run
# MySQL 压测:准备数据、运行、清理
sysbench oltp_read_write --table-size=1000000 --mysql-host=127.0.0.1 --mysql-user=root prepare
sysbench oltp_read_write --table-size=1000000 --threads=16 --time=120 run
sysbench oltp_read_write --table-size=1000000 cleanup
4.3.4 stress-ng — 系统资源压力模拟
stress-ng 是 Linux 系统压力测试的瑞士军刀,可精确控制 CPU 负载、内存分配、磁盘 IO 和网络中断。在 PSI 异常检测实验中,常用它来制造资源争用场景。
# 4 个 CPU 压力 + 2 个虚拟内存压力(各 1GB),持续 60 秒
stress-ng --cpu 4 --vm 2 --vm-bytes 1G -t 60s
# 模拟 IO 压力:4 个 hdd 工作线程,同步写入 4GB 文件
stress-ng --hdd 4 --hdd-bytes 4G -t 120s
stress-ng 制造 CPU 或 IO 压力,同时用 wrk 对应用层施加 HTTP 负载,观察 PSI 指标如何先于应用层错误出现异常信号。这种组合能有效验证 PSI 作为“早期预警”指标的有效性。
4.4 工具选型决策流程
下图展示了根据测试目标选择压测工具的决策逻辑:
4.5 本章小结
- 压力测试的三大分类(负载、稳定性、尖峰)对应不同的负载模式与评估目标,PSI 指标在稳定性测试和尖峰测试中尤为敏感。
- wrk 和 ab 适用于 HTTP 层压测;sysbench 适用于数据库与系统基准;stress-ng 是模拟资源争用、触发 PSI 异常的首选工具。
- 实际压测中,建议组合使用应用层工具(wrk)和系统层工具(stress-ng),以便同时观察应用性能与内核资源调度状态。