zl程序教程

您现在的位置是:首页 >  硬件

当前栏目

线上cpu使用率100%如何排查

CPU 如何 排查 线上 使用率 100%
2023-06-13 09:14:08 时间

自从使用滴滴开源的夜莺监控系统之后,偶尔会收到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行代码。