最近小弟要分析一些gc数据,同时要分析几台机器的gc日志,主要统计每天数据:minor gc次数,最大运行时间,最小运行时间,平均运行时间,minor gc引起的总的stop world时间,major gc次数,major gc引起的总的stop world时间。
原始数据:
2012-10-25T13:00:22.244+0800:234273.762: [GC 234273.762: [ParNew: 1418872K->53180K(1501888K), 0.0337000secs] 3512438K->2148338K(4057792K), 0.0340400 secs] [Times: user=0.14sys=0.00, real=0.03 secs]
2012-10-25T13:00:37.762+0800:234289.280: [GC 234289.280: [ParNew: 1418556K->44716K(1501888K), 0.0383930secs] 3513714K->2143690K(4057792K), 0.0387180 secs] [Times: user=0.17 sys=0.00,real=0.04 secs]
2012-10-25T13:00:37.804+0800:234289.322: [GC [1 CMS-initial-mark: 2098974K(2555904K)] 2154135K(4057792K),0.0379380 secs] [Times: user=0.04 sys=0.00, real=0.04 secs]
2012-10-25T13:00:37.843+0800:234289.360: [CMS-concurrent-mark-start]
2012-10-25T13:00:38.410+0800:234289.928: [CMS-concurrent-mark: 0.568/0.568 secs] [Times: user=1.39 sys=0.10,real=0.57 secs]
2012-10-25T13:00:38.410+0800:234289.928: [CMS-concurrent-preclean-start]
2012-10-25T13:00:38.431+0800:234289.949: [CMS-concurrent-preclean: 0.018/0.021 secs] [Times: user=0.02sys=0.00, real=0.02 secs]
2012-10-25T13:00:38.431+0800:234289.949: [CMS-concurrent-abortable-preclean-start]
CMS: abort precleandue to time 2012-10-25T13:00:43.774+0800: 234295.292:[CMS-concurrent-abortable-preclean: 5.312/5.343 secs] [Times: user=7.37sys=0.54, real=5.34 secs]
2012-10-25T13:00:43.776+0800:234295.294: [GC[YG occupancy: 579432 K (1501888 K)]234295.294: [Rescan(parallel) , 0.1664420 secs]234295.460: [weak refs processing, 0.0121300secs]234295.473: [class unloading, 0.0363220 secs]234295.509: [scrub symbol& string tables, 0.0235950 secs] [1 CMS-remark: 2098974K(2555904K)]2678406K(4057792K), 0.2485670 secs] [Times: user=0.78 sys=0.00, real=0.24 secs]
……………………
2012-10-25T13:00:53.494+0800:234305.012: [GC 234305.012: [ParNew: 1410092K->50641K(1501888K), 0.0385890secs] 1704007K->349502K(4057792K), 0.0389030 secs] [Times: user=0.14sys=0.00, real=0.04 secs]
考虑使用expect这个脚本工具自动分析gc数据,同时bash端使用多子进程模式Map加快速度。神器地址http://expect.sourceforge.net/
应用MapReduce模型,这里的Map就是采集子进程(负责单台机器的数据采集),代码:
#map task parallelexecuting ,statistics one host,using 'expect'
map(){
local TMP_FILE=$RESULT_FILE"_"$HOST"_"$1
local TMP_MAP_RESULT_FILE=$TMP_FILE"_mapresult"
echo "$TMP_MAP_RESULT_FILE"
{
#使用expect脚本自动分析数据,call脚本见后面分析
/usr/bin/expect -f ./call $USER $HOST $DATE > $TMP_FILE
echo $HOST"_"$DATE > $TMP_MAP_RESULT_FILE
grep -v "grep" $TMP_FILE| grep "Total=" >>$TMP_MAP_RESULT_FILE
grep -v "grep" $TMP_FILE| grep "Average=" >>$TMP_MAP_RESULT_FILE
grep -v "grep" $TMP_FILE| grep "Min=" >>$TMP_MAP_RESULT_FILE
grep -v "grep" $TMP_FILE| grep "Max=" >>$TMP_MAP_RESULT_FILE
grep -v "grep" $TMP_FILE| grep "MajorCount=" >>$TMP_MAP_RESULT_FILE
grep -v "grep" $TMP_FILE| grep "TotalInitMark=" >>$TMP_MAP_RESULT_FILE
grep -v "grep" $TMP_FILE| grep "TotalRemark=" >>$TMP_MAP_RESULT_FILE
}&
#子进程模拟Map任务
}
Reduce就是将上述子进程的采集数据做一个merge,因为最后只需要一个文件,所以reduce只有1个,主进程完成即可
#reduce task,justmerge map result file
reduce(){
#取Map过程产生的临时文件
for FILE in ${MAP_RESULT[@]}
do
echo "--------------------------"
#直接标准输出,也可输出到文件
cat $FILE
echo "--------------------------"
done
}
主进程控制流程,代码:
echo "start statjob"
………………
#Array store mapresult files' name
declare -a MAP_RESULT
echo "mapstart"
for HOST in${SERVER_ARRAY[@]}
do
MAP_RESULT[$COUNT]=`map $COUNT`
((COUNT=$COUNT+1))
done
#wait to map task end
#主进程在此等待Map任务全部完成
wait
echo "mapend"
echo "reducestart"
reduce
echo "reduceend"
echo "startclear"
clear
echo "endclear"
核心call脚本使用expect脚本,自动登录到目标主机上采集数据,将结果输出到本地文件,代码:
#!/usr/bin/expect
set USER [lindex$argv 0]
set HOST [lindex$argv 1]
set DATE [lindex$argv 2]
set LOG_PATH"/home/admin/logs/gc.log"
set timeout 30
spawn/usr/bin/ssh $USER@$HOST
expect ".*id_dsa':"
send "\r"
expect"password:"
#xxxxxxx是跳板机密码
send"xxxxxxxx\r"
sleep 1
send "grep'$DATE' $LOG_PATH /gc.log|grep 'ParNew' |awk '{print \$15}'|awk -F'=' '{print\$2}'|awk 'BEGIN{total=0}{total+=\$1}END{print\"Total=\"total}'\r"
sleep 1
send "grep'$DATE' $LOG_PATH /gc.log|grep 'ParNew' |awk '{print \$10}'|awk'{sum+=\$1} END {print \"Average=\"sum/NR}'\r"
sleep 1
send "grep'$DATE' $LOG_PATH /gc.log|grep 'ParNew' |awk '{print \$10}'|awk 'BEGIN {min =1999999} {if (\$1<min) min=\$1 fi} END {print\"Min=\"min}'\r"
sleep 1
send "grep'$DATE' $LOG_PATH /gc.log|grep 'ParNew' |awk '{print \$10}'|awk 'BEGIN{max = 0} {if (\$1>max) max=\$1 fi} END {print\"Max=\"max}'\r"
sleep 1
send "echo\"MajorCount=\"`grep '$DATE' $LOG_PATH |grep 'CMS-remark'|wc -l`\r"
sleep 1
send "grep'$DATE' $LOG_PATH |grep 'CMS-init' |awk -F'real=' '{print \$2}'|awk '{print\$1}'|awk 'BEGIN{total=0}{total+=\$1}END{print\"TotalInitMark=\"total}'\r"
sleep 1
send "grep'$DATE' $LOG_PATH |grep 'CMS-remark'|awk -F'real=' '{print \$2}'|awk'{print \$1}'|awk 'BEGIN{total=0}{total+=\$1}END{print\"TotalRemark=\"total}'\r"
send"exit\r"
expect eof
代码很简单,模拟登录,然后grep+awk分析gc.log,然后退出目标主机
在跳板机上执行:
. /statgcParallel.sh-u xiaodong.langxd -s slave1:slave2 -d 2012-11-07
输出:
start stat job
map start
map end
reduce start
--------------------------
slave1_2012-11-07
Total=30.57
Average=0.0340765
Min=0.0104980
Max=0.1478140
MajorCount=1
TotalInitMark=0.05
TotalRemark=0.25
--------------------------
--------------------------
slave2_2012-11-07
Total=165.37
Average=0.0268371
Min=0.0160940
Max=0.0812770
MajorCount=4
TotalInitMark=0.09
TotalRemark=1.08
--------------------------
reduce end
start clear
end clear
搏君一笑~~~
分享到:
相关推荐
但于此同时,在进行交易信息分析时,部分需要根据原始数据计算才能得到的指标无法直接获取,而且日志信息比较杂乱,不便汇总分析,因此需要使用bash脚本对日志进行交易情况分析。 内容包括(bash脚本及注释,日志...
昨天一个网友问如何能够将输入密码的工作在shell里面自动完成,研究了一下,发现这种交互式的工作,普通的shell实现不了,据说可以借助expect来搞定,所以初步学习了一下expect,成果和大家分享一下: 应用一: 实现...
linux bash shell脚本文件.sh,自动输入sudo的密码 在脚本中使用sudo命令,将密码保存在脚本中,不需要手动输入密码
Bash(Bourne Again Shell),几乎所有的 Linux 和绝大部分的 UNIX 都可以使用 Bash。作为系 统与用户之间的交互接口,shell 几乎是你在 UNIX 工作平台上最亲密的朋友,因此,学好 shell,是学习 Linux/UNIX 的的开始,并且...
Bash使用
linux-Utilitybashscripts使用单个命令执行可自动执行任务的实用bash脚本
maven-bash-completion, Maven Bash自动完成 Maven Bash完成默认情况下,Maven 不发布Bash自动完成脚本,只使用一个非常简单的指南插件。 这里脚本为你提供了更多帮助你日常 Maven 构建的脚本。演示 安装手动安装...
bash-door是个非常简单但有效,且很难察觉的后门。本文分析了一下。
学习git和gitbash使用的一些详细操作,学习git和gitbash使用的一些详细操作
bash shell自动生成Makefile
Gitxmind GIt bash 使用 xmindGitxmind GIt bash 使用 xmindGitxmind GIt bash 使用 xmindGitxmind GIt bash 使用 xmindGitxmind GIt bash 使用 xmindGitxmind GIt bash 使用 xmind
下载本附件,放到你的用户主目录,在你的.bash_profile或者.bashrc,或者.profile里加入: if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi 然后source一下或者重新登录,你的git就支持自动...
简单的端口扫描 Bash 脚本使用 Nmap 自动执行某些类型的端口扫描的 Bash 脚本。 它包括一些扫描配置文件,用于识别常见的开放端口和服务、Web 服务器、UDP 服务、高端口、实时主机等,使用 TCP/SYN/UDP 和其他...
linux bash 之awk,awk的详尽用法
鉴于目前绝大部分服务器因为没有注册的yum或者因不通外网等问题导致无法使用yum update -y bash 命令进行漏洞修复,如采用RPM包升级修复漏洞又存在各服务器系统有的是32位有的是64位或者bash的版本不一样导致需要...
bash官方手册/Bash Reference Manual
Bash脚本编写中遇到的问题 Bash脚本编写中遇到的问题
BASH官方文档,BASH官方文档,BASH官方文档
using expect in the bash, when spawning multiple session to many Linux machines, need to switch the host and send command, keep all the sessions online and can switch as you like
bash 入门经典 不可不看哦 bash 入门经典 不可不看哦 bash 入门经典 不可不看哦