CentOS上Node.js性能优化策略
确保CentOS系统及内核为最新版本,通过sudo yum update -y更新系统包,修复已知漏洞并提升底层性能。同时,升级GCC编译器以支持更高版本的Node.js编译需求。
修改/etc/sysctl.conf文件优化网络与内存管理,提升并发处理能力:
# 增加文件描述符限制(支持更多并发连接)
echo "fs.file-max = 65536" >> /etc/sysctl.conf
# 启用TCP快速复用(减少TIME_WAIT状态连接)
echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf
# 增加TCP同步队列长度(应对高并发连接)
echo "net.core.somaxconn = 4096" >> /etc/sysctl.conf
# 调整网络缓冲区大小(提升数据传输效率)
echo "net.core.netdev_max_backlog = 2000" >> /etc/sysctl.conf
# 应用参数变更
sudo sysctl -p
同时,调整/etc/security/limits.conf增加用户进程与文件打开限制:
* soft nofile 65536
* hard nofile 65536
若使用firewalld,允许应用端口(如80、443、3000)通过,并关闭不必要的端口:
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload
如需更高性能,可临时关闭firewalld(生产环境需谨慎):
sudo systemctl stop firewalld
sudo systemctl disable firewalld
通过NodeSource仓库安装长期支持(LTS)版本,确保稳定性与性能优化:
curl -sL https://rpm.nodesource.com/setup_18.x | sudo bash -
sudo yum install -y nodejs
node -v # 验证版本
通过NODE_OPTIONS环境变量增加Node.js进程的内存上限(默认1.5GB),避免内存溢出:
export NODE_OPTIONS="--max_old_space_size=4096" # 设置为4GB
可将此命令添加到~/.bashrc或/etc/profile中永久生效。
使用PM2进程管理器实现进程守护、负载均衡与日志管理:
sudo npm install pm2 -g
pm2 start app.js --name "my-app" --instances max # 根据CPU核心数启动多个实例
pm2 save # 保存进程列表
pm2 startup # 设置开机自启
使用async/await或Promise替代回调函数,避免阻塞事件循环。例如:
// 回调方式(易阻塞)
fs.readFile('file.txt', (err, data) => {
if (err) throw err;
console.log(data);
});
// async/await方式(非阻塞)
async function readFile() {
try {
const data = await fs.promises.readFile('file.txt', 'utf-8');
console.log(data);
} catch (err) {
console.error(err);
}
}
readFile();
处理大文件(如上传、下载)时使用流(Stream),减少内存占用:
const fs = require('fs');
const readStream = fs.createReadStream('large-file.zip');
const writeStream = fs.createWriteStream('output.zip');
readStream.pipe(writeStream); // 流式传输
id、username)创建索引,加速查询。mysql2或pg的连接池功能,避免频繁建立/断开数据库连接:const mysql = require('mysql2/promise');
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: 'password',
database: 'test',
waitForConnections: true,
connectionLimit: 10, // 连接池大小
queueLimit: 0
});
node-cache库缓存频繁访问的数据(如配置项、热点数据):const NodeCache = require('node-cache');
const cache = new NodeCache({ stdTTL: 60 }); // 缓存60秒
const data = cache.get('key');
if (!data) {
const newData = fetchDataFromDB();
cache.set('key', newData);
res.send(newData);
} else {
res.send(data);
}
使用Nginx作为反向代理,处理静态文件、负载均衡与SSL卸载:
server {
listen 80;
server_name example.com;
# 静态文件缓存(减少Node.js请求)
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
root /var/www/html;
expires 30d; # 缓存30天
access_log off;
}
# 动态请求转发至Node.js(负载均衡)
location / {
proxy_pass http://nodejs_upstream;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# 定义Node.js上游服务器(多实例负载均衡)
upstream nodejs_upstream {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
}
使用performance模块监控代码执行时间:
const { performance, PerformanceObserver } = require('perf_hooks');
const obs = new PerformanceObserver((items) => {
console.log(items.getEntries()[0].duration); // 输出执行时间
performance.clearMarks();
});
obs.observe({ entryTypes: ['measure'] });
performance.mark('start');
// 需要监控的代码
performance.mark('end');
performance.measure('My Operation', 'start', 'end');
pm2 monit查看CPU、内存使用情况,或使用pm2 plus(付费)进行实时监控。使用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');
使用heapdump模块生成堆快照,分析内存泄漏源:
npm install heapdump --save
在代码中添加堆快照生成逻辑:
const heapdump = require('heapdump');
// 在可疑位置生成堆快照(如内存增长时)
heapdump.writeSnapshot('/tmp/snapshot_' + Date.now() + '.heapsnapshot');
打开Chrome浏览器,访问chrome://inspect,点击“Open dedicated DevTools for Node”,选择“Memory” tab,加载堆快照,通过“Comparison”功能对比不同时间点的堆内存,找出持续增长的对象(如未释放的全局变量、事件监听器)。
let/const替代var,避免意外挂载到global对象。destroy或close方法中移除事件监听器:const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const emitter = new MyEmitter();
emitter.on('event', () => console.log('Event triggered'));
// 不再需要时移除
emitter.off('event');
通过以上策略,可全面提升CentOS上Node.js应用的性能、稳定性与可维护性。