node.jsでメモリ使用量を取得する方法あれこれ
はじめに
BounscaleというオートスケールするHeroku Addonを作っています。
Bounscaleでは実験的にnode.jsへの対応を実施しています。
オートスケールするにあたり、各種リソースの監視が必要なのですが、node.jsでどのようにメモリ使用量を取得するか調べたので下記しておきます。
バージョン
node.js v0.10.15
取得方法
調べた限りには下記3種類の方法を見つけました。
- osオブジェクトの情報を利用する方法
- processオブジェクトの情報を利用する方法
- usageライブラリを利用する方法
osオブジェクトの情報を利用する方法
osオブジェクトはnodeの標準APIで提供されています。
下記の感じで全メモリ容量と未使用メモリ容量を取得できます。
引き算すればメモリ使用量が算出できると思います。
> os.totalmem()
1043562496
> os.freemem()
71467008
ただし、これで取得できるのはシステム全体のメモリ情報です。
node.jsのプロセスが消費しているメモリの容量はこれではわかりません。
processオブジェクトの情報を利用する方法
processオブジェクトからもメモリ情報を取得できます。
> process.memoryUsage()
{ rss: 9019392,
heapTotal: 5115392,
heapUsed: 2658096 }
rssはアプリケーションのメモリ使用量で、heapTotal/heapUsedはV8エンジンのヒープメモリ使用量とのことです。
これはプロセス単位で取得できているようです。
usageライブラリを利用する方法
usageというシステム情報取得をするライブラリがnpmで公開されています。
Cで書かれているようで、直接システムの情報を取っていそうです。
まずnpmコマンドでインストールします。
npm install usage
実行します。
> var usage = require('usage')
undefined
> var memory = null;
undefined
> usage.lookup(process.pid, function(err, result){memory = result.memory})
undefined
> memory
13520896
heroku run nodeで値をみたところでは、process.memoryUsage()のrssとほぼ同じ値が返ってきているようです。
終わりに
標準APIに含まれていて、プロセス単位でメモリ消費量を取得できるprocess.memoryUsage()を使うのが手っ取り早いですね。