CPU问题
cpu问题是比较常见的问题,cpu负载过高会导致系统接口卡顿,响应变慢,对于造成cpu过高的大致有以下几种情况。
- JVM频繁GC导致cpu高。
- 存在死循环,导致cpu负载过高。
- 执行其他消耗cpu多的操作,比如打印过多的debug日志,循环过多。
在实际开发中,遇到比较多的是频繁gc,尤其是频繁Full GC导致cpu过高。频繁Full GC主要由以下几种情况。
- 老年代空间不足
- metaspace方法区空间不足
- System.gc()
针对cpu过高的常用排查方法由:
- 使用arthas 查看占比cpu高的线程 thread -n 3 -i 1000
- Github开源脚本show-busy-java-threads显示占用cpu高的线程。
- ps -mp pid -o THREAD,tid,time | sort -k2r 查看进程占用cpu高的线程。该命令消耗cpu少。
- ps -mp pid -o THREAD,tid,time | head -n 40 查看进程占用cpu高的前几个线程。
- top定位cpu高的线程,top -Hp -p pid 定位使用 CPU 最高的线程,线程 id 转化 16 进制 printf ‘%x\n’ pid 得到 nid ,jstack pid |grep ‘nid’ 注意nid前面一般要加0x找到线程堆栈。步骤多,grep的时候可能匹配到很多,不方便查找。jstack pid 打印线程堆栈,分析日志。
- cat jstack.log | grep “java.lang.Thread.State” | sort -nr | uniq