最近感冒了,还有点低烧,这个问题一直没记录上来
先说明下情况,现象是线上的某一台服务器突然CPU飙升,一直降不下来
初步分析这台机子除了同步离线数据(人员信息)外,并没有CPU密集型的任务
1、然而看了下日志,人员信息同步,数量仅仅1000条,感觉应该不是这个问题
2、接着到服务器上jps,搞出进程ID(通常需要先通过top命令找出占用CPU高的进程)
3、继续jstack(jdk工具,服务器上不一定有) 进程ID,发现大部分代码在执行一个伪递归方法(就是while (true) {}这样的一段代码)
4、继续分析这段代码得出,这里面会去获取一个工作关系链,如果这个关系链有人维护错了,形成依赖循环就会无限循环
5、旁边小哥撸起了python,试着把所有循环依赖的工作关系都查出来
6、而我因为这台服务器是单独针对某一个流程的,所以我直接对现有数据的范围做了限定,即缩小范围,很快找出了这台服务器上操作的对应一条存在工作关系循环依赖的情况。由于时间关系,而且是临时更新,所以就只剽窃下隔壁小哥的Set循环依赖检测方法,没做别的,后续还需要把循环的依赖链打出来给用户提示(毕竟用户PIG)
另外:可能是因为目前维护项目的公司自己维护服务器的关系吧,以前用阿里云的数据库根本不太会出现这类型的问题(基本上出现的应该是事务超时的情况,因为我这个方法是有事务的,事务时间太长是会超时的,但呵呵,现在这个项目并不会,而且有历史原因。。。)
附上事务超时的几种配置方式:
mysql:innodb_lock_wait_timeout=10
spring:
@Transactional(timeout = 10)