一、系统配置优化:为Node.js运行奠定基础
ulimit -n 65535;永久生效则编辑/etc/security/limits.conf,添加* soft nofile 65535和* hard nofile 65535。/etc/sysctl.conf,调整网络相关参数以提升并发处理能力:net.core.somaxconn = 65535(监听队列大小)、net.ipv4.tcp_max_syn_backlog = 65535(SYN队列大小)、net.ipv4.ip_local_port_range = 1024 65535(可用端口范围)。执行sysctl -p使配置生效。二、Node.js运行时优化:提升应用自身效率
cluster模块创建多个工作进程(数量等于CPU核心数),共享同一端口,实现多核并行处理。示例代码:const cluster = require('cluster');
const os = require('os');
if (cluster.isMaster) {
for (let i = 0; i < os.cpus().length; i++) cluster.fork();
cluster.on('exit', (worker) => console.log(`Worker ${worker.process.pid} died`));
} else {
require('./app.js'); // 启动应用
}
--max-old-space-size参数增大该值(如node --max-old-space-size=4096 app.js设置为4GB),避免大内存应用因内存不足崩溃。三、代码层面优化:减少资源消耗与阻塞
fs.readFileSync、child_process.spawnSync)阻塞事件循环,优先使用回调函数、Promise或async/await处理I/O操作(如数据库查询、文件读写、网络请求)。stream模块(如fs.createReadStream、fs.createWriteStream)逐块读取/写入数据,避免一次性加载整个文件到内存,降低内存占用。Map代替Object进行频繁查找,时间复杂度从O(n)降至O(1));递归深度过大时,改用循环或尾递归优化(ES6支持)。let/const声明局部变量,将变量封装在模块作用域内。四、进程与部署管理:保障稳定与高效
pm2 start app.js -i max(-i max表示根据CPU核心数创建对应数量的进程)。server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost:3000; # 转发到Node.js应用
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
FROM node:18-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
构建并运行容器:docker build -t my-node-app . && docker run -p 3000:3000 my-node-app。五、性能监控与分析:持续优化的前提
node --inspect启动应用,通过Chrome DevTools的Performance面板分析CPU使用情况;使用node --prof生成性能分析报告(生成.cpuprofile文件),再用clinic.js工具解析,定位性能瓶颈(如CPU密集型函数、内存泄漏)。pm2 monit命令实时监控应用状态(CPU、内存、事件循环延迟);使用New Relic、Datadog等APM工具监控生产环境性能,获取请求响应时间、数据库查询耗时、错误率等指标,及时预警性能问题。