Node.js

Node.jsアプリケーションのヒープをdumpしたい

More than 3 years have passed since last update.

Node.jsで書かれたイベントドリブンなデーモンはプロセスが死なないため結構リークする。HTTPサーバであれば、クラスタリングしておいて適当に殺せば他のワーカが働いてくれるので問題ないが、持続的接続を行うデーモンの場合は非常に殺しづらい。こういうリークしてるアプリケーションをデバッグしたい場合、デバッガをアタッチすれば良いことが多いのだが、本番環境でしかリークしない時本番で動いていアプリケーションのメモリの内容を直接見られると嬉しい。

node-heapdumpでヒープダンプをとる

node-heapdumpを使うと簡単にV8のヒープをそのままダンプできる。

とりあえずrequireする。

app.coffee
heapdump = require 'heapdump'
...

USR2シグナルを送ってスナップショットをとる

UNIX環境であればてきとうにUSR2シグナルを送るだけでスナップショットをとれる。

kill -USR2 $pid

メソッドを呼び出してスナップショットをとる

メソッドを呼び出して特定場所のスナップショットをとることもできる。Linuxであればforkしてからスナップショットをとってくれるので、ノンブロッキングに実行できる。

heapdump.writeSnapshot "/tmp/heapdump-#{Date.now()}.heapsnapshot"

スナップショットを読む

保存したスナップショットを読みにはGoogle Chromeの開発者ツールを使えば良い。

Developer ToolのProfileタブから適当にロードできる。

DeveloperTool.png