线上服务CPU100%问题快速定位实战

开发 开发工具
CPU异常,如何快速定位哪个服务、哪个线程、哪段代码的问题?下面,我们进行了一次线上服务CPU问题排查实战演练。

功能问题,通过日志,单步调试相对比较好定位。

性能问题,例如线上服务器CPU100%,如何找到相关服务,如何定位问题代码,更考验技术人的功底。

58到家架构部,运维部,58速运技术部联合进行了一次线上服务CPU问题排查实战演练,同学们反馈有收获,特将实战演练的试题和答案公布出来,希望对大家也有帮助。

题目

某服务器上部署了若干tomcat实例,即若干垂直切分的Java站点服务,以及若干Java微服务,突然收到运维的CPU异常告警。

问:如何定位是哪个服务进程导致CPU过载,哪个线程导致CPU过载,哪段代码导致CPU过载?

步骤一、找到最耗CPU的进程

工具:top

方法:

  • 执行top -c ,显示进程运行信息列表
  • 键入P (大写p),进程按照CPU使用率排序

图示:

如上图,最耗CPU的进程PID为10765

步骤二:找到最耗CPU的线程

工具:top

方法:

  • top -Hp 10765 ,显示一个进程的线程运行信息列表
  • 键入P (大写p),线程按照CPU使用率排序

图示:

最耗CPU的线程PID

如上图,进程10765内,最耗CPU的线程PID为10804

步骤三:将线程PID转化为16进制

工具:printf

方法:

  1. printf “%x\n” 10804 

图示:

如上图,10804对应的16进制是0x2a34,当然,这一步可以用计算器。

之所以要转化为16进制,是因为堆栈里,线程id是用16进制表示的。

步骤四:查看堆栈,找到线程在干嘛

工具:pstack/jstack/grep

方法:

  1. jstack 10765 | grep ‘0x2a34’ -C5 --color 

打印进程堆栈

通过线程id,过滤得到线程堆栈

图示:

如上图,找到了耗CPU高的线程对应的线程名称“AsyncLogger-1”,以及看到了该线程正在执行代码的堆栈。

希望对经常进行线上CPU问题排查的同学有帮助,如果有更好的实践,也欢迎分享。

【本文为51CTO专栏作者“58沈剑”原创稿件,转载请联系原作者】

戳这里,看该作者更多好文

责任编辑:赵宁宁 来源: 51CTO专栏
相关推荐

2023-03-20 17:27:54

Cpukafka

2022-12-09 14:40:16

CPU进程快速定位

2021-06-04 15:58:53

CPU排查OOM

2024-02-26 08:21:51

CPUkafka死循环

2019-06-24 08:17:55

CPUFullGCJava

2010-09-03 12:04:52

cpu100%

2019-06-12 15:07:24

JVMStackHeap

2019-07-24 11:52:11

CPU服务器面试官

2019-11-05 08:24:34

JavaOOM快速定位

2017-08-21 23:50:45

线上内存OOM

2017-04-07 14:00:02

程序猿SQL ServerCPU

2017-08-18 22:40:33

线上线程备份

2023-03-06 08:41:32

CPU使用率排查

2016-09-21 12:26:47

Windows 10CPU禁用

2019-04-15 15:22:47

CPU代码Top

2023-02-26 10:18:24

数据库SQL语句

2020-07-08 09:50:37

Java内存快速定位

2023-08-24 22:13:31

2017-08-08 15:05:55

工具定位数据库

2021-03-05 00:06:12

Docker容器内存
点赞
收藏

51CTO技术栈公众号