在CentOS环境下优化Node.js运行,需从版本管理、系统配置、代码优化、并发处理、内存管理、监控运维六大维度综合施策,以下是具体策略:
curl -sL https://rpm.nodesource.com/setup_18.x | sudo bash - # 替换为最新版本号(如18.x)
sudo yum install -y nodejs
nvm(Node Version Manager),避免全局安装冲突:curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc # 加载nvm环境
nvm install --lts # 安装最新LTS版本
nvm use --lts # 切换至LTS版本
/etc/sysctl.conf提升网络与内存性能,执行sudo sysctl -p使配置生效:fs.file-max = 65536 # 增加文件描述符上限(默认1024太小)
net.ipv4.tcp_tw_reuse = 1 # 复用TIME-WAIT连接,减少连接建立时间
net.core.somaxconn = 4096 # 增加TCP监听队列长度(默认128易溢出)
net.ipv4.tcp_max_syn_backlog = 4096 # 增加SYN队列长度
echo "root soft nofile 65535" >> /etc/security/limits.conf
echo "root hard nofile 65535" >> /etc/security/limits.conf
ulimit -n 65535 # 立即生效(仅当前会话)
async/await或Promise替代回调函数,避免阻塞事件循环。例如:// 避免回调地狱
async function fetchData() {
const user = await db.getUser(id);
const orders = await db.getOrders(user.id);
return { user, orders };
}
Stream逐步读取/写入,避免内存溢出:const fs = require('fs');
const readStream = fs.createReadStream('large-file.csv');
const writeStream = fs.createWriteStream('processed.csv');
readStream.pipe(writeStream); // 流式传输,内存占用恒定
mysql2的pool)复用连接:CREATE INDEX idx_user_email ON users(email); -- 添加索引加速查询
const mysql = require('mysql2/promise');
const pool = mysql.createPool({ host: 'localhost', user: 'root', database: 'test', waitForConnections: true, connectionLimit: 10, queueLimit: 0 });
Redis缓存频繁访问的数据(如会话、热点数据),减少数据库查询:const redis = require('redis');
const client = redis.createClient();
client.get('user:1', async (err, data) => {
if (data) return res.json(JSON.parse(data));
const user = await db.getUser(1);
client.setex('user:1', 3600, JSON.stringify(user)); // 缓存1小时
res.json(user);
});
cluster模块创建多个工作进程(每个进程对应一个CPU核心),共享端口并实现负载均衡:const cluster = require('cluster');
const os = require('os');
if (cluster.isMaster) {
const numCPUs = os.cpus().length;
for (let i = 0; i < numCPUs; i++) cluster.fork(); // 创建子进程
cluster.on('exit', (worker) => cluster.fork()); // 子进程崩溃时重启
} else {
require('./app.js'); // 工作进程启动应用
}
PM2是Node.js进程管理器,支持负载均衡、自动重启、日志管理:sudo npm install -g pm2
pm2 start app.js -i max # 根据CPU核心数启动最大进程数
pm2 monit # 监控进程状态
pm2 save # 保存当前进程列表
pm2 startup # 设置开机自启
--max-old-space-size参数增大V8引擎的堆内存(默认1.5GB,适合大内存应用):node --max-old-space-size=4096 app.js # 设置旧生代内存为4GB
heapdump生成堆快照,分析内存占用:npm install heapdump --save
在代码中添加:const heapdump = require('heapdump');
process.on('SIGUSR2', () => heapdump.writeSnapshot('/tmp/heapdump.heapsnapshot')); // 收到SIGUSR2信号时生成快照
用Chrome DevTools打开.heapsnapshot文件,查找未被释放的对象(如全局变量、闭包)。PM2内置监控或New Relic、Datadog等工具,跟踪CPU、内存、响应时间、错误率等指标:pm2 install pm2-prometheus-exporter # 导出Prometheus格式指标
pm2 monit # 实时监控
winston或pino记录结构化日志,结合ELK Stack(Elasticsearch+Logstash+Kibana)分析日志:const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [new winston.transports.File({ filename: 'error.log', level: 'error' }), new winston.transports.File({ filename: 'combined.log' })],
});
logger.info('Application started');
Apache JMeter或Artillery模拟高并发场景,找出性能瓶颈(如慢查询、接口延迟):npm install -g artillery
artillery quick --count 100 --rate 10 http://localhost:3000/api # 发送100次请求,每秒10次
通过以上策略,可显著提升CentOS上Node.js应用的性能、稳定性与并发处理能力。需根据实际业务场景(如高并发、大数据量)选择针对性优化方案,并定期通过监控工具调整配置。