优化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上的运行缓慢问题。需根据实际场景(如高并发、大文件处理、数据库密集型操作)选择针对性优化策略,并持续监控性能变化。