優化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上的運行緩慢問題。需根據實際場景(如高并發、大文件處理、數據庫密集型操作)選擇針對性優化策略,并持續監控性能變化。