jstat -gc [pid] 1000 の結果をrrdtoolでグラフ化するスクリプト
パフォーマンスチューニング等で結構使うのでメモ
- 第一引数にjstatのログファイル
- 第二引数にグラフのタイトル
- 第三引数にファイルのプレフィックス
を渡して起動してやると
~/img/配下に${file_name}.pngの名前でグラフの画像を出してくれる。
#!/bin/sh if [ $# -ne 3 ] then echo "usage convert_jstat_graph jstat.log title file_name" exit 1 fi LOGFILE=$(cd $(dirname $1) && pwd)/`basename $1` title=$2 file_name=$3 cd ~/ rm -f ${file_name}.rrd TIME=`date +%s` DURATION=`wc -l ${LOGFILE} | awk '{print $1}'` ENDTIME=`expr $TIME + ${DURATION}` rrdtool create ${file_name}.rrd \ --step 1 \ --start $TIME \ DS:S0U:GAUGE:5:U:U \ DS:S1U:GAUGE:5:U:U \ DS:EU:GAUGE:5:U:U \ DS:OU:GAUGE:5:U:U \ RRA:AVERAGE:0.5:1:100000 tail -n +2 $LOGFILE | awk -v time=$TIME -v prefix=${file_name} '{print "rrdtool update " prefix ".rrd " time+NR ":" $3 ":" $4 ":" $6 ":" $8 }' | sh rrdtool graph ${file_name}.png \ --rigid \ --title "${title}" \ --vertical-label "usage" \ --lower-limit 0 \ --start $TIME \ --end $ENDTIME \ --height 200 \ DEF:OU=${file_name}.rrd:OU:AVERAGE CDEF:OUB=OU,1000,* AREA:OUB#e4203e:"Old" \ DEF:S0U=${file_name}.rrd:S0U:AVERAGE CDEF:S0UB=S0U,1000,* STACK:S0UB#8080c0:"Survivor 0" \ DEF:S1U=${file_name}.rrd:S1U:AVERAGE CDEF:S1UB=S1U,1000,* STACK:S1UB#8080c0:"Survivor 1" \ DEF:EU=${file_name}.rrd:EU:AVERAGE CDEF:EUB=EU,1000,* STACK:EUB#407be2:"Eden" rm -f ${file_name}.rrd
だいたいこんな感じで出力される。
11/5追記 日付付きのjstatログでないと動かなかったので、日付が無い方(jstatオリジナル)で動くよう修正。