プロセスがユーザーモードで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 # 全てのプロセスの情報を取得
使用例
- モニタリング対象プロセス(今回はgrep)を実行する
$ 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 を開いてみる