有效管理 Node.js 服务器资源,核心目标是:防止内存泄漏、控制并发、优化 CPU、合理使用 I/O,并具备监控与自动恢复能力。下面从实战角度系统讲解。
✅ 原则:
不要在主线程做重计算,I/O 交给异步,CPU 交给 Worker / 子进程
setInterval)EventEmitter)const cache = {};
app.get('/data', (req, res) => {
cache[req.url] = bigData; // 永远不释放
});
✅ 正确做法
const LRU = require('lru-cache');
const cache = new LRU({ max: 100 });
Node 默认内存限制:
✅ 启动参数
node --max-old-space-size=2048 app.js
⚠️ 这只是“延缓”,不是解决方案
setInterval(() => {
const used = process.memoryUsage();
console.log(used.rss / 1024 / 1024, 'MB');
}, 60000);
❌ 错误示例
app.get('/compute', (req, res) => {
heavyLoop(); // 阻塞所有请求
});
✅ 正确方案
const { Worker } = require('worker_threads');
const { fork } = require('child_process');
const cluster = require('cluster');
const os = require('os');
if (cluster.isMaster) {
os.cpus().forEach(() => cluster.fork());
} else {
app.listen(3000);
}
✅ 提高 CPU 利用率
⚠️ 注意 session / 缓存要外部化(Redis)
const { RateLimiter } = require('limiter');
或 Nginx 层限流
server.keepAliveTimeout = 30000;
server.requestTimeout = 30000;
✅ PM2
pm2 start app.js -i max
pm2 monit
优势:
process.on('SIGTERM', () => {
server.close(() => {
process.exit(0);
});
});
// mysql / pg / redis
pool = createPool({ max: 10 });
❌ 每次请求创建连接
fs.createReadStream('big.file')
.pipe(res);
工具:
prom-client + Prometheusconst monitor = require('event-loop-lag')(1000);
setInterval(() => {
console.log('lag:', monitor());
}, 5000);
| 层级 | 建议 |
|---|---|
| Node | cluster / worker |
| 容器 | Docker + 资源限制 |
| 代理 | Nginx |
| 数据库 | 连接池 |
| 缓存 | Redis |
| 限流 | 网关层 |
✅ 是否避免阻塞事件循环
✅ 是否有内存泄漏风险
✅ 是否限制并发
✅ 是否使用进程管理器
✅ 是否监控关键指标
✅ 是否优雅退出
✅ 是否限制容器资源
Node 资源管理 = 不阻塞 + 不泄漏 + 有上限 + 有监控 + 能自愈
如果你需要:
可以直接告诉我,我可以给你一份定制化优化方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。