npm包autocannon牛逼的后台压力测试库

npm包autocannon牛逼的后台压力测试库

什么是autocannon?

autocannon是Node.js生态中最强大的HTTP/1.1基准测试工具之一,它具有以下核心优势:

  • 轻量高效:纯JavaScript实现,无需额外依赖
  • 精准控制:支持毫秒级精确的请求速率控制
  • 丰富指标:提供完整的延迟分布统计和实时监控
  • 灵活部署:既可作为CLI工具快速测试,也能通过API集成到CI/CD流程

注:

HTTP/1.1 版引入了管道机制(pipelining),即在同一个TCP连接里面,客户端可以同时发送多个请求,进一步改进了 HTTP 协议的效率

但这要求服务端必须按照请求发送的顺序返回响应,当顺序请求多个文件时,其中一个请求因为某种原因被阻塞时,在后面排队的所有请求也一并被阻塞,这就是队头阻塞 (Head-Of-Line Blocking)

多拓展一点:HTTP/2 服务有更先进的 multiplexing (多路复用的技术)机制(在https下支持)

javascript 复制代码
//我们可以使用Axios来发送HTTP请求并配置http2选项
import axios from 'axios';
​
axios({
  method: 'get',
  url: 'https://example.com/api/data',
  http2: true, // 启用http2协议
})
  .then(function (response) {
    // 请求成功后的处理
  })
  .catch(function (error) {
    // 请求失败后的处理
  });

安装与基本使用

安装方法

bash 复制代码
npm install -g autocannon
# 或作为项目依赖
npm install autocannon --save-dev

基本测试命令

arduino 复制代码
autocannon -c 100 -d 20 http://localhost:3000

这条命令会:

  • 模拟 100 个并发连接
  • 持续测试 20 秒
  • 针对 http://localhost:3000 进行压力测试

测试 POST 请求

json 复制代码
autocannon -m POST -H "Content-Type: application/json" -b '{"username":"test"}' http://localhost:3000/login

完整参数详解(按功能分类)

1. 连接控制参数

参数 缩写 类型 默认值 说明
--connections -c NUM 10 并发连接数
--pipelining -p NUM 1 每个连接的流水线请求数
--socketPath -S PATH - UNIX域套接字路径
--workers -w NUM - 工作线程数
--maxConnectionRequests -M NUM - 每个连接最大请求数
--maxOverallRequests -O NUM - 总体最大请求数

最佳实践

bash 复制代码
# 使用100个连接,每个连接pipelining 5个请求
autocannon -c 100 -p 5 http://localhost:3000

2. 时间控制参数

参数 缩写 类型 默认值 说明
--duration -d SEC 10 测试持续时间(秒)
--amount -a NUM - 总请求次数(覆盖duration)
--timeout -t SEC 10 请求超时时间
--warmup -W - - 预热参数

示例

bash 复制代码
# 运行30秒测试,前5秒预热
autocannon -d 30 -W "-c 1 -d 5" http://localhost:3000

3. 请求配置参数

参数 缩写 类型 默认值 说明
--method -m METHOD GET HTTP方法
--body -b STRING - 请求体
--form -F JSON - 表单数据
--input -i FILE - 请求体文件
--headers -H K=V - 请求头
--har - FILE - HAR文件导入

复杂请求示例

json 复制代码
autocannon -m PUT \
  -H "Authorization: Bearer token" \
  -H "X-Request-ID: 123" \
  -b '{"update":"value"}' \
  http://localhost:3000/api

4. 速率控制参数

参数 缩写 类型 默认值 说明
--connectionRate -r NUM - 单连接每秒请求数
--overallRate -R NUM - 总每秒请求数
--ignoreCoordinatedOmission -C BOOL false 忽略协调遗漏

限速测试

bash 复制代码
# 限制总QPS为500
autocannon -R 500 http://localhost:3000

5. 高级功能参数

参数 缩写 类型 默认值 说明
--bailout -B NUM - 失败次数阈值
--expectBody -E STRING - 预期响应体
--idReplacement -I BOOL false 启用ID替换
--debug - BOOL false 调试模式
--renderStatusCodes - BOOL false 状态码统计

6. 输出控制参数

参数 缩写 类型 默认值 说明
--json -j BOOL false JSON格式输出
--latency -l BOOL false 显示完整延迟数据
--no-progress -n BOOL false 隐藏进度条
--title -T STRING - 测试标题
--excludeErrorStats -x BOOL false 排除错误统计

深入理解 --pipelining 参数

什么是 HTTP Pipelining?

HTTP pipelining 允许客户端在收到前一个响应之前就发送多个请求,大幅提升效率。

最适合的情况

  1. 高延迟网络:减少网络往返时间的影响
  2. HTTP/1.1 服务:HTTP/1.1 原生支持 pipelining
  3. 持久连接测试:测试服务端的长连接处理能力

不适用的情况

  1. HTTP/2 服务:HTTP/2 有更先进的 multiplexing 机制
  2. 非幂等操作:POST/PUT 等可能引发副作用的方法
  3. 严格顺序依赖:要求请求必须按顺序处理的场景

举个栗子:快递站取快递

假设你要取10个快递:

情况1:不加-p参数(默认-p 1

  • 你每次只告诉快递站"我要拿1个快递"
  • 拿到第1个后,再说"我要拿第2个"...
  • 重复10次对话
  • 问题:每次都要重新排队,效率低

情况2:加上-p 10参数

  • 你直接告诉快递站:"我要一次性拿10个快递!"
  • 快递站一次性准备好10个快递给你
  • 优势:只排1次队,效率超高

工作原理对比

不加 pipelining (-p 1) :

css 复制代码
[请求1] -> [响应1] <- 
[请求2] -> [响应2] <- 
...

启用 pipelining (-p 10) :

css 复制代码
[请求1]->[请求2]->[请求3]... -> 服务器
[响应1]->[响应2]->[响应3]... <- 服务器

实际效果示例

bash 复制代码
# 不启用 pipelining
autocannon -c 100 -d 10 http://localhost:3000
→ 约 5000 请求/秒
​
# 启用 pipelining
autocannon -c 100 -p 10 -d 10 http://localhost:3000 
→ 约 15000 请求/秒(提升 3 倍)

最佳实践

  • -p 2-5 开始逐步增加
  • 不要超过 -p 10(除非服务端明确支持)
  • HTTP/2 服务不需要使用此参数

解读测试结果

典型输出示例:

bash 复制代码
Running 10s test @ http://localhost:3000
10 connections
​
┌─────────┬──────┬──────┬───────┬──────┬─────────┬─────────┬───────┐
│ Stat    │ 2.5% │ 50%  │ 97.5% │ 99%  │ Avg     │ Stdev   │ Max   │
├─────────┼──────┼──────┼───────┼──────┼─────────┼─────────┼───────┤
│ Latency │ 8 ms │ 12 ms│ 25 ms │ 30 ms│ 13.4 ms │ 7.25 ms │ 50 ms │
└─────────┴──────┴──────┴───────┴──────┴─────────┴─────────┴───────┘
┌───────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
│ Stat      │ 1%      │ 2.5%    │ 50%     │ 97.5%   │ Avg     │ Stdev   │ Min     │
├───────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Req/Sec   │ 715     │ 715     │ 892     │ 905     │ 853.6   │ 62.4    │ 715     │
└───────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘
​
Req/Bytes counts sampled once per second.
8k requests in 10.01s, 1.05 MB read

关键指标

  • Latency (延迟) :重点关注 99% 百分位的延迟
  • Req/Sec (每秒请求数) :系统的吞吐量指标
  • 错误率:检查是否有失败的请求

实战场景与参数组合

场景1:API基准测试

bash 复制代码
autocannon -c 50 -p 3 -d 60 \
  -m GET \
  -H "Authorization: Bearer xyz" \
  http://localhost:3000/api/users

场景2:登录压力测试

json 复制代码
autocannon -c 100 -d 30 \
  -m POST \
  -H "Content-Type: application/json" \
  -b '{"username":"user","password":"pwd"}' \
  http://localhost:3000/login

场景3:文件上传测试

json 复制代码
autocannon -c 20 -d 20 \
  -m POST \
  -F '{"file":{"type":"file","path":"/path/to/file.jpg"}}' \
  http://localhost:3000/upload

进阶技巧

编程式调用

javascript 复制代码
const autocannon = require('autocannon')
​
const instance = autocannon({
  url: 'http://localhost:3000',
  connections: 100,
  duration: 30,
  pipelining: 3,
  headers: {
    'X-Custom': 'value'
  }
}, (err, result) => {
  console.log('测试完成', result)
})
​
// 手动停止测试
setTimeout(() => instance.stop(), 5000)

CI/CD集成

arduino 复制代码
# package.json
{
  "scripts": {
    "test:perf": "autocannon -c 50 -d 20 -j http://localhost:3000 > perf.json"
  }
}

使用配置文件

创建 autocannon.json

json 复制代码
{
  "url": "http://localhost:3000",
  "connections": 50,
  "duration": 15,
  "method": "GET",
  "headers": {
    "Authorization": "Bearer token123"
  }
}

然后运行:

arduino 复制代码
autocannon --config autocannon.json

与其他工具对比

工具 优势 适用场景
autocannon(Javascript) 轻量易用 HTTP API测试
ab(C语言) 简单 快速测试
wrk(C语言) 高性能 极限压测
k6(Javascript) 丰富场景 复杂负载测试
JMeter(Java) 全面功能 企业级测试
相关推荐
喝拿铁写前端3 小时前
前端与 AI 结合的 10 个可能路径图谱
前端·人工智能
codingandsleeping3 小时前
浏览器的缓存机制
前端·后端
-代号95273 小时前
【JavaScript】十二、定时器
开发语言·javascript·ecmascript
灵感__idea4 小时前
JavaScript高级程序设计(第5版):扎实的基本功是唯一捷径
前端·javascript·程序员
摇滚侠4 小时前
Vue3 其它API toRow和markRow
前端·javascript
難釋懷4 小时前
JavaScript基础-history 对象
开发语言·前端·javascript
beibeibeiooo4 小时前
【CSS3】04-标准流 + 浮动 + flex布局
前端·html·css3
拉不动的猪4 小时前
刷刷题47(react常规面试题2)
前端·javascript·面试
浪遏5 小时前
场景题:大文件上传 ?| 过总字节一面😱
前端·javascript·面试
计算机毕设定制辅导-无忧学长5 小时前
HTML 与 JavaScript 交互:学习进程中的新跨越(一)
javascript·html·交互