prociostat.pl と visualize_prociostat.R で Linux のプロセスのボトルネックを分析する

今日もモツ鍋を堪能されていた模様の @ さんが Linux のプロセスのアクティビティを追跡してグラフ化するツールPerl + R で作られたということで早速使ってみました。
プロセスがユーザーモードでCPUを使えているのか、I/O待ちになっているのかといった傾向を分析することができます。Oracle Database はCPUを使えているのか、どんな理由で待機している(CPUを使えていない)か見ることができるよう実装されていますが、そんなものはないプログラムでも /proc ファイルシステムを参照してプログラムの外側からボトルネック分析が可能になります。素晴らしい!
こんな感じのグラフができます。

ツール

prociostat.pl
  • プロセスのCPU使用率、I/Oバイト数、I/O待機時間*1を秒間隔でCSVに記録する Perl スクリプト*2
  • 情報ソースは /proc//stat、/proc//io など
  • 他のユーザーで実行しているプロセスの情報を取得する場合は root で実行する必要がある*3
  • prociostat.pl を実行したカレントディレクトリにCSV(process..txt)が出力される
  • 使用例)
$ perl prociostat.pl -C -p 13674 # PID:13674 の情報を取得
# perl prociostat.pl -C # 全てのプロセスの情報を取得
visualize_prociostat.R
  • CSV をグラフ化(png)する R スクリプト
  • R がインストールされている必要があり、yum でインストールした
# yum install R
  • 使用例)
$ Rscript visualize_prociostat.R process.13674.txt

使用例

$ grep -R foo . > /dev/null 2>&1 & 
[1] 14520
  • prociostat.pl でプロセスの性能情報をCSVに記録する
$ perl prociostat.pl -C -p 14520
pid 14520 uid   501 user  20.16 sys   8.16 r  11112370176 w            0 cmd grep-Rfoo.
^CBye! ←Ctrl+Cで停止
$ ls -1
process.14520.txt ★出力された CSV ファイル
prociostat.pl
visualize_prociostat.R
$ head process.14520.txt 
↓CSVの中身はこんな感じ
time,delta_utime,delta_stime,delta_delayacct_blkio_ticks,delta_read_bytes,delta_write_bytes
1418136011,4,4,9,23072768,0
1418136012,1,3,3,1216512,0
1418136013,1,2,1,315392,0
1418136014,2,4,1,237568,0
1418136015,6,5,13,22831104,0
1418136016,1,6,2,552960,0
1418136017,2,4,3,2043904,0
1418136018,0,2,2,573440,0
1418136019,1,2,1,1232896,0
  • visualize_prociostat.R でグラフ化(png)する
$ export LANG=C
$ Rscript visualize_prociostat.R process.14520.txt
$ ls -1
process.14520.txt
process.14520.txt.png ★生成されたグラフ(png)
prociostat.pl
visualize_prociostat.R
  • process.14520.txt.png を開いてみる

*1:I/O のブロッキングによりプロセスがCPUをできなかった tick 数

*2:CSVに出力されるので、EXCELなどでグラフ化することもできます

*3:/proc//* を参照しているのでアクセス権がないと情報取得できない