Java

GC log 에서 Heap Memory 사용률 추출하기

제끼나·2014년 9월 17일·조회 6,273

내용은 다시 추가할께요.

#! /bin/sh
## SIMPLE, EXTRACT HEAP MEMORY USE RATIO FROM GC LOGS.  by jeikina.



### ENV. ###
FILENAME=$1
WORKDIR=$PWD/gcwork_tmp
DATE_POSTFIX=`echo $FILENAME | cut -d"." -f3 | cut -c1-8`

YGEN_FILE="younggen_${DATE_POSTFIX}.txt"
OGEN_FILE="paroldgen_${DATE_POSTFIX}.txt"
HEAPTOT_FILE="heap_total_${DATE_POSTFIX}.txt"
############


### make working dir. ###
if [ -d $WORKDIR ]
then
 echo " @ Work Directory is $WORKDIR ! Check the output files... "
else
 echo " !! There is no gcwork_tmp directory !! making... "
 mkdir -p $WORKDIR/mov_tmp
 ls -altrd $WORKDIR
fi
######################


## Young Gen Space Use Ratio ##
_GET_YGS()
{
if [ -f $WORKDIR/$YGEN_FILE ]
then
 echo " @ ($YGEN_FILE) filename is already exist! Old file will be Move to (mov_tmp) Directory..."
 mv $WORKDIR/$YGEN_FILE $WORKDIR/mov_tmp
 grep -v "Full GC" $FILENAME | grep ^[0-9] | awk '{print $4}' | cut -d"(" -f2 | sed 's/K)]//g'> $WORKDIR/$YGEN_FILE
else
 grep -v "Full GC" $FILENAME | grep ^[0-9] | awk '{print $4}' | cut -d"(" -f2 | sed 's/K)]//g'> $WORKDIR/$YGEN_FILE
fi
}

## Old Gen Space Use Ratio ##
_GET_OGS()
{
if [ -f $WORKDIR/$OGEN_FILE ]
then
 echo " @ ($OGEN_FILE) filename is already exist! Old file will be Move to (mov_tmp) Directory..."
 mv $WORKDIR/$OGEN_FILE $WORKDIR/mov_tmp
 grep ParOldGen $FILENAME | grep ^[0-9] | awk '{print $7}' | cut -d"(" -f2 | sed 's/K)]//g' > $WORKDIR/$OGEN_FILE
else
 grep ParOldGen $FILENAME | grep ^[0-9] | awk '{print $7}' | cut -d"(" -f2 | sed 's/K)]//g' > $WORKDIR/$OGEN_FILE
fi
}

## Total Heap Space Use Ratio ##
_GET_HEAPTOT()
{
if [ -f $WORKDIR/$HEAPTOT_FILE ]
then
 echo " @ ($HEAPTOT_FILE) filename is already exist! Old file will be Move to (mov_tmp) Directory..."
 mv $WORKDIR/$HEAPTOT_FILE $WORKDIR/mov_tmp
 grep -v "Full GC" $FILENAME | grep ^[0-9] | awk '{print $5}'| cut -d"(" -f2 | sed 's/K),//g' > $WORKDIR/$HEAPTOT_FILE
 grep -i "full gc" $FILENAME | awk '{print $8}' | cut -d"(" -f2 | sed 's/K)*//g' >> $WORKDIR/$HEAPTOT_FILE
else
 grep -v "Full GC" $FILENAME | grep ^[0-9] | awk '{print $5}'| cut -d"(" -f2 | sed 's/K),//g' > $WORKDIR/$HEAPTOT_FILE
 grep -i "full gc" $FILENAME | awk '{print $8}' | cut -d"(" -f2 | sed 's/K)*//g' >> $WORKDIR/$HEAPTOT_FILE
fi
}


_OUTPUT_SORT()
{
 YGEN_MIN_USE=`sort -n $WORKDIR/$YGEN_FILE | head -1`
 YGEN_MAX_USE=`sort -n $WORKDIR/$YGEN_FILE | tail -1`
 OGEN_MIN_USE=`sort -n $WORKDIR/$OGEN_FILE | head -1`
 OGEN_MAX_USE=`sort -n $WORKDIR/$OGEN_FILE | tail -1`
 HEAPTOT_MIN_USE=`sort -n $WORKDIR/$HEAPTOT_FILE | head -1`
 HEAPTOT_MAX_USE=`sort -n $WORKDIR/$HEAPTOT_FILE | tail -1`

 echo
 echo "----------------------------------------------------------------------"
 echo "  @ Young Generation Use Ratio (min/max) : $YGEN_MIN_USE / $YGEN_MAX_USE KB"
 echo "  @ Old Generation Use Ratio (min/max) : $OGEN_MIN_USE / $OGEN_MAX_USE KB"
 echo "  @ Total Heap Use Ratio (min/max) : $HEAPTOT_MIN_USE / $HEAPTOT_MAX_USE KB"
 echo "----------------------------------------------------------------------"

}


_GET_FULLGC_TIME()
{
 FGC_TIME_MIN=`grep -i "full gc" $FILENAME | awk '{print $(11)}' | sort -n | head -1`
 FGC_TIME_MAX=`grep -i "full gc" $FILENAME | awk '{print $(11)}' | sort -n | tail -1`

 echo "  @ Full GC Duration Time : ${FGC_TIME_MIN} ~ ${FGC_TIME_MAX} secs"
 echo
}


## RUN ##################################################################
_GET_YGS
_GET_OGS
_GET_HEAPTOT

_OUTPUT_SORT
_GET_FULLGC_TIME
#########################################################################

댓글 2

로그인 후 댓글을 남길 수 있습니다.

  • nnastyboy· 2014년 9월 17일
    유용하게 사용될 수 있을 것 같네요. 그런데 이 소스는 PrintGCTIMEStamps 기준인 것 같아서 PrintGCDateStamps 일 때도 사용하게 제가 약간 수정해봤습니다. [참고] 1. PrintGCTIMEStamps 일 때 749.038: [GC [PSYoungGen: 344912K->2594K(345984K)] 909548K->568308K(1167232K), 0.0146710 secs] [Times: user=0.10 sys=0.00, real=0.02 secs] 2. PrintGCDateStamps 일 때 2014-09-17T14:02:45.405+0900: 7.848: [GC [PSYoungGen: 262656K->30183K(306176K)] 262656K->30183K(1005568K), 0.0596940 secs] [Times: user=0.05 sys=0.01, real=0.06 secs] [수정] 1. ENV. 영역에 추가 tail -10 ${FILENAME} > ${PWD}/gcwork_tmp/${FILENAME}_TEST egrep "^[1-2][0-9]{3}-[0-1][0-9]-[0-3][0-9]" ${PWD}/gcwork_tmp/${FILENAME}_TEST > /dev/null if [ $? -eq 0 ]; then GC_TIME_TYPE=DATE else GC_TIME_TYPE=TIME fi 2. _GET_YGS() 수정 ## Young Gen Space Use Ratio ## _GET_YGS() { if [ -f ${WORKDIR}/${YGEN_FILE} ] then echo " @ (${YGEN_FILE}) filename is already exist! Old file will be Move to (mov_tmp) Directory..." mv ${WORKDIR}/${YGEN_FILE} ${WORKDIR}/mov_tmp fi if [ ${GC_TIME_TYPE} == "TIME" ]; then grep -v "Full GC" ${FILENAME} | grep ^[0-9] | awk '{print $4}' | cut -d"(" -f2 | sed 's/K)]//g'> ${WORKDIR}/${YGEN_FILE} elif [ ${GC_TIME_TYPE} == "DATE" ]; then grep -v "Full GC" ${FILENAME} | grep ^[0-9] | awk '{print $5}' | cut -d"(" -f2 | sed 's/K)]//g'> ${WORKDIR}/${YGEN_FILE} fi } 다른 함수도 같은 방식으로 수정하면 될 것 같구요. 혹시 더 좋은 방법이 있으면 알려주세요.
  • stdio.hstdio.h· 2014년 9월 18일
    [code]tail -10 ${FILENAME} > ${PWD}/gcwork_tmp/${FILENAME}_TEST egrep "^[1-2][0-9]{3}-[0-1][0-9]-[0-3][0-9]" ${PWD}/gcwork_tmp/${FILENAME}_TEST > /dev/null if [ $? -eq 0 ]; then cat ${FILENAME} | cut -d":" -f4- > ${WORKDIR}/${FILENAME} perl -pi -e 's/^ //g' ${WORKDIR}/${FILENAME} else cp ${FILENAME} ${WORKDIR}/${FILENAME} fi FILENAME=${WORKDIR}/${FILENAME} [/code] [code]## Young Gen Space Use Ratio ## _GET_YGS() { if [ -f ${WORKDIR}/${YGEN_FILE} ] then echo " @ (${YGEN_FILE}) filename is already exist! Old file will be Move to (mov_tmp) Directory..." mv ${WORKDIR}/${YGEN_FILE} ${WORKDIR}/mov_tmp fi grep -v "Full GC" ${FILENAME} | grep ^[0-9] | awk '{print $4}' | cut -d"(" -f2 | sed 's/K)]//g'> ${WORKDIR}/${YGEN_FILE} }[/code]