CentOS下Node.js内存调优指南
Node.js默认内存限制(64位系统约1.5GB)可能无法满足大型应用需求,需通过以下方式调整:
--max-old-space-size参数(单位:MB),例如将内存限制提升至4GB:node --max-old-space-size=4096 your_app.js
~/.bashrc或~/.zshrc),添加:export NODE_OPTIONS="--max-old-space-size=4096"
执行source ~/.bashrc使配置生效,后续所有Node.js进程均会继承该设置。ecosystem.config.js文件设置内存限制及自动重启(避免内存溢出导致进程崩溃):module.exports = {
apps: [{
name: 'your-app',
script: 'your_app.js',
exec_mode: 'cluster', // 启用集群模式(利用多核CPU)
max_memory_restart: '4G' // 内存超过4GB时自动重启
}]
};
启动命令:pm2 start ecosystem.config.js。内存泄漏或不合理的代码逻辑是导致内存问题的核心原因,需重点排查:
emitter.removeListener()),避免事件堆积;try-finally或async-await确保资源释放。stream模块逐块处理,避免一次性加载全部数据到内存。例如:const fs = require('fs');
const readStream = fs.createReadStream('large_file.txt');
const writeStream = fs.createWriteStream('output.txt');
readStream.pipe(writeStream); // 流式传输,内存占用恒定
CREATE INDEX语句),加速查询减少内存占用;mysql2的pool模块)复用数据库连接,避免频繁创建/销毁连接的开销;LIMIT子句),避免一次性获取过多数据。node-cache(内存缓存)或Redis(分布式缓存)存储,减少不必要的计算或数据库访问。例如:const NodeCache = require('node-cache');
const myCache = new NodeCache({ stdTTL: 60 }); // 缓存60秒
const data = myCache.get('key');
if (!data) {
data = fetchDataFromDB(); // 从数据库获取
myCache.set('key', data); // 存入缓存
}
调整CentOS系统配置,提升Node.js运行环境的稳定性:
ulimit -n 65535
永久调整:编辑/etc/security/limits.conf,添加:* soft nofile 65535
* hard nofile 65535
/etc/sysctl.conf文件,优化虚拟内存使用:vm.swappiness=10 # 降低交换空间使用倾向(值越小越倾向于使用物理内存)
vm.vfs_cache_pressure=50 # 控制内核回收用于目录和inode缓存的内存的倾向(值越大回收越积极)
执行sysctl -p使配置生效。free -h查看内存使用情况,df -h查看交换空间。若物理内存不足(如剩余内存<10%),创建交换空间:sudo fallocate -l 4G /swapfile # 创建4GB交换文件
sudo chmod 600 /swapfile # 设置权限
sudo mkswap /swapfile # 格式化为交换空间
sudo swapon /swapfile # 启用交换空间
编辑/etc/fstab,添加/swapfile swap swap defaults 0 0,确保重启后生效。。持续监控内存状态,快速定位内存泄漏或瓶颈:
--inspect参数启动应用,配合Chrome DevTools分析内存:node --inspect your_app.js
打开Chrome浏览器,访问chrome://inspect,点击“Open dedicated DevTools for Node”,使用“Memory” tab生成堆快照,查看内存占用对象。heapdump:在代码中插入heapdump.writeSnapshot('/path/to/snapshot.heapsnapshot'),生成堆快照文件,用DevTools分析;memwatch-next:监听内存泄漏,当检测到泄漏时输出警告信息:const memwatch = require('memwatch-next');
memwatch.on('leak', (info) => {
console.error('Memory leak detected:', info);
});
top(查看进程内存占用)、vmstat 1(查看虚拟内存统计,如si/so表示交换空间读写)、free -h(查看内存使用详情)等命令,定期检查系统内存状态。。cluster模块创建多个工作进程(每个进程对应一个CPU核心),充分利用多核CPU资源,分散内存压力。例如:const cluster = require('cluster');
const os = require('os');
if (cluster.isMaster) {
for (let i = 0; i < os.cpus().length; i++) {
cluster.fork(); // 创建子进程
}
} else {
require('./app.js'); // 子进程执行应用逻辑
}
source-map(减少打包体积)、使用splitChunks拆分公共依赖(如lodash、react),或替换为更轻量的打包工具(如Vite)。