注:僅僅是一篇紀實性文章!
概述:不知道因為什麼原因,在某個專案新申請的兩臺伺服器上將node版本從6.10.0升級到了6.10.1,發現在這兩臺機器上一個node程式佔用記憶體一直再漲,啟動10h左右就會飆升到800M。
伺服器系統版本:CentOS release 6.9 (Final)
nodejs版本:6.10.1
檢視node程式
- 使用top命令檢視伺服器記憶體使用情況
- 使用pm2 monit監控node程式
排查記憶體洩漏
排查記憶體問題首先需要藉助工具來獲取不同時間段的快照檔案。
npm i heapdump
heapdump.writeSnapshot('/var/local/' + Date.now() + '.heapsnapshot')
複製程式碼
該工具使用簡潔,不僅提供了生成快照的方法,還可以在命令列中執行
kill -USR2 <pid>
複製程式碼
來傳送訊號生成堆轉儲檔案。不過在伺服器上安裝的時候總是會報build出錯
提供了leak
和stats
事件,在事件回撥引數中會有記憶體洩漏的資訊,使用memwatch的事件,再配合heapdump,在觸發leak事件時,生成快照檔案十分好用。不過同樣,安裝使用時還是會報錯。
npm install profiler
node --prof server.js
複製程式碼
通過以上命令生成test-v8.log 然後
npm install tick
node-tick-processor test-v8.log
複製程式碼
使用時有報錯
npm install v8-profiler
var profiler = require('v8-profiler')
var snapshot1 = profiler.takeSnapshot()
snapshot1.export(function(error, result) {
fs.writeFileSync('snapshot1.json', result);
snapshot1.delete();
});
複製程式碼
分析快照檔案
通過v8-profiler拿到兩、三份快照檔案後,配合chrome的devtool即可進行分析。 1.
如上例(該案例程式碼摘自他處),點開chrome的memory皮膚,對不同檔案進行比較,可以看到哪些建構函式有明顯增加。
想辦法從伺服器拿到檔案後,經過分析看不到業務程式碼的建構函式分配物件大小有明顯增加,系統函式和陣列有明顯增加,於是猜測該版本的node是否有可疑的記憶體洩漏。issue
最終將nodejs升級到8解決該問題
相關ref: