Node.js 性能优化实战
理解事件循环
Node.js 的高并发能力来自于其单线程事件循环模型。理解事件循环的各个阶段(timers、I/O callbacks、idle/prepare、poll、check、close callbacks)是排查性能问题的基础。
找出性能瓶颈
使用内置的 --inspect 标志配合 Chrome DevTools 进行 CPU profiling:
node --inspect --inspect-brk app.js
# 在 Chrome 打开 chrome://inspect
常见瓶颈及对策:
| 瓶颈类型 | 症状 | 对策 |
|---|---|---|
| CPU 密集 | 事件循环阻塞 | Worker Threads |
| 内存泄漏 | 内存持续增长 | Heap Snapshot 分析 |
| I/O 等待 | 高延迟低 CPU | 连接池、缓存 |
集群模式充分利用多核
import cluster from "cluster";
import os from "os";
if (cluster.isPrimary) {
const cpus = os.cpus().length;
for (let i = 0; i < cpus; i++) {
cluster.fork();
}
cluster.on("exit", (worker) => {
console.log(`Worker ${worker.process.pid} died, restarting...`);
cluster.fork();
});
} else {
// 启动 HTTP 服务
startServer();
}
流式处理大数据
避免将大文件一次性读入内存,使用流式处理:
import { createReadStream, createWriteStream } from "fs";
import { pipeline } from "stream/promises";
import { createGzip } from "zlib";
await pipeline(
createReadStream("large-file.txt"),
createGzip(),
createWriteStream("large-file.txt.gz")
);
总结
Node.js 性能优化没有银弹。先测量、再定位、再优化,避免过早优化。掌握 profiling 工具的使用,是每个 Node.js 开发者必备的技能。