Erlang のプロセスメモリを追う

今作っている range search KVS が OOMKiller に kill されたのをきっかけに色々調べる。
結果として kill されたのはデバッグ用の dump 機能が悪さをしただけだったのだが、省メモリにこした事はないので少し深く突っ込んでみる。

前提

Erlang のメモリ関係の前提知識としてはこちらの翻訳が良くまとまっています。

調査

まず gen_server behaviour を実装した KVS のノードプロセスを supervisor の start_node で立ち上げる。
このときのプロセスサイズ は 2.7 KB 。(process_info でとれる)


次にそのノードに対して search_op を実行してみる。サイズ変わらず。
insert_op してみる。いきなりサイズが 11 KB になった。


insert_op の実装は handle_call で spawn して処理が終わったら reply しているだけ。
これは insert の処理でスタックが拡張されサイズが大きめのままになっていることが推測される。
そこで gen_server の hibernate 機能を使ったところ 8KB と少し小さくなった。
そもそも spawn したプロセスは reply した時点で不要なんだけど、これは親の heap に含まれるんだろうか。うーむ。


前提知識リンク先の表に従いプロセスのデータ構造のサイズを手で計算してみたが最大でも 2KB くらいなので計算が合わない。

erlang:memory/0 使ってみるか。続く。