发布于2026-07-06 阅读(0)
扫一扫,手机访问
说起Ubuntu下的Node.js性能测试,很多开发者都踩过坑——环境没统一、预热没做够、工具选错,结果跑出来的数据根本没法用。这篇文章就把这些坑一个个填上,从环境准备到工具选型,再到深入诊断和自动化对比,一条线讲清楚。

性能测试的根基,是可控的环境和可复现的基线。下面这几条是必须盯死的。
工具选对了,事半功倍。下面按场景拆开说。
npx autocannon -c 100 -d 30 http://localhost:3000/api/pingwrk -t12 -c400 -d30s http://localhost:3000/ab -n 1000 -c 50 http://localhost:3000/bombardier -c 100 -d 30s http://localhost:3000/光靠外部压测不够,还得从应用内部拿到细粒度的数据。
const express = require('express');
const morgan = require('morgan');
const app = express();
morgan.token('response-time-ms', (req, res) => {
return res.getHeader('X-Response-Time') || '-';
});
app.use((req, res, next) => {
const start = Date.now();
res.on('finish', () => {
const duration = Date.now() - start;
res.setHeader('X-Response-Time', `${duration}ms`);
console.log(`${req.method} ${req.url} ${res.statusCode} ${duration}ms`);
});
next();
});定位到性能瓶颈了,还得下钻看看具体原因。
npx clinic doctor -- node app.js
npx clinic flame -- node app.jsconst heapdump = require('heapdump');
heapdump.writeSnapshot((err, filename) => console.log(filename));node --inspect app.js
# 打开 chrome://inspect 连接并采集快照手动跑一次还行,长期维护版本对比必须自动化。下面是一个批量对比多个Node.js版本的示例脚本(配合nvm和autocannon):
#!/usr/bin/env bash
set -e
VERSIONS=("16" "18" "20" "22")
RESULTS="perf-$(date +%F).csv"
echo "version,timestamp,startup_ms,rss_mb,throughput_rps,p95_ms" > "$RESULTS"
for V in "${VERSIONS[@]}"; do
echo "=== Testing Node.js $V ==="
nvm use "$V" >/dev/null
FULL=$(node -v)
TS=$(date +%s)
# 启动被测服务(示例:node server.js)
node server.js &
PID=$!
sleep 5
# 启动时间(简化测量)
STARTUP_MS=$( (time node -e "" 2>&1) | awk '/real/ {print $2*1000}' )
# RSS 内存(MB)
RSS_MB=$(node -e "console.log(Math.round(process.memoryUsage().rss/1024/1024))")
# HTTP 基准(并发 50,持续 10s)
OUT=$(npx autocannon -c 50 -d 10 http://localhost:3000/api/ping)
THROUGHPUT=$(echo "$OUT" | grep -E 'Requests/sec' | awk '{print $2}')
P95=$(echo "$OUT" | grep -E '95%' | awk '{print $2}')
kill "$PID" || true
echo "$FULL,$TS,$STARTUP_MS,$RSS_MB,$THROUGHPUT,$P95" >> "$RESULTS"
echo "Done: $FULL"
done
echo "Results sa ved to $RESULTS"
建议把这个脚本接入CI/CD(比如GitHub Actions),定时回归,或者配合Grafana可视化对比趋势。这样,每次版本更新都能快速看到性能变化,再也不用靠感觉拍脑袋了。