`
iwinit
  • 浏览: 454781 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Bash style的MapReduce之使用expect自动分析gc日志

阅读更多

最近小弟要分析一些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
 

 

 

搏君一笑~~~

分享到:
评论
2 楼 iwinit 2013-01-30  
oldrat 写道
使用expect来输出密码来登陆,功能不错。

暴露了密码明文,这样会有味道不对。

这样的操作我是先打好SSH通道,这样可以免密码操作,这样脚本简单,也不会有密码明文。

是的,如果只有几台机器,打通还是很方便的哈:)。机器多了,expect更方便些。密码确实是个问题,不过只是开发用用哈
1 楼 oldrat 2013-01-30  
使用expect来输出密码来登陆,功能不错。

暴露了密码明文,这样会有味道不对。

这样的操作我是先打好SSH通道,这样可以免密码操作,这样脚本简单,也不会有密码明文。

相关推荐

    Linux使用bash脚本进行日志分析

    但于此同时,在进行交易信息分析时,部分需要根据原始数据计算才能得到的指标无法直接获取,而且日志信息比较杂乱,不便汇总分析,因此需要使用bash脚本对日志进行交易情况分析。 内容包括(bash脚本及注释,日志...

    linux编写bash shell脚本文件.sh 自动输入密码.在脚本中使用sudo命令,将密码保存在脚本中,不需要手动输入密码

    总之,在Linux Bash Shell脚本中使用`sudo`命令时,可以通过`expect`工具或修改`sudoers`文件来自动化密码输入。然而,这种方式应当谨慎使用,因为可能会降低系统的安全性。在实际应用中,应根据具体需求和安全策略...

    用expect 实现切换用户时自动输入密码.txt

    ### 使用Expect实现自动切换用户及执行命令 #### 一、Expect简介 `Expect`是一种用于自动化交互式命令的工具,它能模拟用户与基于文本的交互式程序进行对话。通过编写脚本来控制这些对话,我们可以实现一系列自动...

    linux编写脚本使用expect正则表达式 教程

    另外,`lj`编写的`expert脚本.sh`是一个实际的示例,通过阅读和分析这个脚本,可以更直观地理解`expect`的工作原理和应用。 总之,`expect`是Linux自动化中的重要工具,它使脚本能够与用户界面进行交互,极大地扩展...

    GChistoGC日志分析工具

    总结来说,GChisto是一款强大的GC日志分析工具,它通过解析和可视化JVM的GC日志,帮助开发者和运维人员找出内存管理的问题,特别是Old Generation区域的问题,从而提升Java应用的性能和稳定性。正确使用GChisto,并...

    14.Shell脚本编程之expect.md

    通过使用 Expect,可以将原本需要手动进行的操作,例如 SSH 登录、FTP 登录等,编写成脚本自动执行。这在需要对多台服务器执行相同操作的场景下尤其有用,能够显著提高系统管理员的工作效率。 ### 2. 安装 Expect ...

    multiple expect spawn session switching in Bash environment and example

    在Linux自动化运维中,`expect`脚本是一个强大的工具,它可以自动交互地处理命令行程序,尤其是涉及到需要用户输入的情况,如SSH登录、输入密码等。`expect`结合`bash`环境,可以实现多会话管理,使得在多个远程主机...

    linux-Utilitybashscripts使用单个命令执行可自动执行任务的实用bash脚本

    1. **系统维护**:如磁盘清理、日志分析、系统监控等。 2. **文件操作**:如文件备份、文件查找、批量重命名等。 3. **网络管理**:如DNS查询、网络速度测试、端口扫描等。 4. **进程控制**:启动、停止、监控进程或...

    使用命令行编译打包运行自己的MapReduce程序 Hadoop2.6.0

    ### 使用命令行编译打包运行自己的MapReduce程序 Hadoop2.6.0 #### Hadoop 2.x 版本变化及依赖分析 在Hadoop 2.x版本中,相较于早期版本,其架构和依赖库有了明显的变化。在早期版本如1.x中,所有的依赖都集中在`...

    Bash使用 文档.doc

    Bash 使用文档 bash 是一种广泛使用的 shellcript 语言,主要应用于 Linux 操作系统中。下面是 bash 的一些重要知识点: 一、什么是 shell shell 是 Linux 系统中,用户和内核之间的交互程序。它翻译用户输入的...

    bash.acp&bash.stx

    使用像EditPlus这样的编辑器,结合定制的Bash语法高亮和自动补全功能,可以极大地提升Bash脚本开发的生产力。 安装和使用这些配置文件非常简单。只需将`bash.acp`和`bash.stx`文件复制到EditPlus的安装目录下的...

    bash-door分析

    ### bash-door后门分析 #### 一、简介 在网络安全领域,后门是一种常见的攻击手段,它能够让攻击者绕过正常的认证过程,从而获得对系统的非法访问权限。bash-door正是一种设计精巧、隐蔽性高的后门工具,通过修改...

    高级Bash脚本编程指南.pdf.chm and shell脚本编写基础 and ExpectCourse.pdf

    Bash(Bourne Again Shell),几乎所有的 Linux 和绝大部分的 UNIX 都可以使用 Bash。作为系 统与用户之间的交互接口,shell 几乎是你在 UNIX 工作平台上最亲密的朋友,因此,学好 shell,是学习 Linux/UNIX 的的开始,并且...

    windows下编写mapreduce程序

    使用Hadoop的命令行工具提交作业,并通过日志和输出数据进行调试。 总之,在Windows下编写MapReduce程序需要对Hadoop的架构和MapReduce模型有深入理解,同时利用UnxUtils等工具来适应Unix-like环境。通过实践和不断...

    linux实现交互执行:expect

    为了自动化这些过程,`expect`工具应运而生。`expect`是一个基于TCL(Tool Command Language)的脚本语言,主要用于自动化那些需要用户交互的任务,它能够模拟用户对命令行的输入,极大地提高了工作效率。 `expect`...

    使用python实现mapreduce(wordcount).doc

    在大数据处理领域,Java 通常是首选语言,但考虑到Python在数据挖掘和深度学习中的便利性,我们可以使用Python来实现MapReduce。本篇文章将探讨如何在Hadoop平台上利用Python实现WordCount,一个经典的MapReduce示例...

    expect5.45

    在IT行业中,`expect`是一个强大的自动化脚本工具,它允许程序员或系统管理员与命令行交互,特别是自动处理需要用户输入的情况。`expect`的名字来源于它"期望"特定的输出,然后根据这些输出做出响应。在标题和描述中...

    expect_test_bash.sh

    expect_test_bash

Global site tag (gtag.js) - Google Analytics