目 录

1.前 言

2. 测试类编写

3. 故障定位方法

3.1 定位CPU占比最高的PID

3.2 定位该PID对应的应用程序名字

3.3 定位具体的线程ID

3.4 定位具体的应用程序代码位置

4. 小结


1.前言

CPU占用过高是LINUX服务器常见的一种故障,也是程序员线上排查故障必备的技能,如果线上出现此种故障,程序员应如何快速定位代码块排查故障呢?本文将从四个步骤进行分析,快速定位问题所在,从应用程序的进程入手到具体线程再到应用程序的具体代码,从整体到局部,化繁为简,层层深入,为读者提供了一种线上快速定位排查故障的思路和手段。

2. 测试类编写

编写测试类,模拟占用CPU过高的程序,具体程序代码如下:

public class TopTest {public static void main(String[] args) {while (true) {System.out.println(new java.util.Random().nextInt(777778888));}}}

maven打包后上传至linux服务器中

运行该JAVA程序

nohup java -jar JavaDemo-1.0-SNAPSHOT.jar >/tmp/TopTest.log  2>&1 ;

监控日志文件:

[root@bigdata3 tmp]# tail -f TopTest.log

具体内容如下:

3. 故障定位方法

3.1 定位CPU占比最高的PID

    先用top命令找出CPU占比最高的PID

             命令行输入 top。其内容如下:

注:通过shift +h可以锁定哪个进程消耗的CPU高。

由该图可以看到

  • (1)平均负载(load average):1.36.说明平均负载过高(超过0.6) ,后台一定有个占用cpu过高的程序。
  • (2)该程序为一个java程序占用CPU百分比为100.3,内存为0.5%,该java进程ID为11911

3.2 定位该PID对应的应用程序名字

ps -ef 或者jps进一步定位得知其具体的后台应用程序名字

ps -ef | grep 11911 | grep -v grep

jps -l

可以得出该应用程序为:JavaDemo-1.0-SNAPSHOT.jar

3.3 定位具体的线程ID

ps -mp 进程ID -o THREAD,tid,time

[root@bigdata3 ~]# ps -mp 11911 -o THREAD,tid,time
USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID     TIME
root     99.9   -    - -         -      -     - 00:33:35
root      0.0  19    - futex_    -      - 11911 00:00:00
root     99.6  19    - -         -      - 11912 00:33:28
root      0.0  19    - futex_    -      - 11913 00:00:00
root      0.0  19    - futex_    -      - 11914 00:00:00
root      0.0  19    - futex_    -      - 11915 00:00:00
root      0.0  19    - futex_    -      - 11916 00:00:00
root      0.0  19    - futex_    -      - 11917 00:00:00
root      0.0  19    - futex_    -      - 11918 00:00:00
root      0.0  19    - futex_    -      - 11919 00:00:00
root      0.0  19    - futex_    -      - 11920 00:00:00
root      0.0  19    - futex_    -      - 11921 00:00:01
root      0.0  19    - futex_    -      - 11922 00:00:00
root      0.0  19    - futex_    -      - 11923 00:00:00
root      0.0  19    - futex_    -      - 11924 00:00:00
root      0.0  19    - futex_    -      - 11925 00:00:00
root      0.0  19    - futex_    -      - 11926 00:00:00
root      0.0  19    - futex_    -      - 11927 00:00:00
root      0.0  19    - futex_    -      - 11928 00:00:00
root      0.0  19    - futex_    -      - 11929 00:00:00
root      0.0  19    - futex_    -      - 11930 00:00:00

可以看出有问题的线程为:

     root     99.6  19    - -         -      - 11912 00:33:28

    说明线程TID:11912占用率最高。

参数解释:

  • -m:显示所有的线程
  • -p:pid进程使用CPU的时间
  • -o:该参数后是用户自定义格式。

如:THREAD,tid,time表示线程、线程ID号、线程占用的时间

3.4 定位具体的应用程序代码位置

解释:定位线程中具体哪一行代码出问题

(1)将需要的线程ID转换成16进制格式

1) printf "%x\n" 有问题的线程ID

printf "%x\n" 11912

2)采用计算器计算:

线程ID11912转换为16进制为:2E88‬->2e88(注意要转换成小写形式)

(2)jstack进程ID | grep tid(16进制线程ID小写英文)-A60

jstack 11911 | grep tid(16进制线程ID小写英文) -A60

jstack 11911 | grep 2e88 -A60

执行结果如下:

"main" #1 prio=5 os_prio=0 tid=0x00007f73f4008800 nid=0x2e88 runnable [0x00007f73fa74f000]java.lang.Thread.State: RUNNABLEat java.io.FileOutputStream.writeBytes(Native Method)at java.io.FileOutputStream.write(FileOutputStream.java:326)at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)- locked <0x0000000643403bf0> (a java.io.BufferedOutputStream)at java.io.PrintStream.write(PrintStream.java:482)- locked <0x00000006434030a8> (a java.io.PrintStream)at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:104)- locked <0x0000000643403060> (a java.io.OutputStreamWriter)at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)at java.io.PrintStream.write(PrintStream.java:527)- eliminated <0x00000006434030a8> (a java.io.PrintStream)at java.io.PrintStream.print(PrintStream.java:597)at java.io.PrintStream.println(PrintStream.java:736)- locked <0x00000006434030a8> (a java.io.PrintStream)at TopTest.main(TopTest.java:6)"VM Thread" os_prio=0 tid=0x00007f73f41c6000 nid=0x2e91 runnable "GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007f73f401d800 nid=0x2e89 runnable "GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007f73f401f800 nid=0x2e8a runnable "GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00007f73f4021800 nid=0x2e8b runnable "GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00007f73f4023000 nid=0x2e8c runnable "GC task thread#4 (ParallelGC)" os_prio=0 tid=0x00007f73f4025000 nid=0x2e8d runnable "GC task thread#5 (ParallelGC)" os_prio=0 tid=0x00007f73f4027000 nid=0x2e8e runnable "GC task thread#6 (ParallelGC)" os_prio=0 tid=0x00007f73f4028800 nid=0x2e8f runnable "GC task thread#7 (ParallelGC)" os_prio=0 tid=0x00007f73f402a800 nid=0x2e90 runnable "VM Periodic Task Thread" os_prio=0 tid=0x00007f73f421c000 nid=0x2e9a waiting on condition JNI global references: 9

可以看出是在TopTest类中main方法的第六行出现问题。

at TopTest.main(TopTest.java:6)

可以具体定位到代码块如下图所示:第六行

注:可以通过pwdx +进程ID 找到业务进程路径

4. 小结

本文阐述了一种CPU占用过高的故障定位方法及思路,文中采用四步分析法进行排查和定位,旨在提供一种快速解决线上CPU占用过高故障的定位方法和思路,通过该方法可以巧妙快速地排查故障,为线上排查故障节省了时间。

欢迎关注石榴姐公众号"我的SQL呀",关注我不迷路

一种CPU占用过高的故障定位分析方法相关推荐

  1. jvm cpu占用过高实例以及排查方法

    起因 在项目现场发现,程序运行的过程中,发现会时不时有cpu占用400%以上的情况,而通过界面很难定位到触发了哪里导致的,不能缩小分析范围. 收集数据 于是使用了以下几种方式采集数据: 1.对jar包 ...

  2. 假如生产环境出现CPU占用过高,如何分析思路和定位?

    解决思路:先查占用CPU高的进程号---->然后查询占用CPU高的线程号---->z最后查询是具体哪行代码出的问题. 一. 使用top命令找出CPU占比最高的进程. 从图中可以查出CPU占 ...

  3. 如何排查CPU占用过高以及常见的几种情况

    在最近上线过程中遇到cpu占用率过高问题 由于问题已解决,此时仅重现操作方法 1.先用top命令,找到cpu占用最高的进程 PID  如上图 2.再用ps -mp pid -o THREAD,tid, ...

  4. 一次单核CPU占用过高问题的处理

    客户现场反馈,top的检查结果中,一个CPU的占用一直是100%.实际上现场有4个CPU,而且这个服务器是mysql专属服务器. 我的第一反应是io_thread一类的参数设置有问题,检查以后发现re ...

  5. mysql是单核吗_一次单核CPU占用过高问题的处理

    客户现场反馈,top的检查结果中,一个cpu的占用一直是100%.实际上现场有4个cpu,而且这个服务器是mysql专属服务器. 我的第一反应是io_thread一类的参数设置有问题,检查以后发现re ...

  6. JVM|记一次生产环境 CPU 占用飙高问题解决

    目录 1 问题发现与背景 2 运维报警 3 问题定位与解决 (1)第一步,jps 查看 java pid (2)第二步,显示线程列表 ps -mp 42 -o THREAD,tid,time (3)第 ...

  7. 生产环境CPU占用飙高问题解决

    1 问题来源与背景 问题背景,项目对外提供查询航班舱位接口,对航信黑屏报文做正则解析返回.由于起初对正则不熟悉,对黑屏报文格式规律不清楚,导致写了大量的长正则表达式,生产环境并发量上来(200/s), ...

  8. XSSFWorkbook导致CPU占用很高

    XSSFWorkbook导致CPU占用很高 将微信支付的账单同步至云存储 业务需求 科普 解决方案 将微信支付的账单同步至云存储 业务需求 https://pay.weixin.qq.com/wiki ...

  9. 软件测试cpu占用高,六个方法解决Win10 CPU占用过高卡顿 亲测有效

    大多数小伙伴的电脑系统都已经升级到最新版的Win10,我就想问一句"卡吗"?最近我发现,Win10有时会出现卡顿现象.一点击查看CPU占用情况,好家伙居然都已经出现红色警戒线了.那 ...

最新文章

  1. PIE SDK打开静止卫星数据
  2. Linux内核如何管理内存
  3. MySQL之Procedure(存储过程)和Function(函数)
  4. 模拟ArrayList底层实现
  5. java二级为什么没题库_为什么刷了那么多二级java试题,却依然提高不了分数?...
  6. jQuery和react实现二维码
  7. Domino服务器以及Notes客户端重新配置的方法
  8. Linux环境安装redis
  9. 【Pycharm IDE】修改字体大小/设置缩略图/设置高亮
  10. 图解TCP/IP(第5版)
  11. 团队作业7——Alpha冲刺之事后诸葛亮
  12. 商标注册证的查询方法
  13. c# distinct用法
  14. [译] 为什么设计师讨厌政治(如何解决)
  15. 2022-2027年中国棉纺织机械行业发展监测及投资战略研究报告
  16. 流式计算、实时计算和离线计算
  17. 假设检验-单样本t检验
  18. hackme1新手教学
  19. 产品项目分析之竞品分析
  20. 一芯FC1178BC/FC1179主控U盘量产修复指南

热门文章

  1. GlusterFS如何解决分布式文件系统的难题?
  2. 大客户市场:阿里云、腾讯云、华为云“贴身肉搏”
  3. MayaDay7模型模块:晶格调整弯曲
  4. .Fill()的使用
  5. HTML的基本结构和语法组成
  6. 新版Edge插件安装位置
  7. 使用Servlet和JDBC实现学生管理系统
  8. StringBoot中String转JSON,JSON转Map或List
  9. Vijos P1391 想越狱的小杉
  10. android实现圆形进度条