記錄node記憶體瓶頸分析

椰了個蒂發表於2018-03-23

注:僅僅是一篇紀實性文章!

概述:不知道因為什麼原因,在某個專案新申請的兩臺伺服器上將node版本從6.10.0升級到了6.10.1,發現在這兩臺機器上一個node程式佔用記憶體一直再漲,啟動10h左右就會飆升到800M。

伺服器系統版本:CentOS release 6.9 (Final) nodejs版本:6.10.1

檢視node程式

  1. 使用top命令檢視伺服器記憶體使用情況
  2. 使用pm2 monit監控node程式

排查記憶體洩漏

排查記憶體問題首先需要藉助工具來獲取不同時間段的快照檔案。

  1. node-heapdump
npm i heapdump
heapdump.writeSnapshot('/var/local/' + Date.now() + '.heapsnapshot')
複製程式碼

該工具使用簡潔,不僅提供了生成快照的方法,還可以在命令列中執行

kill -USR2 <pid>
複製程式碼

來傳送訊號生成堆轉儲檔案。不過在伺服器上安裝的時候總是會報build出錯

  1. node-memwatch

提供了leakstats事件,在事件回撥引數中會有記憶體洩漏的資訊,使用memwatch的事件,再配合heapdump,在觸發leak事件時,生成快照檔案十分好用。不過同樣,安裝使用時還是會報錯。

  1. node-profiler
npm install profiler
node --prof server.js
複製程式碼

通過以上命令生成test-v8.log 然後

npm install tick
node-tick-processor test-v8.log
複製程式碼

使用時有報錯

  1. v8-profiler
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.

記錄node記憶體瓶頸分析

如上例(該案例程式碼摘自他處),點開chrome的memory皮膚,對不同檔案進行比較,可以看到哪些建構函式有明顯增加。

想辦法從伺服器拿到檔案後,經過分析看不到業務程式碼的建構函式分配物件大小有明顯增加,系統函式和陣列有明顯增加,於是猜測該版本的node是否有可疑的記憶體洩漏。issue

最終將nodejs升級到8解決該問題

相關ref:

easy-monit

node-inspector

alinode

相關文章