在 Debian 上对 Node.js 应用进行性能测试
一 环境与基线准备
- 安装 Node.js 与包管理
- 使用 NodeSource 仓库安装稳定版本(示例为 22.x):
- curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
- sudo apt-get install -y nodejs
- 验证:node -v、npm -v
- 安装常用压测与监控工具
- 压测:npm i -g autocannon wrk artillery
- 监控:sudo apt-get install -y htop sysstat
- 运行方式建议
- 生产仿真:使用 PM2 或 systemd 启动应用,便于稳定复现与日志采集
- PM2:pm2 start app.js --name myapp && pm2 monit
- systemd:创建 /etc/systemd/system/nodeapp.service,设置 ExecStart=/usr/bin/node /opt/app/app.js,使用 systemctl start|status nodeapp
- 基线采集
- 记录空载指标:CPU、内存、磁盘 I/O、网络、文件句柄数(ulimit -n)
- 记录应用就绪时间、关键接口 P95/P99 响应时间(后续对比用)
二 基准测试工具与用法
| 工具 |
安装 |
典型命令 |
适用场景 |
| autocannon |
npm i -g autocannon |
autocannon -c 100 -d 30 -p 10 http://localhost:3000 |
API/静态资源的吞吐与延迟,易脚本化 |
| wrk |
apt-get install -y wrk |
wrk -t12 -c400 -d30s http://localhost:3000 |
高并发长连接场景,评估连接瓶颈 |
| Artillery |
npm i -g artillery |
artillery run scripts/load-test.yml |
复杂场景编排(场景、阶段、延迟、数据) |
- 示例要点
- 本地回环测试易受端口/协议栈限制,外网压测更贴近真实
- 建议固定并发模型:连接数(-c)、线程数(-t)、持续时间(-d)、管道化(-p)
- 多次运行取中位数,避免一次性异常值影响结论
三 系统级与进程级监控
- 系统资源
- htop:实时查看进程 CPU/内存占用
- vmstat 1:CPU、内存、上下文切换、I/O 概览
- iostat -x 1:磁盘 I/O 利用率与等待时间
- sar -u -r -b 1(需启用 sysstat):历史与实时资源统计
- Node 进程与应用
- PM2:pm2 monit 查看事件循环延迟、内存、日志;pm2 list/restart 管理进程
- 内置 API:process.cpuUsage()、process.memoryUsage() 输出 CPU/堆/驻留集等指标,便于在测试脚本中打点
- Express 场景可接入 express-status-monitor 暴露 /status 端点,快速查看请求速率、响应时间分布等
- 可视化与告警
- NetData:开箱即用的系统与应用监控仪表盘,适合持续观测
- New Relic / Datadog:APM 追踪、错误分析、分布式链路与告警能力
四 深入诊断与火焰图
- CPU 瓶颈定位
- 使用 0x 生成火焰图:
- 安装:npm i -g 0x
- 采集:0x app.js(或 0x autocannon … 对压测过程采样)
- 在浏览器打开生成的 HTML 报告,定位热点函数与调用栈
- 内存与 GC 问题
- 使用 heapdump 在测试期间触发堆快照,结合 Chrome DevTools 分析对象分配与泄漏
- 结合 process.memoryUsage() 观察堆使用随并发/时间的变化趋势
- 事件循环与异步 I/O
- 在 PM2 或日志中关注 event loop lag,配合 autocannon/wrk 的延迟分布判断 I/O 或业务逻辑阻塞
五 一套可复用的测试流程
- 步骤
- 环境准备:安装 Node、压测与监控工具;用 PM2/systemd 启动应用并接入日志
- 基线采集:记录空载与单实例就绪指标(CPU、内存、I/O、句柄、P95/P99)
- 设计用例:覆盖关键路径(登录、查询、写入、文件/静态资源),定义 SLA(如 P95 < 200ms)
- 基准测试:固定并发与持续时间,执行多轮(如 3–5 次),记录中位数与异常点
- autocannon -c 100 -d 30 -p 10 http://localhost:3000
- wrk -t12 -c400 -d30s http://localhost:3000
- 监控对照:压测同时采集 htop/vmstat/iostat、PM2 指标与业务日志
- 诊断优化:用 0x/heapdump 定位 CPU/内存热点,优化算法、连接池、缓存与 I/O
- 回归验证:在相同环境下复测,确认 P95/P99、吞吐、错误率与资源占用达到目标
- 持续观测:接入 NetData/New Relic/Datadog,设置阈值告警,观察线上波动与容量边界