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タブから適当にロードできる。