网站开发入门,国外做任务网站,全国企业信用信息查询官网,深圳自适应网站建设报价文章目录 问题场景问题定位问题解决 本文参考#xff1a;
Linux服务器之CPU过高解决思路_linux cpu温度过高_Jeremy_Lee123的博客-CSDN博客
Java程序员必备#xff1a;jstack命令解析 - 掘金 (juejin.cn)
重点问题#xff01;CPU利用率过高排查思路#xff5c;原创 (qq.… 文章目录 问题场景问题定位问题解决 本文参考
Linux服务器之CPU过高解决思路_linux cpu温度过高_Jeremy_Lee123的博客-CSDN博客
Java程序员必备jstack命令解析 - 掘金 (juejin.cn)
重点问题CPU利用率过高排查思路原创 (qq.com)
问题场景
通常会收到监控系统告警相关服务器负载异常cpu使用率过高
原因可能是业务代码死循环、GC频繁、线程阻塞等
在虚拟机上运行下面的文件:
/*** Author jiangxuzhao* Description* Date 2023/8/1*/
public class CPUHigh {public static void main(String[] args) {Thread t new Thread(()-{int a 3;while (true) {if (a 3) {a a/2;}else {a 3;}}});t.start();}
}
javac CPUHigh.java
问题定位
1.执行top 命令查看占用cpu最多的Java进程为4018。
top2.看到PID根据pid进程号去查看它的所有线程找到对应cpu占用最多的Java线程为4030。
top -Hp 4018将10进制线程id 4030转换为16进制
[rootVM-8-3-centos ~] printf %x\n 4030
fbe通过jstack命令找到进程4018对应的堆栈信息搜索其中的线程id为16进制fbe的记录
[rootVM-8-3-centos ~]# jstack 4018 | grep fbe -C 10结果如下
2023-08-01 22:31:43
Full thread dump OpenJDK 64-Bit Server VM (25.362-b08 mixed mode):Attach Listener #10 daemon prio9 os_prio0 tid0x00007fa70c001000 nid0x7000 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLEDestroyJavaVM #9 prio5 os_prio0 tid0x00007fa73404b800 nid0xfb3 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLEThread-0 #8 prio5 os_prio0 tid0x00007fa734203800 nid0xfbe runnable [0x00007fa71fbd2000]java.lang.Thread.State: RUNNABLEat CPUHigh.lambda$main$0(CPUHigh.java:14)at CPUHigh$$Lambda$1/471910020.run(Unknown Source)at java.lang.Thread.run(Thread.java:750)Service Thread #7 daemon prio9 os_prio0 tid0x00007fa73412f800 nid0xfbc runnable [0x0000000000000000]java.lang.Thread.State: RUNNABLEC1 CompilerThread1 #6 daemon prio9 os_prio0 tid0x00007fa73411d000 nid0xfbb waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE从中可以看出问题定位在Thread-0
问题解决
对于CPU占用率飙高的场景刚才列举的测试代码只是一种情况还有如下可能。
1.业务线程出现大量阻塞比如synchronized锁可以检索状态为BLOCKED的线程找到堆栈信息然后分析。
2.网络IO或者磁盘IO阻塞导致的排查方法和上面一样。
3.GC线程频繁导致线程的标识为GC task thread对于这种情况可能是年轻代设置不合理、大对象分配过多old区存活对象过多具体问题具体分析。