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

だいたいこんな感じで出力される。

f:id:cyubachi:20131101182437p:plain

11/5追記 日付付きのjstatログでないと動かなかったので、日付が無い方(jstatオリジナル)で動くよう修正。