线上cpu使用率100%如何排查
自从使用滴滴开源的夜莺监控系统之后,偶尔会收到cpu报警的邮件,姜同学分析了一下原因大多都是java进程进入了循环或是死锁而得不到释放造成的,接下来姜同学就模拟下cpu使用率超过100%以及两种方案的排查过程。
一段陷入循环的代码
是第19行哦
使用Top和(JDK自带的)jstack定位原因
toc -c 找到cpu使用率最高的进程
toc -c
获得PID 4487
top -Hp pid 找到进程中cpu占用率最高的线程
top -Hp 4487
获得cpu使用率最高的线程ID 4500
将十进制的线程id转为16进制
使用top工具查找到的线程id都是二进制滴,但是java堆栈日志里面的线程ID都是16进制滴,所以为了定位具体的堆栈信息我们将十进制的线程ID转为16进制滴。
printf "%x\\n" 4500
jstack查看堆栈
jstack pid | grep "16进制的线程ID" -C5 --color
很快就定位到了咱们上面陷入循环的第19行代码。
使用阿里开源的arthas快速定位
如果你的运气不错服务器上面有arthas,并且内存并没有因为cpu的问题而爆表,那么你将会更便捷的定位到问题的原因。
arthas的官方文档https://arthas.aliyun.com/doc/,上面有他更强大的功能以及详细的使用方式。
启动arthas
java -jar arthas-boot.jar
启动之后发现了我们服务器上面java进程
输入1即可进入对应的java进程
thread -n 3 打印出最忙的三个线程
3你可以换成 4,5,6展示的就是前4,5,6个线程你懂我的意思吧。
很快又定位到了我们陷入循环的第19行代码。