0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CPU 100%问题怎么排查?有哪些方法?

小林coding 来源:古时的风筝 2024-03-18 17:09 次阅读

首先,先用放之四海而皆准的命令 top,确认一下是不是 Java 进程是罪魁祸首。Java 进程要不然就是个后台任务,要不然就是个 jar 包,比如一个Spring Boot 服务。

刚接触开发那会儿,别的命令都不会,一看到CPU飙升,上来就是一个 top,当top 命令执行完了,也就完了。就像一个举重选手用尽了所有力气,然后就只能呆坐在哪里了。

下面介绍两种后续操作,让我们在执行完 top以后,确定是 Java 进程搞的鬼的情况下,顺利的找出出现问题的方法。

第一种,用系统工具和 JDK 自带的 jstack 工具。第二种,用 Arthas 探测工具。

使用 jstack 工具

第一步,使用 top 找到占用 CPU 最高的 Java 进程

前面说了这一步,就是使用 Top 命令

e35b0f8c-e4f5-11ee-a297-92fbcf53809c.png

使用 top命令发现占用 CPU 99.7% 的线程是 Java 进程,进程 PID 为 13731。

第二步,找到占用 CPU 最高的线程

上一步用 top命令找到了那个 Java 进程。那一个进程中有那么多线程,不可能所有线程都一直占着 CPU 不放,这一步要做的就是揪出这个罪魁祸首,当然有可能不止一个。

接下来,还是用 top命令,只不过加一个参数-Hp ,就是下面这样

top-Hppid

H参数表示要显示线程级别的信息,p则表示指定的pid,也就是进程id。代入前面得到的那个Java进程,完整的命令是这样的

top-Hp13731

执行之后,这个Java进程中占用线程占用 CPU 的情况就列出来了。

e36c8668-e4f5-11ee-a297-92fbcf53809c.png

可以看到占用 CPU 最高的那个线程 PID 为 13756。

第三步,保存线程堆栈信息

这就要用到 JDK 默认提供的一个工具了,叫做 jstack。当你安装了 JDK 之后,在 bin目录下会有一大堆内置的工具,java也是其中之一,还有另外我们可能比较熟悉的 javac

e370ffcc-e4f5-11ee-a297-92fbcf53809c.png

jstack 用于生成 Java 进程的线程快照(thread dump)。线程快照是一个关于 Java 进程中所有线程当前状态的快照,包括每个线程的堆栈信息。通过分析线程快照,可以了解 Java 进程中各个线程的运行状态、锁信息等。

我们用jstack的目的就是将那个占用 CPU 最高的线程的堆栈信息搞下来,然后进一步分析。使用命令 jstack pid > out.log将某个进程的堆栈信息输出到 out.log文件中。

当前 Java 程序的所有线程信息都可以通过 jstack命令查看,我们用jstack命令将第一步找到的 Java 进程的线程栈保存下来。

jstack13731>thread_stack.log

第四步,在线程栈中查找最贵祸首的线程

第二步已经找到了这个罪魁祸首的线程 PID 是 13756。

然后我们将 13756转换为 16 进制的,可以用在线进制转换的网站直接转换,比如 https://tool.oschina.net/hexconvert 这个,转换结果为 0x35bc。

最后,我们在线程栈中,也就是上一步保存的那个 thread_stack.log 文件,在里面查找这个16进制的线程 id (0x35bc)。

e378c7c0-e4f5-11ee-a297-92fbcf53809c.png

然后,我么能看到了我们需要的线程名称、线程状态,哪个方法的哪一行代码消耗了最多的 CPU 都很清楚了。

第二种,Arthas

Arthas 是阿里开源的一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

用 Arthas 查找占用 CPU 最高的方法只是一个开胃小菜,除此之外,它最大的用途是在不改代码、不重启服务的情况下对程序进行动态监控。如果你碰到了线上诡异问题,一定要用 Arthas 尝试找一找问题,开阔一下眼界。

好了,更多的功能到官网 https://arthas.aliyun.com/ 了解吧,接下来就将一下如何用 Arthas 达到前面用 jstack 同样的目的。

安装 Arthas

当然了,要使用 Arthas,你就必须先把它安装到你的目标服务器上,也就是那个出问题的Java服务所在的服务器。

下载 jar 包

curl-Ohttps://arthas.aliyun.com/arthas-boot.jar

启动 Arthas 服务

java-jararthas-boot.jar

启动之后,会列出当前这台服务器上的所有 Java 进程,然后你选择你要排查的那个服务即可。

e37e9448-e4f5-11ee-a297-92fbcf53809c.png

然后出现 arthas@之后表示已经启动,并成功 attach 到目标进程上 。

然后可以输入命令 dashboard看一下实时面板,默认 5 秒刷新一次,在这个面板上能够看到线程、内存堆栈、GC和Runtime的基本信息。如果你用过 VisualVM 的话,就和那个基本一样。

e387ff2e-e4f5-11ee-a297-92fbcf53809c.png

好了,开始用 Arthas 找到导致 CPU 负载过高的问题吧。

找到占用CPU最高的进程

第一步,其实还是用 top命令找到占用 CPU 最高的进程,也就是 Arthas 启动时选择 attach 的那个 Java 进程。

然后 java -jar arthas-boot.jar启动Arthas,并attach 。

找到占用 CPU 最高的线程

执行 thread命令,这个命令会显示所有线程的信息,并且把CPU使用率高的线程排在前面。

这样,一眼就看出来了,第一个线程的 CPU 使用率高达 99% 了,就是它。

e38e6ef4-e4f5-11ee-a297-92fbcf53809c.png

查看堆栈信息

使用 thread ID 获取堆栈信息,其实就是 jstack pid相同的作用。通过前一步看到这个线程的 ID 是18,然后执行 thread 18

e3af5c9a-e4f5-11ee-a297-92fbcf53809c.png

然后直接就看出来了出现问题的位置,TestController.java文件的 high方法的第23行。然后进代码看

com.moonkite.wallpapermanage.controller.TestController.high(TestController.java:23)

这个方法是我故意写的死循环,真实情况当然没有这么明显,还需要针对具体代码认真分析。

总结

高 CPU 占用率这个问题是一种很常见也很典型的线上问题,排查方式只要按上述顺序记下来就基本上没什么问题。

其实还是推荐使用 Arthas,除了它确实功能非常多之外,还有就是在线上场景下,使用 jstack有时会碰到问题,如果这个线程已经忙的一点转圜的余地都没有了,jstack命令可能会执行失败。



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10446

    浏览量

    206571
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    102996

原文标题:面试官:CPU 100% 问题怎么排查?

文章出处:【微信号:小林coding,微信公众号:小林coding】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    使用汇编知识排查疑难问题的方法

    那么,本篇文章,我将再介绍一个使用汇编知识排查疑难问题的方法,希望对大家有所帮助。
    发表于 07-27 10:31 519次阅读

    Linux系统CPU占用率100%的排查思路

    今天浩道跟大家分享linux硬核干货,工作中当你服务器CPU达到100%时,干着急是没有用的,该查问题还得自己去查。本文将给大家罗列排查异常故障思路,并且文末附上相关shell脚本,去实际一番,你会发现原来解决问题的
    的头像 发表于 01-23 10:26 1969次阅读
    Linux系统<b class='flag-5'>CPU</b>占用率<b class='flag-5'>100</b>%的<b class='flag-5'>排查</b>思路

    AD9963一直没有信号输出是什么原因造成的呢?什么排查方法吗?

    DAC一直没有信号输出。 请问可能是什么原因造成这种现象的呢?什么排查方法吗? 望各位大神指教。。。。。。
    发表于 12-22 06:52

    电能质量的测量方法,如何排查电能质量问题?

    电能质量的测量方法如何排查电能质量问题?
    发表于 04-09 06:47

    排查EMI问题的实用性技巧哪些?

    如何减少一个产品在测试室进行最终完整的EMC一致性评估时失败的风险?排查EMI问题的实用性技巧哪些?
    发表于 05-11 06:42

    如何去排查移动通信基站的射频干扰?哪些流程?

    如何去排查移动通信基站的射频干扰?哪些流程?
    发表于 05-24 06:36

    GPIO无法触发中断常规排查方法哪些?

    1、电源域是否打开 2、IOMUX是否设置对 3、是否配置了中断方式,外部电平是否满足条件 4、是否为输入状态 备注:这次分享的是,我们做展锐平台GPIO排查方法,不同平台、不同版本、不同项目都会
    发表于 11-24 16:11

    RRU故障排查指导手册

    1.2.1 排查方法简述:1、检查GPS天馈系统。1)电压排查法:2)电阻测量法3)检查功分器是否接得太多,导致信号太弱,或馈线长度超过120 米,检查有无干放。2、否则
    发表于 08-02 15:31 39次下载

    建立一个方法和套路来对 Load 高问题排查

    讲解 Linux Load 高如何排查的话题属于老生常谈了,但多数文章只是聚焦了几个点,缺少整体排查思路的介绍。所谓 “授人以鱼不如授人以渔"。本文试图建立一个方法和套路,来帮助读者对 Load 高问题
    的头像 发表于 12-28 14:18 5076次阅读
    建立一个<b class='flag-5'>方法</b>和套路来对 Load 高问题<b class='flag-5'>排查</b>

    cpu使用率多少算正常_cpu使用率100怎么办

    本文首先分析了cpu使用率多少算正常,其次阐述了cpu使用率100的解决方法,最后介绍了优化cpu使用率的
    发表于 04-29 09:28 1.2w次阅读

    JVM CPU使用率飙高问题的排查分析过程

    问题现象 排查过程 问题现象 首先,我们一起看看通过 VisualVM 监控到的机器 CPU 使用率图: 如上图所示,在 下午3:45 分之前,CPU 的使用率明显飙高,最高飙到近 100
    的头像 发表于 10-10 16:31 1605次阅读

    网络故障排查思路和处理方法

    网络故障是最容易出现的,且难以解决的问题。本文提供的网络故障排查思路和处理方法,可解决日常工作中大部分网络问题。
    发表于 10-31 09:14 7356次阅读

    分享排查Linux系统CPU占用的一个Shell脚本

    众所周知,Linux系统CPU占用100%这个异常现象还是经常遇到的,因此分析其导致异常原因是解决问题的根本。
    的头像 发表于 09-04 09:17 1054次阅读
    分享<b class='flag-5'>排查</b>Linux系统<b class='flag-5'>CPU</b>占用的一个Shell脚本

    雅马哈YS/YSM系列贴片机故障排查方法

    雅马哈YS/YSM系列贴片机故障排查方法
    的头像 发表于 09-13 10:05 1796次阅读
    雅马哈YS/YSM系列贴片机故障<b class='flag-5'>排查</b><b class='flag-5'>方法</b>

    java内存溢出排查方法

    过程中常见的问题之一,可能导致应用程序崩溃、性能下降甚至系统崩溃。在本文中,将详细介绍如何排查和解决Java内存溢出问题。 一、什么是Java内存溢出 在开始解决Java内存溢出问题之前,首先需要了解Java内存
    的头像 发表于 11-23 14:46 687次阅读