记一次上线出现的问题。
现象:上线后过了没多久突然发现整个网站的响应都特别慢,一次简单的查询都要经过60多秒。后台dubbo早已超时断开。
1:因为需要查询权限,所以一开始怀疑查询权限接口有问题,然后怀疑数据库查询慢,将生产执行的sql拼接好直接执行后发现速度很快。
2:直接怀疑服务器性能,通过查询服务器四个节点的cpu与内存的使用情况,发现cpu使用率均达到90%以上,且随着时间还在增长,内存也接近耗尽。
不用多想,接下来就是寻找占用cpu最高的线程了。
使用top命令
查询到占用cpu最高的pid(进程号)。
使用 top -Hp pid
查询到tid为376056,377934,376056这三个进程占用了cpu的大部分使用率。
使用 printf ‘%x/n’ tid
查询到这三个进程的id的十六进制
使用jstack pid | grep tid -A 50
查看线程的堆栈信息。
发现这个三个线程中,有一个为GC垃圾回收期在占用,另外一个为业务中的代码,到此可以判断,业务代码中应该会有一段代码一直在创建变量或者对象,引起内存不足,进而引起GC垃圾回收期一直在进行垃圾回收。
代码查看时,发现有一段代码确实可能会出现死循环的情况,至此,查排完成,拉hotfix,修复,二次发布。
PS:本次上线不仅仅有这个问题,折腾来折腾去,到了第二天七点才下班,再此,感谢和我一起加班的测试妹子,一直电话远程指导我得大佬及此篇文章的作者:https://blog.csdn.net/dam454450872/article/details/80382291。另,由于公司性质,服务器查询时的图片就不发了。