性能测试 · 压测实战不用 JMeter 也能压测:requests + ThreadPoolExecutor 跑出真实报告
很多人一提性能测试就想到 JMeter、LoadRunner,部署一套环境半天。其实对大多数后端接口,用 Python 标准库加两个常用库就能压出一份能看的报告:吞吐 RPS、以及 p50/p90/p95/p99 这些分位延迟。
这篇不依赖任何重型工具,所有数字都在这台机器上真实压出来。
压测要有真实 CPU 开销。空接口压出来的 RPS 虚高,对容量评估没有参考价值。我们在接口里放了一段纯 CPU 求和循环,这才是压测真正要打的"重活"。
被测对象是个 Flask 小服务,核心接口 /api/compute 里故意放了纯 CPU 的求和循环 burn_cpu:
02用 requests + ThreadPoolExecutor 写压测脚本为什么不用 locust?它在 Python 3.13 上有个 ssl 猴补丁递归 bug。标准库 concurrent.futures.ThreadPoolExecutor 反而更稳。
压测脚本的思路就三层:开 N 个并发线程,每个线程在固定时长内不停发请求并记录耗时;最后排序算分位值:

在本机对 /api/compute 压 20 并发、5 秒,真实输出如下:

最该盯的三个数:RPS≈145(实际上限)、p95≈182ms(95% 用户感知)、失败率 0%。注意 p95 和平均 135ms 拉开了距离——说明有长尾请求,光看平均值会误判体验。

真实压测数据的延迟百分位分布
一线经验性能测试的重点不是工具选型,而是让被测接口有真实开销 + 用分位数而非平均值做判断。这套方案零额外依赖,内网离线环境一样能跑。
1)永远看分位,不只看平均。 平均值会被少数极快/极慢请求拉平,p95/p99 才贴近"大多数用户"和"最差情况"。
2)固定并发、固定时长做基线。 每次都用同一组参数,报告才可比;参数一变,数字就不可比了。
3)别只看吞吐。 RPS 很高但失败率飙升,那是过载而不是性能好;吞吐和失败率要一起看。
写在最后
不需要 JMeter,不需要 LoadRunner。Python 标准库 + requests 就能跑出有参考价值的性能数据。关键是:被测接口要有真实开销,报告要看分位数。
如果这篇对你有启发,欢迎点个「在看」或收藏。性能测试踩过的更多坑,我会继续在这里写。
关注本公众号「铭然实验室」,继续聊研发那些真问题。