遇到疯狂GC时进行判断然后重启服务的方法-GPT学习使用之三

遇到,疯狂,gc,进行,判断,然后,重启,服务,方法,gpt,学习,使用,之三 · 浏览次数 : 28

小编点评

**1. 创建killscirpt和startscript脚本** ```bash # killscirpt.sh kill -9 service_name &> /dev/null # startscript.sh nohup -m -n service_name &> /dev/null ``` **2. 修改脚本启动脚本和参数** * 在 `killscript` 中添加以下命令: ```bash trap 'kill -9 $! && sleep 5; exit;' exit ``` * 修改 `startscript` 中的命令: ```bash trap 'trap -e exit; nohup ./checkgctime &> /dev/null &' exit ``` **3. 编写主脚本** ```bash #!/bin/bash # 监控 GC 的次数 while true; do gclog=/myapp/gclog.log gclogbackup=/myapp/gclog_${now}.log" count=0 # 读取 GC log 的内容 while IFS= read -r line; do if [[ "$line" =~ ^# ]] ; then continue fi if [[ "$line" =~ ^timeinfo ]] ; then timeinfo="$line" fi if [[ "$line" =~ ^ERGONOMICS ]] ; then count=$((count+1)) fi done # 检查最近 3 分钟内的 ERGONOMICS FULL GC 数额超过 2 次 if [[ $count -gt 2 ]]; then scp -rp "$gclog" "$gclogbackup" echo "关闭服务, 等待五秒钟重启,请自行维护脚本" /deploy/killscript sleep 5 echo "重启服务, 请自行维护脚本" /deploy/startscript fi # 循环检查 sleep 10 done ``` **4. 测试验证** * 在 `startgctime` 中添加以下命令: ```bash nohup ./checkgctime &> /dev/null & ``` * 运行脚本并确保它正常运行。 **注意** * 这是一种基本的示例,需要根据实际情况进行调整。 * 请确保脚本具有足够的权限,并进行严格的测试验证。

正文

遇到疯狂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能够帮自己使用语法, 但是很多思路还是需要自己串联
他给出的脚本,大部分都很初级, 可能无法彻底实现自己的业务场景.

与遇到疯狂GC时进行判断然后重启服务的方法-GPT学习使用之三相似的内容:

遇到疯狂GC时进行判断然后重启服务的方法-GPT学习使用之三

# 遇到疯狂GC时进行判断然后重启服务的方法-GPT学习使用之三 ## 背景 ``` 最近怀疑产品遇到了第三方组建的bug Groupdocs转换渲染某些文件时出现了严重的FullGC的情况 而且出现的奇怪的功效学GC ergonomics 的提示 因为不好发现, 所以同事想通过遇到异常时自动进行重

【故障公告】遭遇用心良苦的疯狂攻击:DDoS + CC攻击

2023年10月2日19:32,收到阿里云的通知短信,最近几年几乎每年都会遇到短暂的 DDoS 攻击,为了减少攻击带来的影响,我们部署了好多台负载均衡,本以为和以前一样只是其中1-2台负载均衡受到攻击而被屏蔽。 但接下来接连不断的通知短信把我们惊呆了,我们针对不同线路部署的所有负载均衡全部被攻击,全...

VBNET AUTOCAD 单行文字OBB有向包围盒的计算

遇到要求单行文字包围和的需求,发现AutoCAD自带的算法仅能求出正交包围盒,如下图所示的粉色矩形 我想获取下图下图所示蓝色矩形的部分及OBB 计算方法图形示例: 下面是完整的代码,其中求D点的坐标p1涉及到向量定比分点公式

.NET Core Swagger Actions require a unique method/path combination for Swagger/OpenAPI 3.0. Use ConflictingActionsResolver as a workaround

遇到的问题 因为新增了一个控制器方法,从而导致在运行Swagger的时候直接报错,异常如下: SwaggerGeneratorException: Conflicting method/path combination "POST api/UserOperationExample" for acti

YUM退役了?DNF本地源配置

客户遇到在OEL8安装Oracle缺包问题,使用dnf安装也没有,甚至连oracle-database-preinstall-21c都装不上。本质是DNF配置问题。 早期为了解决这类问题,专门写过很多yum配置的文章,后来汇总一篇《Linux的yum源配置总结》,包含当时的各种版本各种配置,只要有人

端口占用,无法通过netstat找到进程,占用的端口又不能修改,该怎么办?

最近遇到一个奇葩的问题,项目跑的好好的,没有安装其它特殊软件,突然服务器启动报错,日志如下,显然是服务器的8080端口占用了。 Caused by: java.net.BindException: Address already in use: bind at sun.nio.ch.Net.bind

使用Wesky.Net.OpenTools包来快速实现嵌套型结构体数据转换功能

今天遇到有人提到结构体和byte数组互转的问题,我就顺便拿来水一篇。这是一个冷门的问题,估计使用的人不多。既然有需求,应该就有使用场景,那就顺便整一波。 为了达到效果,结构体、复杂结构体嵌套等都能实现转换,我就顺便做了个包更新来提供使用和下面的说明。 首先引入nuget包 Wesky.Net.Ope

一个Redis dump文件的简要分析过程

摘要 遇到一个老大难的问题. 让帮忙分析一下一个Redis的dump文件. 虽然之前写过了rdb和rdr的文档 但是感觉大家都喜欢拿来主义. 没办法. 今天继续进行深入一点的分析. 原理其实还是基于rdb的. 不过多思考了一点别的内容. 分析原始文件 rdb -c memory redisdump.

[转帖]最近遇到的一个库&表字符集大坑

https://cloud.tencent.com/developer/article/1984765?areaSource=&traceId= 我们生产环境的建表语句,之前一直要求研发提交时候不要带上字符集和排序集,这样就可以follow数据库默认的配置。但是最近发现掉坑里了。 至于是什么坑,为什

[转帖]Linux遇到一个内存过高的报警——释放buff/cache

前些天一直受到内存报警,过一段时间就会恢复。由于开发工作有些多,就一直没理它,但是最近几天开始有些频繁了。虽然不影响业务,但是天天报警,还是让人提心吊胆的。因此就抽了一个上午的时间去解决一下这个问题。 排查问题 这台机器安装的是mongodb,因为最近业务增加,内容使用增加是正常的,但是实际的占用内