Amazon Linux 2にBCCを入れて、Pythonのメソッド実行のトレースをしてみる
今回はBCC(BPF Compiler Collection)のツールを使って Pythonのメソッド実行のトレースをやってみます。
今回の記事の流れは以下のとおりです。
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のトレースで試してみようかな?
今回の記事としては以上です。