Erlang fprof でサーバーアプリのプロファイルをとる方法

Profiling a Running Erlang Server « Alexey’s Random Notesが参考になる。
計測したい対象がサーバープロセス(gen_server など)の場合は以下のようにすればうまくいく。

  1. fprof:trace([start, {procs, [Pid]}]), で開始。開始時にプロセスを指定する。
    • リクエストきっかけでサーバープロセスが増える場合は Pid から spawn されたものが計測対象になる事を利用する。自分は supervisior を procs に指定した。
  2. fprof:trace([stop]), で停止。自分は behaviour(application) の stop で停止した。
  3. fprof:profile(),
  4. fprof:analyse(),
  5. fprof:stop(),

プロファイラを気軽に On/Off したい場合はマクロで隠蔽しておくのが良いのかな?

-define(PROFILER_ON, true).

-ifdef (PROFILER_ON).
-define(PROFILER_STOP(), fprof:trace([stop]), fprof:profile(), fprof:analyse(), fprof:stop()).
-define(PROFILER_START(X), fprof:trace([start, {procs, [X]}])).
-else.
-define(PROFILER_STOP(), []).
-define(PROFILER_START(X), []).
-endif.