n8n 如何用 n8n-benchmark 压测工具对运行中的实例执行并发请求基准测试
【免费下载链接】n8nFair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.项目地址: https://gitcode.com/GitHub_Trending/n8/n8n
n8n 仓库内置了一个名为n8n-benchmark的压测 CLI 工具(包名@n8n/n8n-benchmark),用于对一个已经在运行中的 n8n 实例执行基准测试:它会先通过 API 确认实例在线、按需初始化 owner 账号,再把场景(scenario)附带的工作流、凭证等测试数据导入实例,最后用 k6 以指定并发数发起持续一段时间的真实请求,并输出结果摘要。
本文以「对运行中的实例执行并发请求基准测试」为目标,给出可直接执行的命令、关键参数和结果查看方式。适用前提:
- 目标 n8n 实例已启动,且可以通过 HTTP 访问(本地
http://localhost:5678或任意公网/内网 URL); - 你拥有该实例 owner(首个注册用户)的邮箱和密码,工具用它登录并导入测试数据;
- 使用 Docker 方式运行压测器(推荐路径,下文默认);无 Docker 的替代路径见后文。
用 Docker 镜像对运行中的实例执行压测
官方提供的最简单方式是直接拉取 benchmark 镜像,一条docker run命令即可。命令中的--n8nBaseUrl、--n8nUserEmail、--n8nUserPassword三个值需要你替换为实例的真实地址与真实 owner 账号(下面沿用 README 中的占位写法,执行前必须替换):
docker pull ghcr.io/n8n-io/n8n-benchmark:latest # 打印 run 子命令的帮助,列出全部可用参数 docker run ghcr.io/n8n-io/n8n-benchmark:latest run --help # 以 5 个并发请求对 single-webhook 场景压测 1 分钟 docker run ghcr.io/n8n-io/n8n-benchmark:latest run \ --n8nBaseUrl=https://instance.url \ --n8nUserEmail=InstanceOwner@email.com \ --n8nUserPassword=InstanceOwnerPassword \ --vus=5 \ --duration=1m \ --scenarioFilter=single-webhook两个执行参数决定压测的强度:
--vus:并发请求数(源码中的描述是 "Number of concurrent requests to make"),默认5;--duration:压测持续时间,必须带单位,例如1m、30s,默认1m。
--scenarioFilter按名称筛选只跑某一个场景;不传该参数时会运行--testScenariosPath指向目录下的全部场景。
注意一个副作用:运行某个场景前,工具会先把该场景声明的测试数据(工作流 JSON、凭证文件等)通过 API 导入你的实例,并等待约 1 秒让工作流激活(源码注释说明在 multi-main 模式下激活可能更慢)。也就是说,压测会在你运行中的实例里留下测试工作流,选择场景和实例时要把这点考虑进去。
先列出可用场景,再选择压测对象
镜像内置的场景放在仓库的 scenarios 目录(即 packages/@n8n/benchmark/README.md 中链接的./scenarios)。每个场景由三部分组成:
- 一个 manifest 文件(
*.manifest.json),描述场景名、说明、要导入的测试数据; - 要导入实例的测试数据,如工作流文件
workflowFiles、凭证credentialFiles、数据表dataTableFile; - 一个 k6 脚本,实际执行请求步骤。脚本在运行时从环境变量
API_BASE_URL拿到实例地址。
字段定义见 scenario.schema.json。
用list子命令可以在不压测的情况下查看镜像内置的全部场景及其说明:
docker run ghcr.io/n8n-io/n8n-benchmark:latest list当前仓库内置的场景包括:binary-data、credential-http-node、data-table-node、http-node、js-code-node、multiple-webhooks、py-code-node、set-node-expressions、single-webhook。
以single-webhook场景为例,它的 k6 脚本(见 single-webhook.script.js)每轮请求执行GET ${API_BASE_URL}/webhook/single-webhook,并用check校验响应状态码是否为 200;状态码不符时会打印Invalid response. Received status ...错误日志。其他场景测的是不同节点/路径,按你要压测的对象选择即可。
执行过程与结果验证
压测启动后,控制台日志会按顺序给出当前阶段(来自 scenario-runner.ts 与 k6-executor.ts 的实际输出):
Waiting for n8n <baseUrl> to become online—— 轮询等待实例在线;Setting up owner—— 如果实例还没有 owner,会用你提供的邮箱/密码初始化,然后登录;Running scenario: <前缀>-<场景名>,随后Loading and importing data(导入测试数据);Executing scenario script—— k6 开始执行,--vus个虚拟用户按--duration持续发请求。
k6 执行结束后,工具会把一段文本摘要直接打印到标准输出(通过注入的handleSummary生成textSummary),同时落盘一个<场景运行名>.summary.json文件,包含 k6 的完整 end-of-test 数据。判断本次压测是否成功,以两部分为准:
- 终端的 k6 文本摘要(请求量、耗时分布等,数值取决于你的实例负载,不是固定值);
- 场景中 k6 脚本的 check 结果,例如
single-webhook场景会报告is status 200是否通过;如果看到Invalid response. Received status ...日志,说明实例侧返回了非 200,需要检查该 webhook 是否可用。
可选:采集实例应用指标
如果实例开启了 metrics 端点,压测期间可以额外采样:
docker run ghcr.io/n8n-io/n8n-benchmark:latest run \ --n8nBaseUrl=https://instance.url \ --n8nUserEmail=InstanceOwner@email.com \ --n8nUserPassword=InstanceOwnerPassword \ --vus=5 \ --duration=1m \ --scenarioFilter=single-webhook \ --collectAppMetrics--collectAppMetrics(默认false,可用环境变量COLLECT_APP_METRICS控制)会让工具按--appMetricsPollInterval指定的间隔(默认5000毫秒)轮询实例的/metrics端点,启动/停止时分别打印Started polling app metrics from <url>/metrics every <n>ms与Stopped polling app metrics。
可选:把结果推送到 webhook 或 k6 输出
run命令还支持(均可用对应环境变量替代):
--resultWebhookUrl/--resultWebhookAuthHeader(环境变量BENCHMARK_RESULT_WEBHOOK_URL、BENCHMARK_RESULT_WEBHOOK_AUTH_HEADER):测试结束后把汇总报告 POST 到指定 URL;--out(k6 的--out参数,环境变量K6_OUT);--k6ApiToken(环境变量K6_API_TOKEN):未指定 webhook 且未指定--out时,k6 会以--out cloud上报到 k6 cloud;--tags:以逗号分隔的key=value形式给本次运行打标签;--scenarioNamePrefix:场景运行名前缀,默认Unnamed。
使用自定义场景
如果你想压测自己的工作流路径,可以准备自己的场景目录,通过-v挂载进容器的/scenarios,并用--testScenariosPath指向它:
# 假设你的场景文件在 ./scenarios 目录 docker run -v ./scenarios:/scenarios ghcr.io/n8n-io/n8n-benchmark:latest run \ --n8nBaseUrl=https://instance.url \ --n8nUserEmail=InstanceOwner@email.com \ --n8nUserPassword=InstanceOwnerPassword \ --vus=5 \ --duration=1m \ --testScenariosPath=/scenarios自定义场景的目录组织与内置场景一致:manifest 文件(name、description、scriptPath、scenarioData四个必填字段,schema 见 scenario.schema.json)、测试数据文件和一个 k6 脚本(脚本通过__ENV.API_BASE_URL获取实例地址)。
替代路径:不用预构建镜像运行 CLI
如果不想拉取官方镜像,可以按 README 从源码构建或使用本机的 k6:
本地构建 Docker 镜像(需在仓库根目录执行;注释说明 k6 没有 linux 的 arm64 构建,所以要按 amd64 平台构建):
docker build --platform linux/amd64 -t n8n-benchmark -f packages/@n8n/benchmark/Dockerfile . docker run \ -e N8N_USER_EMAIL=user@n8n.io \ -e N8N_USER_PASSWORD=password \ # For macos, n8n running outside docker -e N8N_BASE_URL=http://host.docker.internal:5678 \ n8n-benchmark这里N8N_BASE_URL、N8N_USER_EMAIL、N8N_USER_PASSWORD是三个 flag 对应的环境变量,示例值(user@n8n.io等)来自 README,执行前替换为真实值;http://host.docker.internal:5678是 macOS 上 n8n 运行在宿主机而非容器内时的地址。
不用 Docker:需要本机安装 k6 和 Node.js v20 或更高(README 的要求;另注意 package.json 的engines字段声明node >=24.0.0,两者不完全一致,建议直接按更高的 Node 24 准备环境),然后在 benchmark 包内构建后运行:
pnpm build # Run tests against http://localhost:5678 with specified email and password N8N_USER_EMAIL=user@n8n.io N8N_USER_PASSWORD=password ./bin/n8n-benchmark run如果找不到 k6 可执行文件,工具会报错并提示将 k6 加入PATH或用K6_PATH环境变量(--k6ExecutablePath,默认k6)指定其路径。
限制与边界
- 该 CLI 的定位是「对单个 n8n 实例运行一个或多个场景」(README 原文如此),内置的完整 benchmark suite(多种 n8n 部署拓扑
./scripts/n8nSetups加云环境编排)属于仓库内部的全套基准流程(pnpm benchmark-locally/pnpm benchmark-in-cloud),不在「对已有运行实例压测」的路径内; --vus默认 5、--duration默认1m,只测一个场景时务必显式传--scenarioFilter,否则会跑完目录下所有场景;- 压测会向实例导入测试工作流并真实触发请求,不要对承载生产关键流程的实例随意拉高
--vus; - 镜像默认基于 amd64 构建运行(k6 无 linux arm64 构建),在 Apple Silicon 等 arm64 机器上使用官方镜像时依赖容器平台的多架构支持。
【免费下载链接】n8nFair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.项目地址: https://gitcode.com/GitHub_Trending/n8/n8n
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考