node.js頻繁重啟問題排查
阿新 • • 發佈:2019-01-10
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數值增加。
- 程式出現異常,未捕獲,導致執行緒退出。
- Promise狀態為rejected未捕獲異常,導致執行緒退出。
- 傳送退出訊號,退出執行緒。 呼叫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()方法,導致應用退出。
總結
退出問題排查,要清楚導致退出可能發生的原因,再嘗試捕獲相關引數,如退出碼,定位並發現問題。