简介: 线上代码经常会出现 CPU 占用过高的情况,按以往经验我会使用 top 指令,进一步借助于 jstack 去查看具体信息从而进行问题排查,但基本上都逃不过需要重新发包的局面,及时是一个增量包,应用也需要短暂停启。后来运维大兄弟让我试一下 Arthas,说是可以进行代码的热更新操作,正好来试一下。
作者 | 何波
【Arthas 官方社区正在举行征文活动,参加即有奖品拿~点击投稿】
1.前言
背景
线上代码经常会出现 CPU 占用过高的情况,按以往经验我会使用 top 指令,进一步借助于 jstack 去查看具体信息从而进行问题排查,但基本上都逃不过需要重新发包的局面,及时是一个增量包,应用也需要短暂停启。后来运维大兄弟让我试一下 Arthas,说是可以进行代码的热更新操作,正好来试一下。
关于 Arthas 的安装与基础使用可以参考下面两篇文章:
环境
JDK1.8
SPringBoot 2.2.2
Arthas
Linux
测试代码:
@RequestMapping(value = "/bigThread")
@ResponseBody
public String bigThread(int id) {
ArthasService.test();
while (true) {
Thread t2 = new Thread();
t2.start();
id ++;
if(100000 == id) {
return String.valueOf(id);
}
}
}
思路
2.thread -b 查看是否有阻塞线程
thread -b, 找出当前阻塞其他线程的线程,执行完之后并未发现,说明该线程并非一直阻塞、一直执行的。
3.thread 查看占用最高的线程
当 thread 之后不跟参数时,显示当前全部线程信息,我觉得 thread -n 10,展示前 10 应该就够用,可根据实际需要自己决定。
下图可以很直观的看出,我们的应用瞬间占用了 77% 的 CPU(这里我是发起请求瞬间,通过 thread 查看的,所以比较直观,生产环境应该只有阻塞,死锁这种状态才会比较直观)。
4.thread id 查看具体信息
在上一步基础上,我们进一步查看,thread 15(因为上面的 ID=15)。