Amazon Linux 2にBCCを入れて、Pythonのメソッド実行のトレースをしてみる

今回はBCC(BPF Compiler Collection)のツールを使って Pythonのメソッド実行のトレースをやってみます。

今回の記事の流れは以下のとおりです。

  • Amazon Linux 2を立ててBCCのインストールをする
  • 検証のためのコードを準備する
  • 実際にメソッドの呼び出しをトレースしてみる
  • まとめ

Amazon Linux 2を立ててBCCのインストールをする

Amazon Linux 2でEC2を立てます。 マネージメントコンソールから立てました。

次に、以下のコマンドでBCCを入れます。(※)

sudo amazon-linux-extras install -y BCC

簡単なインストール方法が見つかって最高って気持ちになった。感謝。

ここまでで、EC2のセットアップから、BCCのインストールまでが終わりました。

検証のためのコードを準備する

メソッドの呼び出しをトレースしたいので 以下のようなコードを用意しました。

#!/usr/bin/env python2

import time
i = 0

def log(i):
  print(i)
  time.sleep(1)

def loop(i):
  time.sleep(1)
  log(i)

while True:
  loop(i)
  i+=1

メソッドの呼び出しをトレースした際にツリー表示されるので いくつかメソッドに切り出してsleepするようにしています。

実際にメソッドの呼び出しをトレースしてみる

↑で作ったスクリプトをバックグラウンドで動かして メソッドの呼び出しをトレースしてみます。

今回は pythonflowというツールを使って トレースしてみます。

実際に動かした時のログが以下のものになります。

$ ./test.py > /dev/null &
[2] 18353
$ sudo /usr/share/bcc/tools/pythonflow 18353
Tracing method calls in python process 18353... Ctrl-C to quit.
CPU PID    TID    TIME(us) METHOD
0   18353  18353  0.271    <- ./test.py.log
0   18353  18353  0.272    <- ./test.py.loop
0   18353  18353  0.272    -> ./test.py.loop
0   18353  18353  1.273      -> ./test.py.log
0   18353  18353  2.274      <- ./test.py.log
0   18353  18353  2.274    <- ./test.py.loop
0   18353  18353  2.274    -> ./test.py.loop
0   18353  18353  3.275      -> ./test.py.log
0   18353  18353  4.276      <- ./test.py.log
0   18353  18353  4.277    <- ./test.py.loop
0   18353  18353  4.277    -> ./test.py.loop
0   18353  18353  5.277      -> ./test.py.log
0   18353  18353  6.279      <- ./test.py.log
0   18353  18353  6.279    <- ./test.py.loop
0   18353  18353  6.279    -> ./test.py.loop

なんとなく動いているのが分かります。

BCCには、いくつかのツールが入っており 今回触ったようなPythonなどの高級言語のためのツールとしては ucalls, uflow, ugc, uobjnew, ustatがあります。

今回触ったpythonflowというツールはuflowをベースにしたツールです。

上で紹介したツールの概要としては以下のとおりです。

  • ucalls: メソッドの呼び出しとシステムコールのサマリ可視化
  • uflow: メソッドフローグラフの可視化
  • ugc: GCイベントのトレース
  • ubjnew: オブジェクトの生成イベントのサマリ可視化
  • ustat: 色々なイベントの収集をして、秒間当たりのイベント数を表示してくれる

他にも色々ツールがあったり、ライブラリとして利用も出来るようです。

まとめ

今回は、Pythonの内製ツールで問題があったので、調査できるような手段を用意しておくために インストール方法の検証と動作確認を行ってみました。

今回は簡単なツールの利用に留まりましたが、障害調査などで非常に役立つと感じています。 次はJavaのトレースで試してみようかな?

今回の記事としては以上です。