第 3 章:压力测试理论基础——性能指标、测试类型与方法论

嗯,咱们直接进入正题。压力测试不是随便把请求怼上去看系统挂不挂,你得先搞清楚三个维度:用什么量、测什么模式、按什么顺序跑。这三样清楚了,你的测试才有根。

3.1 核心性能指标:TPS、延迟、并发

我个人习惯把性能指标分成三大类——吞吐、响应和并发。记住一个原则:单指标不构成优化依据,必须三指标联动看。

3.1.1 TPS(Transactions Per Second)

TPS 是系统每秒能处理的事务数。在 HSM SDK 场景里,一个事务就是一次完整的加解密调用,从发送命令到收到响应。

  • 为什么重要? 直接反映硬件密码模块的处理上限。
  • 怎么测? 用恒定并发数逐步加压,观察 TPS 曲线。
  • 我踩过的坑: 有一次测 L 型号的 HSM,TPS 跑到 850 左右突然掉到 500,我以为芯片有 bug。后来发现是 SDK 线程池默认连接数只有 10,瓶颈根本不在设备上。

3.1.2 延迟(Latency)

延迟分三种:平均延迟、P99 延迟、最大延迟。我建议重点关注 P99,因为平均延迟容易掩盖尾部长尾。

延迟类型定义HSM 场景典型值
平均延迟(Avg)所有请求耗时均值2~5 ms
P99 延迟99% 请求在此值以下5~10 ms
最大延迟(Max)单次最慢请求可超 100 ms(需排查)

实战小贴士: 我习惯在压测脚本里同时记录发送时间戳和接收时间戳,然后额外打印每 1000 个请求的延迟分布。这样能快速判断 HSM 是否出现了“间歇性脑筋急转弯”——比如忽然有一两个请求卡了 200ms。

3.1.3 并发数(Concurrency)

并发数是指同一时刻正在处理请求的数量。关键关系:TPS = 并发数 / 平均响应时间。如果并发数提升但 TPS 不涨,说明系统已经进入瓶颈区。

  • 过低的并发: 资源闲置,测不出上限。
  • 过高的并发: 队列溢出,延迟爆炸。
  • 建议做法: 从 1 个并发开始,每次翻倍,直到 TPS 停止增长。

注意: 千万不要在 HSM 上跑“无限并发”脚本。我曾经看到有人用几百个线程同时发加解密请求,结果 HSM 内部队列被撑爆,直接返回硬件错误码。HSM 不是普通 Web 服务器,它有物理并发限制。

3.2 测试类型:负载测试、压力测试、稳定性测试

三种测试目的不同,方法也不同。很多人把“压力测试”当成统称,其实下面要细分。

3.2.1 负载测试(Load Testing)

说白了就是“正常运行时能撑住多少人?”用预期的业务并发数(比如 50、100、200)持续跑一段时间,看系统是否稳定。

  • 目标:验证系统在预期负载下的表现。
  • 关注指标:TPS 是否达标、P99 延迟是否在 SLA 内。
  • 案例:某支付系统要求 HSM 签名操作在 50 并发下 TPS ≥ 2000,P99 ≤ 5ms。负载测试就是验证这个。

3.2.2 压力测试(Stress Testing)

压力测试是要找到系统的极限和崩溃点。逐步增加并发数,直到系统性能出现拐点甚至崩溃。我一般把这个测试叫做“探顶测试”。

  • 目标:找到系统能承受的最大并发数和 TPS 上限。
  • 方法:阶梯式加压,每次保持 30 秒,记录拐点。
  • 特别注意:HSM 压力测试中,一旦出现硬件错误码或连接断开,要立即停止并记录当前负载。

经验: 我记得有一次在某金融客户的 HSM 集群上做压力测试,到 300 并发时 TPS 掉了一半,但设备还没报错。后来查日志发现是 SDK 的内部线程竞争锁导致。所以压力测试不仅要测设备,更要测 SDK 层。

3.2.3 稳定性测试(Stability / Soak Testing)

长跑测试,通常是 4~8 小时甚至 24 小时。目的是发现内存泄漏、连接泄漏、资源耗尽等“慢性病”。

  • 负载水平:使用业务峰值并发的 80% 左右。
  • 监控重点:内存占用、连接数、TPS 波动。
  • 我的建议:稳定性测试一定要跑过夜,第二天早上看监控图。

3.3 方法论:如何设计压力测试场景

光知道指标和类型还不够,你得有一套流程。我自己常用的步骤,这里拆给你看。

  1. 确定测试目标和基准线 - 先问业务:SLA 的 TPS 和 P99 是多少?然后拿一个已知稳定的版本跑基线。
  2. 设计场景矩阵 - 把测试类型、并发阶梯、持续时间组合成表格,比如:负载测试(并发 50/100/200,各 5 分钟)、压力测试(并发 50→800,步长 50,每步 30 秒)、稳定性测试(并发 200,持续 8 小时)。
  3. 准备监控和日志 - 至少采集:HSM 设备 CPU/内存、网络吞吐、SDK 线程状态、错误日志。我习惯在压测脚本里额外打印每次请求的耗时和返回值。
  4. 执行并记录拐点 - 严格按照场景运行,注意观察曲线突变。比如 TPS 突然下降或延迟突然上升,就是拐点。
  5. 分析瓶颈并回放 - 记录拐点时的资源状况,然后复位系统,用相同负载复现验证。

关键警告: 压力测试前必须确认 HSM 固件版本和 SDK 版本匹配。我有一次没核对版本,跑压力测试时签名耗时从 2ms 涨到 20ms,查了两天才发现是 SDK 与固件不兼容导致的代理模式回退。

压力测试理论基础知识体系 性能指标 测试类型 方法论 TPS 延迟(P99) 并发数 负载测试 压力测试 稳定性测试 目标基线 场景矩阵 监控与分析 测试结论:TPS上限 / 拐点负载 / 稳定性评级 核心逻辑:先定义指标 → 选择合适的测试类型 → 按照方法论执行 → 输出综合结论 三者缺一不可,尤其要注意 HSM 硬件并发限制和 SDK 层资源管理

3.4 关于方法论的一点个人补充

我见过不少团队,上来就用 Jmeter 设个 1000 线程开始跑,毫无章法。说实话,这样跑出来的数据只能叫“压力曲线”,不能叫“测试结论”。真正的方法论,要求你每次只改变一个变量,其他条件保持不变。

  • 先跑一次空载,确认系统正常。
  • 然后跑负载测试,确认基线。
  • 再跑压力测试,找上限。
  • 最后跑稳定性,验证长期可靠性。

每一步产生的数据都要录进表格。我自己的经验是:记录比分析更重要。因为很多问题是在回看数据时发现的,比如某次压力测试后,你会看到 TPS 曲线在 350 并发处有一个小凹陷,第二次测试同样的凹陷还出现,那可能就是共振问题了。

最终记住: 压力测试不是拿系统去死磕,而是用科学方法暴露系统的真实边界。你知道了边界,才能设计出可靠的降级和限流策略。