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