1. 程式人生 > >node之記憶體管理以及效能分析

node之記憶體管理以及效能分析

node是v8引擎實現的,所以是v8的記憶體管理。涉及到的主要方法有:

process.memoryUsage(),v8.getHeapSpaceStatistics(),v8.getHeapStatistics(),os.cpus(),os.totalmem();下面這個討論,在開始討論以前先說一下v8的記憶體管理機制:

由於歷史原因和回收演算法的限制,node在64位系統最大記憶體為1.4G左右,32位系統為0.7G左右,如果以1.5G記憶體為例,node做一次垃圾回收要50ms以上,做一次非增量式垃圾回收要1s以上,這是無法容忍的。v8裡面分有兩塊新生代堆(new_heap)和老生代堆(old_heap),較為固定的放在老生代堆,容易移除的放在新生代堆,並且能有新生代到老生代轉化,並且在新生代堆又分為form空間和to空間。用空間換取cpu執行時間(同時也導致了記憶體無法完全使用),這兩個堆使用不同的演算法進行管理。具體的演算法回收流程這裡不再介紹。

process.memoryUsage(),執行程式碼結果如下:

rss:Resident Set Size,是程序在主存中佔用的空間,這是系統給node分配記憶體的一個子集。它包括堆,程式碼段,棧。物件,字串存貯在堆裡,變數存貯在棧裡,js程式碼存貯在程式碼段空間。如果用buffer不斷分配記憶體rss會持續增加, 超過node記憶體限制,只是buffer記憶體分配機制造成的。

heapTotal,heapUsed表示v8記憶體使用情況,

external 表示繫結到由V8管理的JavaScript物件的C++物件的記憶體使用。buffer記憶體在rss以外分配。

可以看出預設情況下系統為node分配的記憶體是很小的才20M。但是隨著應用請求分配記憶體會不斷增加,直到達到記憶體限制閾值而報錯。

v8.getHeapSpaceStatistics()

這裡我們只用關注new_space,和old_space就行了。說明了當下隊記憶體的使用情況。

v8.getHeapStatistics()

這是堆統計資料,隊記憶體預設是9M,可使用的記憶體1.4G,堆記憶體大小限制1.4G,已經使用的堆4M,很小的。

os.cpus()

數組裡面對象的個數,代表伺服器的核心數,nice是linux特有的window總是0,

 IRQ:Interrupt ReQuest cpu中斷請求。

SYS:CPU花了多少比例的時間在核心空間執行。分配記憶體、IO操作、建立子程序……都是核心操作。這也表明,當IO操作頻繁時,System引數會很高。

 user:cpu在使用者程式碼上話費的時間。

Idel:CPU處於空閒狀態時間比例。在計算機中,讀寫磁碟的操作遠比CPU執行的速度要慢,CPU負載處理資料,而資料一般在磁碟上需要讀到記憶體中才能處理。當CPU發起讀寫操作後,需要等著磁碟驅動器將資料讀入記憶體,從而導致CPU 在等待的這一段時間內無事可做。CPU處於這種等待狀態的時間由idel引數來衡量。

 

一般對node進行效能和記憶體監控都是以這幾個函式為基礎的。所以深入瞭解node的記憶體原理以及這幾個函式是做好node效能監控的必要條件。