当前位置:网站首页>真实案例:系统上线后Cpu使用率飙升如何排查?
真实案例:系统上线后Cpu使用率飙升如何排查?
2022-07-17 06:44:00 【Young丶】

其实这是个很常见的问题,也非常简单,那既然如此我为什么还要写呢?因为上次回答的时候我忘记将线程PID转换成16进制的命令了。
所以我决定再重温一遍这个问题,当然贴心的我还给大家准备好了测试代码,大家可以实际操作一下,这样下次就不会忘记了。
模拟一个高CPU场景
public class HighCpuTest {
public static void main(String[] args) {
List<HignCpu> cpus = new ArrayList<>();
Thread highCpuThread = new Thread(()->{
int i = 0;
while (true){
HignCpu cpu = new HignCpu("Young、",i);
cpus.add(cpu);
System.out.println("high cpu size:" + cpus.size());
i ++;
}
});
highCpuThread.setName("HignCpu");
highCpuThread.start();
}
}
在main方法中开启了一个线程,无限构建HighCpu对象。
@Data
@AllArgsConstructor
public class HignCpu {
private String name;
private int age;
}
准备好上面的代码,运行HighCpuTest,然后就可以开始一些列的操作来发现问题原因了。
排查步骤
第一步,使用 top 找到占用 CPU 最高的 Java 进程
1. 监控cpu运行状,显示进程运行信息列表
top -c
2. 按CPU使用率排序,键入大写的P
P

第二步,用 top -Hp 命令查看占用 CPU 最高的线程
上一步用 top命令找到了那个 Java 进程。那一个进程中有那么多线程,不可能所有线程都一直占着 CPU 不放,这一步要做的就是揪出这个罪魁祸首,当然有可能不止一个。
执行top -Hp pid命令,pid 就是前面的 Java 进程,我这个例子中就是 16738 ,完整命令为:
top -Hp 16738,然后键入P (大写p),线程按照CPU使用率排序
执行之后的效果如下

查到占用CPU最高的那个线程 PID 为 16756
第三步,查看堆栈信息,定位对应代码
通过printf命令将其转化成16进制,之所以需要转化为16进制,是因为堆栈里,线程id是用16进制表示的。(我当时就是忘记这个命令了~)
[[email protected] ~]# printf "%x\n" 16756
4174
得到16进制的线程ID为4174。
通过jstack命令查看堆栈信息
jstack 16738 | grep '0x4174' -C10 --color

如上图,找到了耗CPU高的线程对应的线程名称“HighCpu”,以及看到了该线程正在执行代码的堆栈。
最后,根据堆栈里的信息,定位到对应死循环代码,搞定。
小结
cpu使用率飙升后如何排查这个问题不仅面试中经常会问,而且在实际工作中也非常有用,大家最好根据上述步骤实际操作一下,这样才能记得住记得牢。
边栏推荐
- By voting for the destruction of STI by Dao, seektiger is truly community driven
- How to choose the right model
- redis主从复制
- 4-channel fmc+ baseband signal processing board (4-channel 2G instantaneous bandwidth ad+da)
- LeetCode 每日一题 2021/7/11-2021/7/17
- Pytoch notes (2)
- Xinlinx zynq7010 domestic replacement fmql10s400 national production arm core board + expansion board
- Mongodb index
- Go语言圣经
- Kingbasees can realize any of MySQL by constructing an aggregate function_ Value function.
猜你喜欢

912. 排序数组(数组排序)
![[C # variable constant keyword] - variable constants and keywords in C #](/img/9b/433f9110d9c7599d8beac8288ea409.png)
[C # variable constant keyword] - variable constants and keywords in C #

美联储降息,为何长期利好数字货币市场? 2020-03-05

From the casino logic, analyze the investment value of platform currency 2020-03-03

Forecast sales xgboost

Jira --- workflow call external api

Ruffian Heng embedded bimonthly issue 58

Understand LSTM and Gru

redis主从复制

类型详解·自定义类型·结构体初识
随机推荐
[C # console] - C # console class
Machine learning interview questions (Reprinted)
1669. 合并两个链表(两个链表的合并)
How to write the highlights of SCI papers (seriously teach you how to write)
How did "leek" give money to "sickle"? 2020-03-07
【刷题篇】完全平方数
本地存储 sessionStorage
才意识到自己“奇葩”的360,会不会有些晚?
【特征工程】
First experience of openvino machine learning
Ku115 FPGA high performance 10G Optical fiber network hardware accelerator card / 2-way 10G Optical fiber data accelerator card
Pytorch notes (5)
深圳保诚笔试记录
Shenzhen Prudential written examination record
微信OAuth2.0 登录流程以及安全性分析
Jd.com's purchase intention forecast (III)
Xinlinx zynq7020, 7045 domestic replacement fmql45t900 national production arm core board + expansion board
Paddleserving服务化部署 tensorrt报错, shape of trt subgraph is [-1,-1,768],
[C classes and objects] - Methods and class and object programming in C
【MySQL】 MVCC:正确理解MVCC及其实现原理