背景:线上项目 框架Springboot ,mybatis ,dubbo
事故:cpu 暴涨100%
线上服务运行稳定超过一个月,之后,突然某一个项目服务器警报cpu暴涨。
开始分析原因,cpu暴涨可能引发的因素,访问量突然飙升,代码出现无限循环导致内存泄露之类,出现慢sql 服务等待时间过长,缓存击穿等
开始排查:
1.查询代理服务器,未发现短时间内访问量暴增,监控qps访问量正常排除访问量,排除
2.代码出现无限循环导致内存无法释放等问题,排查系统日志,logback日志未发现任何错误打出,排除
3.查询数据库慢sql,未发现任何慢sql,排除
4.缓存击穿,查看redis监控,未发现任务异常,排除
经过2天各种排查,未发现任何问题,但是有个规律,一旦重启就会恢复,恢复后1到2小时内又回出现。基本确认是定时器搞的鬼。但是由于定时器分布在各个项目中任何远程调用本项目接口 排查十分困难。
走投无路下,开始研究java监控程序,经过咨询其他同事后建议引入 javamelody尝试。
Springboot 集成javamelody 只需要 pom添加一个依赖包即可操作方便。(此处可使用搜索引擎查看具体实施方法)
javamelody提供了界面展示,查看某一接口耗时占用的百分比。上线后发现某一接口占cpu 80% ,检查该接口为定时器接口。后确认一次性去除大量的数据导致内存沾满 ,gc机制释放,所以重启项目就会恢复,启动1到2小时 定时器再次启动就又发生。
通过对接口的最大调用数量限制重启项目后,未出现此类现象,事故解决。
由于之前各个地方都存有监控,一旦出现问题基本可以定位。此次出现问题各个监控均未发现问题,无奈引入javamelody。 建议正式环境 关闭javamelody,出现问题再开启检测。