4. 压力测试基础:目标、分类与常用工具

压力测试是性能工程的核心环节,其目标并非单纯“让系统崩溃”,而是通过可控的负载注入,提前暴露系统在资源争用、并发竞争、容量瓶颈下的行为边界。本节将系统梳理压力测试的三大分类及其对应目标,并介绍四款主流压测工具的适用场景与基本用法。

4.1 压力测试的核心目标

压力测试围绕以下三个维度展开,每个维度对应不同的测试设计与评估标准:

目标维度 核心问题 典型评估指标
容量边界 系统在何种并发/吞吐量下开始出现性能拐点? TPS、QPS、并发用户数、CPU 使用率
稳定性 系统在持续负载下是否出现内存泄漏、连接池耗尽、GC 抖动? 内存占用趋势、Full GC 频率、错误率
弹性恢复 系统在突发流量或资源降级后能否自动恢复至正常水位? 恢复时间、降级策略触发率、PSI 指标
PSI 关联提示: 压力测试中,PSI(Pressure Stall Information)指标是检测系统资源(CPU、内存、IO)是否出现“不可调度窗口”的关键信号。当 PSI 的 some 或 full 指标持续升高,往往意味着系统已接近或超过容量边界,此时 TPS 曲线可能出现锯齿状抖动。

4.2 压力测试的三大分类

根据测试目的与负载模式,压力测试通常分为以下三类。下图展示了三类测试在负载曲线上的典型差异:

压力测试分类 — 负载模式对比 负载测试:阶梯递增至目标水位,持续观察 稳定性测试:恒定负载(通常 70%-80% 水位),持续数小时 尖峰测试:瞬时突增 → 维持 → 回落,观察恢复行为 图例: 负载测试 稳定性测试 尖峰测试

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 触发后的扩容延迟与冷启动影响。
常见误区: 很多团队将“负载测试”等同于“压力测试”,忽略了稳定性测试和尖峰测试。在 PSI 异常检测实践中,稳定性测试更容易暴露“慢泄漏”导致的 PSI 缓慢恶化,而尖峰测试则能触发 PSI 瞬时飙升,两者都是 PSI 告警策略的重要输入。

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
PSI 实验推荐组合: 在后续章节中,我们将使用 stress-ng 制造 CPU 或 IO 压力,同时用 wrk 对应用层施加 HTTP 负载,观察 PSI 指标如何先于应用层错误出现异常信号。这种组合能有效验证 PSI 作为“早期预警”指标的有效性。

4.4 工具选型决策流程

下图展示了根据测试目标选择压测工具的决策逻辑:

压测工具选型决策流程 测试目标确定 HTTP 应用层压测? wrk / ab stress-ng 数据库/CPU/IO 基准? sysbench 执行压测并采集 PSI

4.5 本章小结

  • 压力测试的三大分类(负载、稳定性、尖峰)对应不同的负载模式与评估目标,PSI 指标在稳定性测试和尖峰测试中尤为敏感。
  • wrk 和 ab 适用于 HTTP 层压测;sysbench 适用于数据库与系统基准;stress-ng 是模拟资源争用、触发 PSI 异常的首选工具。
  • 实际压测中,建议组合使用应用层工具(wrk)和系统层工具(stress-ng),以便同时观察应用性能与内核资源调度状态。