1. 程式人生 > >node.js頻繁重啟問題排查

node.js頻繁重啟問題排查

node頻繁重啟問題排查

系統通過pm2部署node,通過pm2 list命令觀察狀態時發現重啟次數異常。

App name id mode pid status restart uptime cpu mem watching
xxx 0 cluster 29430 online 217 32s 0% 33.9 MB
xxx 1 cluster 29381 online 211 78s 0% 38.2 MB
xxx 2 cluster 29078 online 185 8m 0% 49.1 MB
xxx 3 cluster 29064 online 214 8m 0% 54.1 MB

執行時間很短,但restart一欄數值過高。一般restart觸發的條件主要有如下三條,當任意一條發生後,應用被重新拉起,那麼restart數值增加。

  1. 程式出現異常,未捕獲,導致執行緒退出。
  2. Promise狀態為rejected未捕獲異常,導致執行緒退出。
  3. 傳送退出訊號,退出執行緒。 呼叫process.ext()退出。

排查1,2兩項後均正常,通過命令pm2 logs觀察日誌資訊。登入到機器上輸入pm2 logs,執行兩分鐘左右出現如下所需要的資訊。

PM2 | App name:xxx id:1 disconnected
PM2 | App [xxx] with id [1] and pid [16508], exited with code [0] via signal [SIGINT]
PM2 | Starting execution sequence in -cluster mode- for app name:xxx id:1
PM2 | App name:xxx id:1 online

發現 exited with code [0],看到是正常退出。但程式碼本身沒有退出邏輯。於是判斷process.exit()被呼叫,觸發應用退出,隨後對exit事件監聽。

process.on(‘exit’, (code) => {
console.log(About to exit with code: ${code});
});

觀察呼叫棧,發現呼叫棧中執行的js指令碼有問題。原來代理裡有eval執行指令碼,而腳本里還包含了process.exit()方法,導致應用退出。

總結

退出問題排查,要清楚導致退出可能發生的原因,再嘗試捕獲相關引數,如退出碼,定位並發現問題。