autocannon:Node.js 下的 HTTP 性能压测利器

当你的 API 接口在 Postman 中测试通过,却不知道面对 200 个并发用户时表现如何时,你需要一个专业的工具来回答三个核心问题:每秒能处理多少请求?延迟有多高?在高负载下会不会出错?autocannon 就是这样一个为 Node.js 生态量身打造的 HTTP/1.1 基准测试工具。

它受经典工具 wrk 和 wrk2 启发,但更贴近 Node.js 开发者的工作流。

什么是 autocannon?

autocannon 是一个基于 Node.js 的命令行工具,用于对 HTTP 服务器进行压力测试。它通过模拟指定数量的并发连接,在固定时间内持续向目标 URL 发送请求,并收集统计延迟、吞吐量和状态码等关键性能指标。

它的核心价值在于:

  1. 原生 Node.js 工具链:通过 npm 安装,与 JavaScript 生态无缝集成,可直接在 Node.js 脚本中调用。
  2. 性能强劲:在相同硬件条件下,autocannon 能产生的负载甚至可以超过 wrk 和 wrk2。
  3. 结果直观:提供延迟百分位数(Percentiles)和请求速率(Req/Sec)等关键数据,便于快速定位性能瓶颈。

安装与基本用法

安装

autocannon 是一个 Node.js 包,可通过 npm 全局安装,方便在终端中直接使用:

1
npm install -g autocannon

如果只想在项目中临时使用,也可以借助 npx 直接运行,无需全局安装:

1
npx autocannon http://localhost:3000

基础命令

最简单的一条压测命令,启动 10 个并发连接,对目标 URL 持续测试 10 秒:

1
autocannon http://localhost:3000

常用参数调优

压测的核心在于模拟真实场景,通过调整参数可以控制负载形态。

参数 说明 示例
-c, --connections 并发连接数,模拟同时访问的用户数量。默认 10。 -c 100
-d, --duration 测试持续时间,单位秒。默认 10 秒。 -d 30
-p, --pipelining 管道化请求数,每个连接在等待响应前能发出的请求数。默认 1。 -p 10
-a, --amount 总请求数,若设置此项则忽略 -d 参数。 -a 10000
-m, --method HTTP 方法,默认 GET。 -m POST
-b, --body 请求体内容。 -b '{"key":"value"}'
-H, --headers 设置请求头,可多次使用。 -H 'Content-Type=application/json'
-w, --workers 工作线程数,当单线程无法产生足够负载时使用。 -w 4

场景示例:POST 请求压测

以下命令模拟 50 个并发用户,在 20 秒内向 /api/users 接口发送 JSON 格式的 POST 请求:

1
2
3
4
5
autocannon -c 50 -d 20 \
-m POST \
-H 'Content-Type=application/json' \
-b '{"name":"load-test","active":true}' \
http://localhost:3000/api/users

场景示例:速率限制压测

有时你需要模拟一个稳定的请求速率,而非“最大压力”。使用 -R 参数可以控制每秒总请求数,这种模式常用于观察特定压力下的延迟表现:

1
autocannon -c 50 -R 500 -d 60 http://localhost:3000

解读测试结果

一次压测完成后,autocannon 会输出两个核心表格。

1. 延迟(Latency)表格

1
2
3
4
5
┌─────────┬──────┬──────┬───────┬──────┬─────────┬─────────┬──────────┐
│ Stat │ 2.5% │ 50% │ 97.5% │ 99% │ Avg │ Stdev │ Max │
├─────────┼──────┼──────┼───────┼──────┼─────────┼─────────┼──────────┤
│ Latency │ 1 ms │ 2 ms │ 5 ms │ 8 ms │ 2.1 ms │ 0.8 ms │ 24.1 ms │
└─────────┴──────┴──────┴───────┴──────┴─────────┴─────────┴──────────┘
  • 百分比(Percentile)列(50%, 97.5%, 99%):这是最重要的指标。例如 97.5% 表示 97.5% 的请求延迟低于该值。相比平均值,百分位数更能反映“尾部延迟”(Tail Latency),这对用户体验影响更大。
  • Avg(平均值)与 Stdev(标准差):平均值是总体水平,标准差反映了延迟的波动程度。标准差越大,服务器响应越不稳定。

2. 吞吐量(Throughput)表格

1
2
3
4
5
┌───────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
│ Stat │ 1% │ 2.5% │ 50% │ 97.5% │ Avg │ Stdev │ Min │
├───────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Req/Sec │ 20623 │ 20623 │ 25583 │ 26271 │ 25131.2 │ 1540.94 │ 20615 │
└───────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘
  • Req/Sec(每秒请求数):核心吞吐量指标。数字越高,服务处理能力越强。关注 Avg1%(最慢样本)的差距,差距过大可能意味着服务在某些时刻出现波动。

高级用法:在 Node.js 脚本中集成

这是 autocannon 相比传统压测工具的一大亮点。你可以在 Node.js 脚本中调用其 API,将压测集成到 CI/CD 流水线中,例如当 p99 延迟超过阈值时,让构建失败。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const autocannon = require('autocannon')

async function runBenchmark() {
const result = await autocannon({
url: 'http://localhost:3000',
connections: 100,
duration: 20
})

console.log(`平均延迟: ${result.latency.average} ms`)
console.log(`p99 延迟: ${result.latency.p99} ms`)
console.log(`请求/秒: ${result.requests.average}`)

// 性能阈值检查:p99 必须小于 100ms
if (result.latency.p99 > 100) {
console.error('性能测试未通过!p99 延迟过高。')
process.exit(1)
}
}

runBenchmark()

通过这种方式,可以将性能基准测试从“手动执行”升级为“自动化质量门禁”。

autocannon vs 其他压测工具

工具 特点 适用场景
autocannon Node.js 原生,安装简单,API 友好,性能出色 Node.js 开发者,追求快速集成和自动化压测。
wrk/wrk2 基于 C 语言,性能极高,支持 Lua 脚本扩展 追求极致性能,或需要复杂脚本逻辑的场景。
Apache Bench (ab) 经典工具,简单直接,但单线程,功能较老旧 快速、简单的基准测试,无需额外安装。
k6 / Artillery 支持复杂场景编排、多协议,提供云服务,与 CI/CD 集成良好 复杂业务链路(登录-浏览-下单)的性能测试。

总结

autocannon 是一个强大且易用的 HTTP 性能测试工具,尤其适合 Node.js 技术栈的开发者。它不仅能在命令行快速给出服务性能的“体检报告”,更关键的是,通过其程序化 API,能将性能回归测试无缝集成到自动化流程中,帮助你在代码上线前就能发现潜在的性能隐患。

如需查看完整的命令行参数和 API 选项,可以参考其官方文档或运行 autocannon -h 命令。