oprofileを使ってみる

opcontrolでサンプリングする

マルチスレッドプログラムをしているとどのコアで何が動いているのか分からなくてトラブルシュートが大変なのでプロファイラを使ってみた。

opcontrol --no-vmlinux --separate=cpu,thread

--no-vmlinuxオプションでkernel部分のプロファイラを取得しないようにして、--separateで取得するサンプルをオプションにしたがって分けます。

opcontrol --start-daemon
opcontrol --start

--start-daemonでoprofileのデーモンを起動して、--startで記録を開始します。(--start-daemonはいらないかも?)--start実行後のプロファイラが記録されます。
記録終了

opcontrol --stop
opcontrol --save=samplefilename

--stopでプロファイルのサンプリングを終了します。この時点で/var/lib/oprofile/samples/currentが今回取得したサンプルになります。このままだと次回実行時に上書きされてしまうので--saveで名前をつけて保存することができます。

opreportでサンプル結果を調べる

opreport -l 実行ファイル名

オプションに実行ファイル名を指定するとその実行ファイルの内容のみを抽出できる。ただしopcontrolのseparateオプションでcpuとthreadをしていてるのでこれだけでは見れない(ハズ)。

opreport -l -m cpu,tid 実行ファイル名

これでseparateオプションを指定しなかったときと同じ結果が得られる(ハズ)。

opreport -l -m cpu 実行ファイル名

これで実行ファイル名のプロセスが起動したスレッドが分かります。

opreport -l -m tid 実行ファイル名

プロセスが使用したCPUが分かります。

opreport -l tid:x 実行ファイル名

こうするとtidがxのスレッドが使用したCPU毎にシンボルとその頻度が表示されます。こんな感じに使っていくみたいです。

opreport session:samplefilename

--saveでセーブしたプロファイルを使う場合は"session:ファイル名"で指定できます。
この辺りの情報は記憶の限りで書いてるので間違ってる可能性があるので悪しからず。まだちょこっとしか使ってないので便利な使い方とか分かればそのうち。