优化Node.js在CentOS上运行缓慢的问题,需从硬件、系统配置、代码、监控等多维度综合施策
确保服务器具备足够的CPU、内存、存储资源,这是性能基础:
taskset -c 0,1 node app.js
),避免多进程竞争;使用Nginx作为反向代理,承担静态文件缓存、SSL解密、负载均衡职责,减轻Node.js负担:
location ~* \.(jpg|css|js)$ { expires 30d; add_header Cache-Control "public"; }
,避免Node.js处理静态请求;upstream
模块实现多Node.js实例负载均衡(如round-robin
、least_conn
策略),提升并发处理能力。调整CentOS内核参数,优化网络连接和内存管理:
# 增加文件描述符限制(解决高并发连接问题)
echo "fs.file-max = 65536" >> /etc/sysctl.conf
# 启用TCP快速回收(减少TIME_WAIT状态连接)
echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf
# 增加最大同步队列长度(应对大量并发连接)
echo "net.core.somaxconn = 4096" >> /etc/sysctl.conf
# 应用配置
sudo sysctl -p
充分利用Node.js非阻塞I/O特性,避免阻塞事件循环:
async/await
或Promise
替代回调函数(如fs.readFile
改为fs.promises.readFile
);setImmediate()
或process.nextTick()
,让出事件循环。处理大文件(如上传、下载)时,使用流替代一次性读取,减少内存占用:
const fs = require('fs');
const readStream = fs.createReadStream('large-file.zip');
const writeStream = fs.createWriteStream('output.zip');
readStream.pipe(writeStream); // 流式传输
user_id
、created_at
)创建索引,加速查询;mysql2/promise
或pg-pool
等连接池库,避免频繁建立/断开数据库连接(如MySQL默认连接池大小设为10
)。node-cache
库缓存重复计算结果(如配置项、热点数据),减少CPU消耗;redis.get/set
)。--max-old-space-size
参数增大Node.js内存上限(如node --max-old-space-size=4096 app.js
,设置为4GB),避免内存溢出;--optimize-for-size
参数针对小内存设备优化,或通过--gc_interval
调整垃圾回收频率。使用最新稳定版Node.js(如v20+),新版本通常包含性能改进(如V8引擎优化、内存管理提升)。
node --inspect app.js
启动应用,连接Chrome浏览器chrome://inspect
,使用Profiler标签分析CPU热点函数;node --prof app.js
生成性能日志,再用node --prof-process
解析,定位耗时操作。pm2 start app.js --watch
启动应用,使用pm2 monit
实时监控CPU、内存、QPS,或pm2 logs
查看错误日志;clinic doctor -- node app.js
检测性能问题,生成可视化报告(如火焰图、CPU占用曲线),直观展示瓶颈;0x app.js
生成火焰图,分析函数调用栈和耗时分布,快速定位热点代码。通过以上步骤,可系统性解决Node.js在CentOS上的运行缓慢问题。需根据实际场景(如高并发、大文件处理、数据库密集型操作)选择针对性优化策略,并持续监控性能变化。