如何压测 API 接口?—— 使用 wrk 工具进行高性能压测
Performance Testing with Apache Bench | by Pankaj Gupta | Medium
Top 9 Methods for API Testing in Java | Comprehensive Guide
ab - Apache HTTP server benchmarking tool - Apache HTTP Server Version 2.4
wrk 是一款现代、轻量级且极高性能的 HTTP 基准测试工具(Benchmark Tool)。它最显著的特点是利用了异步事件驱动架构(如 Linux 的 epoll 或 macOS 的 kqueue),能用极少的线程在单机上产生巨大的并发压力。
简单来说,它是后端开发者用来压测接口 QPS (每秒查询率) 和 Latency (延迟) 的神器。
为什么用 wrk 而不是 Apache Bench (ab) 或 JMeter?
- 性能更强:
wrk使用非阻塞 I/O,能比ab产生更高的并发,更能榨干服务器性能。 - 支持 Lua 脚本:这是
wrk的杀手锏。你可以编写 Lua 脚本来构造复杂的请求(如生成动态 Token、随机参数、POST 复杂 JSON 等),而ab只能发静态请求。 - 轻量:没有 JMeter 那么重的 GUI,纯命令行,适合服务器端直接跑。
常用命令示例
最简单的压测命令:
1 | wrk -t12 -c400 -d30s http://localhost:8080/api/v1/user |
-t12: 使用 12 个线程(一般设置为 CPU 核心数)。-c400: 保持 400 个 HTTP 连接(并发数)。-d30s: 持续压测 30 秒。--latency: (可选) 输出详细的延迟分布报告(P50, P90, P99)。
配合 Lua 脚本(进阶)
比如你要压测一个POST 接口,且需要JSON Body,可以写一个 post.lua:
1 | -- post.lua |
wrk 的强大之处就在于它嵌入了 LuaJIT 解释器。这意味着你可以完全控制 HTTP 请求的生成逻辑,包括随机化参数、动态生成 Body、随机 Header、甚至根据响应调整请求。
以下是几个实用的 Lua 脚本模板,专门解决“随机分布请求”的问题。
1. 基础随机:随机请求不同的 URL 路径
比如你想压测 /user/1001 到 /user/9999 这样随机的用户详情页,防止服务器缓存热点。
1 | -- 在压测开始前初始化随机种子 |
2. 权重随机:按比例访问不同接口
真实场景通常是混合的:80% 读请求,20% 写请求。
1 | math.randomseed(os.time()) |
3. POST 请求:随机 Body 内容
压测“创建订单”或“短链接生成”接口时,每次 Body 必须不同,否则会被数据库唯一索引拦住。
1 | math.randomseed(os.time()) |
4. 高级技巧:每个线程独立的“用户身份” (Token)
如果你要压测需要登录的接口,可以给每个线程分配不同的 Token。
1 | -- 每个线程启动时调用一次 setup |
总结
- 随机 URL:在
request()函数里拼装path。 - 随机 Body:在
request()里拼装 JSON 字符串。 - 按比例混合:用
math.random(1, 100)做 if-else 分流。 - 运行方式:一定要带上
--script参数。
如何查看CPU核心数
lscpu

可以看出一共有16个核心,每个核心可以当两个线程使用(Intel 的超线程技术)
1. 为什么“1个核”能变“2个核”?
- 物理层面:你的 CPU 确实只有 16 个完整的物理核心(Physical Cores),也就是有 16 套独立的 ALU(运算单元)和缓存。
- 逻辑层面:但是,物理核心内部的执行资源(如寄存器、指令队列)往往有富余。SMT 技术允许操作系统把 1 个物理核心 识别为 2 个逻辑核心。





