在 Linux 环境下排查和解决 Node.js 性能瓶颈,一般遵循「先定位 → 再优化 → 最后验证」的思路。下面从 常见瓶颈类型 + 对应解决手段 系统说明。
现象
top / htop 中 node 进程 CPU 高排查
top -H -p <pid>
perf top -p <pid>
Node.js 自带:
node --prof app.js
node --prof-process isolate-*.log
工具:
0x(火焰图)clinic flame✅ 结论:JS 代码本身太重(加密、JSON、正则、大循环)
现象
排查
node --max-old-space-size=4096 app.js
node --trace-gc app.js
工具:
heapdumpchrome devtools memoryclinic heap✅ 常见原因
现象
await 很多但 CPU 不高排查
iostat -x 1
sar -n DEV 1
Node.js:
fs.readFileSync)现象
排查
setInterval(() => {
const start = Date.now();
setImmediate(() => {
console.log(Date.now() - start);
});
}, 1000);
✅ 原因
// 错误
const data = fs.readFileSync('big.json');
// 正确
const data = await fs.promises.readFile('big.json');
// 错误
global.cache = bigData;
// 正确
LRU 缓存 + TTL
JSON.parse 时避免超大对象Buffer 处理二进制const { Worker } = require('worker_threads');
适合:
const cluster = require('cluster');
if (cluster.isMaster) {
for (let i = 0; i < os.cpus().length; i++) cluster.fork();
}
或使用:
pm2 start app.js -i max
| 类型 | 适用 |
|---|---|
| 本地缓存 | 小数据 |
| Redis | 分布式 |
| CDN | 静态资源 |
const cache = new Map();
⚠️ 注意内存泄漏
node --max-old-space-size=4096 app.js
常用:
--max-old-space-size--gc-interval--optimize-for-sizeulimit -n
ulimit -n 65535
sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_tw_reuse=1
| 工具 | 用途 |
|---|---|
| top / htop | CPU / 内存 |
| perf | CPU 热点 |
| 0x | 火焰图 |
| clinic | 全面诊断 |
| PM2 | 进程管理 |
| Redis | 缓存 |
| Prometheus + Grafana | 监控 |
1. top / htop → 看 CPU / 内存
2. node --prof → 找热点函数
3. 0x / clinic flame → 火焰图
4. 优化代码 / 架构
5. 压测(autocannon / wrk)
6. 再监控
Node.js 性能瓶颈 80% 在代码和架构,20% 在系统和参数。
如果你愿意,我可以:
你可以直接贴: