问题描述
由于项目排期较紧,临时从其他组调来三个开发资源帮我一起做项目,难免上线的时候大家的需求一块上线。
问题来了,上线三天后,线上CPU总是莫名奇妙的突然飙升,飙升后CPU并未降下来,而是一直处在高点。
问题复现
由于是线上导致的问题,CPU超限后,会自动重启项目,未能保留现场,这样就给排查问题带来了困难。于是,在UAT环境进行压测,看问题出现在哪里。
果不其然,在压测一段时间后,复现了CPU飙升的问题。
查找根因
- 在出现问题的服务中通过top 命令查看CPU占用100%的进程号(PID)
- top -H -n 1 -p PID 然后通过命令查找对应进程下线程的状态
- 通过 jstack -l PID > ./jstack.log 命令输出进程的线程文件
- 查看刚输出的jstack.log文件,查看线程详情
- 将PID,转成16进制
- 查看jstack.log,搜索转成16进制的字符,可以 /+字符串 例如:/4a6 直接向下搜索所在位置,可以看到此线程正在运行中,而且代码行数也标注清楚。
当时没保留每一步的操作截图( ̄▽ ̄)"
第6步有标注出现问题的具体某一行代码,然后进行排查,发现是一段做动态计算的代码,遂进行修改,加上计算时间显示,大于某个时间没计算出来则终止计算。
复测
代码修改完发布到UAT环境再次进行压测,这次不在出现CPU突然飙升的情况,搞定!!!