如何使用Node.js取得Linux作業系統的記憶體資訊?

使用Node.js開發後端程式的時候,在某些情況下可能會需要查看運行環境還剩下多少的記憶體來決定是否繼續進行工作,那麼該如何使用Node.js來獲取運行環境的記憶體資訊呢?

os.totalmem和os.freemem

Node.js內建的「os」模組其實就有提供「totalmem」和「freemem」函數來分別抓取作業系統的記憶體總量和閒置的記憶體,用法如下:

然而在實際應用上,只知道記憶體總量和閒置的記憶體是沒什麼用處的。因為現在的作業系統都傾向利用更多沒有使用到的記憶體來做快取緩衝,來加速非主記憶體裝置的I/O速度,當作業系統需要分配超過閒置記憶體大小的記憶體給行程使用時,不足的部份就會藉由釋放被用來做快取緩衝記憶體區塊來補足。所以透過「os.freemem()」所得到的閒置記憶體總是比作業系統實際的「可用記憶體」還要來得少很多,而且也愈來愈沒有參考價值了。

Linux系統上,常會使用「free」或是「top」指令來查看作業系統記憶體資訊。例如:

free -b

node-meminfo

其中選項「-b」表示記憶體大小的單位為位元組(byte)。而且可以看到光是記憶體資訊就有分「total」、「used」、「free」、「shared」、「buff/cache」、「available」這幾個欄位,甚至還有「Mem(主記憶體RAM)」和「置換(Swap)」兩列,這比起Node.js內建提供的「totalmem」和「freemem」還要多了很多個項目能參考。

先來看主記憶體的部份,「total」的部份指得就是主記憶體或是的大小,其數值會和Node.js內建的「os」模組的「totalmem」相同。「used」的部份指得是已被使用的記憶體,包含共享記憶體,但不包含被用來做快取緩衝的部份。「free」是完全沒被使用到的閒置記憶體,其數值會和Node.js內建的「os」模組的「freemem」相同。「shared」是可供不同行程(Process)一起使用的共享記憶體。「buff/cache」是快取緩衝還有用來管理其他記憶體的Slab快取(Slab Allocator)所佔用的記憶體。「available」則才是作業系統目前真正的「可用記憶體」。

再來是置換空間(Swap)的部份,因為置換空間是把次級儲存器(Secondary Storage)或是外部儲存器(External Storage)作為記憶體使用,速度不快,通常會是在主記憶體不夠用的情況下才會去使用,但著實可以成為作業系統可用記憶體的一部份。因此在計算作業系統真正最高可以配置的可用記憶體大小的時候,會把主記憶體的「available」和置換空間的「free」相加,也就是說,如果行程需要配置的記憶體大小超過這個值的話,作業系統將會因為沒有足夠的記憶體能夠使用而導致當機。

回到Node.js的主題上,那麼要如何使用Node.js來得知這些詳細的記憶體資訊呢?Linux系統的話,可以透過讀取「/proc/meminfo」這個檔案來取得即時的記憶體資訊。順帶一提,「free」和「top」指令在程式實作上其實也是去讀取「/proc/meminfo」再將資訊編排出來。

使用「cat」指令來讀取「/proc/meminfo」檔案:

cat /proc/meminfo

node-meminfo

透過「/proc/meminfo」檔案可以得到非常詳細的記憶體資訊,只要在Node.js中使用檔案相關的模組去讀取「/proc/meminfo」的內容回來,再去解析(parse)有用的資訊即可。當然,也可以直接用底下將要介紹的模組。

node-meminfo

node-meminfo」是一個使用Node.js 8之後才支援的N-API所開發的模組,使用C語言來讀取Linux作業統中的「/proc/meminfo」所儲存的記憶體資訊。

GitHub:

https://github.com/magiclen/node-meminfo

npm:

https://www.npmjs.com/package/node-meminfo

安裝

直接使用npm指令進行安裝:

npm install --save node-meminfo

用法

初始化

使用「require」函數來引入「node-meminfo」模組。

取得「/proc/meminfo」所儲存的記憶體資訊

使用模組提供的「get」函數可以完整地取得「/proc/meminfo」所儲存的記憶體資訊,用法如下:

這裡要注意的是,模組取得的數值所用的單位是位元組(byte),而不是「/proc/meminfo」原先的KB。

另外,若您像筆者一樣比較習慣「free」指令所提供的資訊格式的話,也可以使用模組提供的「free」函數來取得記憶體資訊,用法如下:

關於作者

Magic Len

Magic Len

各位好,我是Magic Len,是這網站的管理員。我是台灣台中大肚山上人,畢業於台中高工資訊科和台灣科技大學資訊工程系,曾在桃機航警局服役。我熱愛自然也熱愛科學,喜歡和別人分享自己的知識與經驗。如果你有興趣認識我,可以加我的Facebook,並且請註明是從MagicLen來的。

相關文章