系统级配置优化
ulimit -n 65535命令,永久生效则编辑/etc/security/limits.conf,添加* soft nofile 65535和* hard nofile 65535。/etc/sysctl.conf,添加/修改以下参数以提升TCP连接性能:net.core.somaxconn = 65535(监听队列大小)、net.ipv4.tcp_max_syn_backlog = 65535(SYN队列大小)、net.ipv4.tcp_tw_reuse = 1(TCP连接复用)、net.ipv4.tcp_fin_timeout = 30(连接关闭超时)。执行sysctl -p使配置生效。Node.js运行时优化
cluster模块创建多个工作进程,充分利用多核CPU。主进程通过cluster.fork() fork子进程,子进程共享端口处理请求。示例代码:const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
for (let i = 0; i < numCPUs; i++) cluster.fork();
} else {
require('./server').listen(3000); // 工作进程启动服务器
}
8核服务器上,集群模式可使QPS从单进程的8000提升至42000(需注意会话一致性,用Redis存储session)。--max-old-space-size参数增大Node.js老生代内存上限,避免内存溢出。例如:node --max-old-space-size=4096 app.js(设置为4GB)。pm2 start app.js -i max(根据CPU核心数自动创建进程)。应用层代码优化
async/await或Promise替代回调函数,避免阻塞事件循环。例如,用fs.promises.readFile()替代fs.readFileSync()处理文件读取。Stream),减少内存占用。示例:const fs = require('fs');
const readStream = fs.createReadStream('largefile.txt');
const writeStream = fs.createWriteStream('output.txt');
readStream.pipe(writeStream); // 流式传输
node-cache缓存频繁访问的数据(如数据库查询结果、静态资源),减少重复计算和网络请求。例如,Redis缓存商品详情,设置随机过期时间避免雪崩:const redis = require('redis');
const client = redis.createClient();
async function getProduct(id) {
const cacheKey = `product:${id}`;
const cached = await client.get(cacheKey);
if (cached) return JSON.parse(cached);
const data = await db.query('SELECT * FROM products WHERE id = ?', [id]);
await client.setex(cacheKey, 3600 + Math.random() * 300, JSON.stringify(data)); // 1小时内随机过期
return data;
}
pg-pool for PostgreSQL)复用数据库连接,避免频繁建立/断开连接;为常用查询字段创建索引,优化SQL语句(如避免SELECT *)。反向代理与负载均衡
server {
listen 80;
server_name example.com;
location /static/ {
root /var/www/static; // 静态文件目录
expires 30d; // 缓存30天
}
location / {
proxy_pass http://node_backend; // 转发到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;
}
}
upstream node_backend {
least_conn; // 最少连接算法
server 127.0.0.1:3000;
server 127.0.0.1:3001;
}
least_conn(最少连接)或round-robin(轮询)算法分发请求,避免单个Node.js进程过载。加权最少连接算法可优化不同性能服务器的负载分配。网络协议与传输优化
http2模块创建服务器:const http2 = require('http2');
const fs = require('fs');
const server = http2.createSecureServer({
key: fs.readFileSync('server.key'),
cert: fs.readFileSync('server.crt')
});
server.on('stream', (stream, headers) => {
stream.respond({ ':status': 200, 'content-type': 'text/html' });
stream.end('<h1>Hello HTTP/2</h1>');
});
server.listen(443);
net.ipv4.tcp_fastopen = 3参数启用TFO,减少TCP握手延迟(需Linux内核≥3.7)。监控与调优
perf_hooks模块或Chrome DevTools的Memory面板分析内存泄漏(如闭包导致的内存未释放);使用artillery进行负载测试,模拟高并发场景,获取P95延迟、吞吐量等指标。