Erlang fprof でサーバーアプリのプロファイルをとる方法
Profiling a Running Erlang Server « Alexey’s Random Notesが参考になる。
計測したい対象がサーバープロセス(gen_server など)の場合は以下のようにすればうまくいく。
- fprof:trace([start, {procs, [Pid]}]), で開始。開始時にプロセスを指定する。
- リクエストきっかけでサーバープロセスが増える場合は Pid から spawn されたものが計測対象になる事を利用する。自分は supervisior を procs に指定した。
- fprof:trace([stop]), で停止。自分は behaviour(application) の stop で停止した。
- fprof:profile(),
- fprof:analyse(),
- 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.