温馨提示×

CentOS中Node.js性能优化技巧

小樊
57
2025-10-03 03:38:15
栏目: 编程语言

使用最新稳定版Node.js
新版本通常包含性能改进、bug 修复和内存管理优化,能直接提升应用运行效率。在CentOS上可通过NodeSource仓库安装最新版,例如:

curl -sL https://rpm.nodesource.com/setup_18.x | sudo bash -
sudo yum install -y nodejs

优化内存管理

  • 调整内存限制:通过--max-old-space-size参数扩大V8引擎的旧生代内存(默认1.5GB),避免内存溢出。例如设置为4GB:
    export NODE_OPTIONS="--max-old-space-size=4096"
    
  • 避免内存泄漏:及时移除无用的全局变量、事件监听器(如removeListener),使用memwatch-nextheapdump工具定位泄漏(例如生成堆快照分析内存占用)。

利用集群模块充分利用多核CPU
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) => cluster.fork()); // 进程崩溃时自动重启
} else {
  require('./app.js'); // 工作进程启动应用
}

使用反向代理(如Nginx)优化请求处理
Nginx可作为前端代理,处理静态文件缓存、SSL卸载和负载均衡,减轻Node.js负担。例如Nginx配置负载均衡:

http {
  upstream node_app {
    server 127.0.0.1:3000;
    server 127.0.0.1:3001;
  }
  server {
    listen 80;
    location / {
      proxy_pass http://node_app;
      proxy_set_header Host $host;
    }
  }
}

启用缓存减少重复计算

  • 内存缓存:使用node-cacheRedis缓存频繁访问的数据(如数据库查询结果、会话信息),降低响应时间。例如node-cache用法:
    const NodeCache = require('node-cache');
    const cache = new NodeCache({ stdTTL: 60 }); // 缓存60秒
    const data = cache.get('key') || (cache.set('key', fetchData(), 60), fetchData());
    
  • 静态文件缓存:通过Nginx设置expires头缓存静态资源(如CSS、JS),减少服务器请求。

优化数据库访问

  • 使用连接池:通过mysql2pg-pool模块复用数据库连接,避免频繁创建/销毁连接的开销。例如mysql2连接池:
    const mysql = require('mysql2/promise');
    const pool = mysql.createPool({ host: 'localhost', user: 'root', database: 'test', waitForConnections: true, connectionLimit: 10 });
    
  • 优化查询:为常用查询字段添加索引,使用参数化查询避免SQL注入,减少不必要的数据返回(如SELECT指定字段而非SELECT *)。

使用异步编程避免阻塞事件循环
优先使用async/awaitPromise处理I/O操作(如文件读写、数据库查询),避免同步函数(如fs.readFileSync)阻塞事件循环。例如异步读取文件:

const fs = require('fs').promises;
async function readFile() {
  try {
    const data = await fs.readFile('file.txt', 'utf8');
    console.log(data);
  } catch (err) { console.error(err); }
}

使用流式处理大数据
处理大文件或网络流时,使用Stream模块分块读取/写入数据,减少内存占用。例如读取大文件的流式处理:

const fs = require('fs');
const readStream = fs.createReadStream('large_file.txt');
readStream.on('data', (chunk) => console.log(`Received ${chunk.length} bytes`));
readStream.on('end', () => console.log('Finished reading'));

实施监控与性能分析

  • 进程管理:使用PM2监控应用内存、CPU使用率,实现自动重启和负载均衡。例如:
    pm2 start app.js --name "my-app" --max-memory-restart 4096M
    
  • 性能分析:通过--inspect参数启动调试,使用Chrome DevTools分析内存快照和CPU性能;或使用New RelicDatadog等工具监控实时性能指标。

调整系统配置

  • 增加文件描述符限制:Node.js处理大量并发请求时,需提高文件描述符限制(默认1024)。编辑/etc/security/limits.conf添加:
    * soft nofile 65535
    * hard nofile 65535
    
  • 使用SSD硬盘:SSD的高I/O性能可显著提升文件读写和数据库操作速度。

0