(相关资料图)
最近怀疑产品遇到了第三方组建的bugGroupdocs转换渲染某些文件时出现了严重的FullGC的情况而且出现的奇怪的功效学GCergonomics 的提示因为不好发现, 所以同事想通过遇到异常时自动进行重启来暂时规避这个问题. 因为这个服务仅是一个文档转换和预览, 可以不用考虑太多的数据一致性等问题所以周末时间想着帮忙写一写
利用jvm的 +XX:printgc 的配置将gc日志打印出来.然后分析GClog, 判断最近三分钟,如果有两次ergonomics的fullGC处理就重启服务. 如果没有就继续循坏. 每十秒钟执行一次判断与循环.
第一步. 增加killscirpt和startscript便于关闭和启动服务. 可以在killscript 之前增加抓取dump或者是jstack的脚本. 启动脚本里面可以增加日志的备份脚本. 第二步. 编写主脚本.分析gclog日志.循环判断full GC产生的日期. 如果是在最近几分钟内则 数据 +1 然后判断大于两次, 执行第一步的脚本. 第三步. 设置脚本启动,循环判断.
神通数据库的李诺帆老师推荐了edge的webtag的GPT插件可以通过这个插件获取一些编写脚本的简单处理效果如图示:
#! /bin/bash#备注: 本脚本的用途是每20秒判断gclog内GC的次数, 如果ergonomics的gc次数在3分钟内超过2次,那么执行重启操作. #需要严格注意本脚本的使用, 必须修改好脚本的启动脚本, 配置参数, 时间间隔等. #必须严格进行测试, 不要随意上生产. while truedointerval=20now=`date +%Y%m%d%H%M`timeinfo=`date -d "-3 min" +%s`#timeinfo=`date -d "-10 days" +%s`gclogfile="/myapp/gclog.log"gclogbackup="/myapp/gclog_${now}.log"count=0for num in $(for i in `cat /myapp/gclog.log |grep -i ergonomics |awk "{print $1}" |awk -F + "{print $1}"`; do echo ` date -d ${i} +%s` ; done)do if [ $num -gt $timeinfo ] then ((count++)) fidoneecho "最近周期内的ergonomics的GC次数为: $count"if [ $count -gt 2 ]then scp -rp $gclogfile $gclogbackup echo "" > $gclogfile echo "关闭服务, 等待五秒钟重启,请自行维护脚本" /deploy/killscript sleep 5 echo "重启服务,请自行维护脚本" /deploy/startscript fisleep $intervaldone
编写脚本为 checkgctime然后chmod +x checkgctime然后 nohup ./checkgctime & 进行测试验证. 注意务必要进行严格测试, 避免出现安全隐患GPT能够帮自己使用语法, 但是很多思路还是需要自己串联他给出的脚本,大部分都很初级, 可能无法彻底实现自己的业务场景.
关键词:
质检
推荐