这是一次真实的问题解决,献给同样被高cpu问题困扰的大家。
背景:
某天内部用户反馈,前端界面加载特别慢。测试了网络,日志,代码,感觉都正常,但是程序在使用查询sql的时候就是不返回。
1、进到linux容器中执行 top命令,结果发现高cpu占用,其中pid 为1的正是我们的java程序
2、执行命令找出占用CPU最高的线程 top -Hp pid 显示的新pid都是线程,找到占用cpu最高的线程号
3、把线程号转换为16进制,便于在jstack中查询 printf "%x\n" tid 变为16进制
4、jstack命令查看相应线程的堆栈 jstack pid | grep 0x十六进制结果 -A30
5、定位到代码,是同事写的一个死循环,通过mybits一直循环查询mysql是否有值,如果有值跳出循环,但是mybits有一级缓存,通过去掉一级缓存解决问题
<setting name="localCacheScope" value="SESSION"/>
改为<setting name="localCacheScope" value="STATEMENT"/>解决
ps:高cpu通常伴随着死循环,可以重点往这方面想。