2023.07.20 20:01:38线上一个服务发生了CPU过高的告警,

看告警信息当前的CPU使用率已经达到了82.65%,问题已经很严重,赶紧开始排查起来。来复盘下如何排查这类问题,

一、排查方法

1、找到cpu过高的进程ID

收到告警后,第一件事要做的就是找到CPU过高的程序的线程id(pid),可以使用jps或ps -ef |grep java两个命令均可,

1.1、jps

使用jps命令

jps

得到下面的结果

也就是进程ID是6。

再看使用ps的结果

1.2、ps

使用ps命令

ps -ef |grep java

得到下面的结果

可以看到进程ID也是6。

当然除了上面两个命令,还可以使用top,也可以很快找到CPU过高的服务进程ID。

我们已经知道了cpu过高的服务进程ID是6,但仅知道进程ID是无用的,需要进一步知道这个进程中哪些线程占用CPU过高。

2、找到cpu过高的线程ID

这里使用的是top命令

top -Hp 6

得到的结果如下

可以看到线程1110 1125 1112 1121等占用CPU过高,基本都在80%,基本可以断定就是这些线程在占用CPU。

找到占用CPU过高的线程后,就要看下相应的堆栈信息。

1.3、打印进程堆栈

使用jstack命令,jstack命令可以打印出进程的堆栈,通过堆栈信息可以分析到线程的执行情况,

jstack -l 6

可以看到很多类似这样的信息,这些信息中有一个很重要的那就是nid=0x11,这个是代表的线程ID,聪明的你也一定知道这里是16进制,和刚才使用top -Hp命令看到的不一样,那里是10进制的。

为了找到线程占用cpu过高的堆栈,需要把线程ID做一次进制转换,既由10进制转换为16进制,

例,1110--》0x456    1125--》0x465

以0x465为例,在堆栈中查找相应的线程堆栈,

1.4、查找线程堆栈

使用0x465查找其对应的线程堆栈

可以看到线程0x465的线程状态是RUNNABLE,而且看到了很多正则的调用,继续往下看,找到了调用的代码,

最后分析是由于死循环引起的线程占用CPU过高。

上面是我把文件下载下来进行的查找,那如何生成堆栈文件,可以使用下面的命令

jstack -l 6 > dump.txt

生成后下载到本地即可。

如果线上环境无法下载,则只能通过命令进行查找

jstack -l 6 | grep -A 10 0x465

这样便可以看到相应的内容了。

二、fastthread

有没有觉得使用jstack命令导出文件后自己分析很麻烦,没事有工具,可以使用fastthread。

其网址是:https://fastthread.io/

将jstack或者其他工具dump的堆栈文件上传到该网站同样可以分析出结果。

将刚才的文件上传后,得到分析报告,由于是分析CPU过高,重点看cpu threads即可。

可以看到nativeId:1125即对应top -Hp出的线程ID,这里fastThread已经进行了进制转换,无需手动操作了,很贴心。点击查看完整的堆栈信息即可分析出相应的问题。

三、总结

一般程序CPU过高,大多数和死循环有关,分析此类问题的一般步骤是,

1、使用jps/ps -ef |grep java/top等命令找到进程ID,即pid;

2、使用top -Hp pid 找到进程中占用CUP的线程ID;

3、使用jstack打印堆栈;

4、使用线程ID在堆栈中找到对应的线程堆栈;

5、分析线程堆栈,找到问题;

参考:

(7条消息) jstack命令解析_fightingD&W的博客-CSDN博客

Linux命令之Grep——文本搜索 - 阅读清单 - 腾讯云开发者社区-腾讯云 (tencent.com)

推荐阅读

因为一条DDL,差点搞挂整个系统,这次真的长了教训

一次性掌握innodb引擎如何解决幻读和不可重复读

花了半天时间,使用spring-boot实现动态数据源,切换自如

记录一次线上服务CPU飙高问题的更多相关文章

  1. Linux(2)---记录一次线上服务 CPU 100%的排查过程

    Linux(2)---记录一次线上服务 CPU 100%的排查过程 当时产生CPU飙升接近100%的原因是因为项目中的websocket时时断开又重连导致CPU飙升接近100% .如何排查的呢 是通过 ...

  2. 记一次线上服务CPU 100%的处理过程

    告警 正在开会,突然钉钉告警声响个不停,同时市场人员反馈客户在投诉系统登不进了,报504错误.查看钉钉上的告警信息,几台业务服务器节点全部报CPU超过告警阈值,达100%. 赶紧从会上下来,SSH登录 ...

  3. 线上服务器CPU彪高的调试方式

    原文内容来自于LZ(楼主)的印象笔记,如出现排版异常或图片丢失等问题,可查看当前链接:https://app.yinxiang.com/shard/s17/nl/19391737/2fee7b91-f ...

  4. 线上服务 CPU 100%?一键定位 so easy!

      转自:  https://my.oschina.net/leejun2005/blog/1524687   摘要: 本文主要针对 Java 服务而言 0.背景 经常做后端服务开发的同学,或多或少都 ...

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

    功能问题,通过日志,单步调试相对比较好定位. 性能问题,例如线上服务器CPU100%,如何找到相关服务,如何定位问题代码,更考验技术人的功底. 58到家架构部,运维部,58速运技术部联合进行了一次线上 ...

  6. 线上服务CPU100%问题快速定位实战--转

    来自微信公众号 架构师之路 功能问题,通过日志,单步调试相对比较好定位. 性能问题,例如线上服务器CPU100%,如何找到相关服务,如何定位问题代码,更考验技术人的功底. 58到家架构部,运维部,58 ...

  7. java进程CPU飙高

    因为这段时间一直在弄监控,但是工作还是在进行中 因为机器不多,所以今天早上巡检了一下,看到一台生产机器上的CPU飙高 top

  8. 你要偷偷学会排查线上CPU飙高的问题,然后惊艳所有人!

    GitHub 20k Star 的Java工程师成神之路,不来了解一下吗! GitHub 20k Star 的Java工程师成神之路,真的不来了解一下吗! GitHub 20k Star 的Java工 ...

  9. 一次线上服务高 CPU 占用优化实践 (转)

    线上有一个非常繁忙的服务的 JVM 进程 CPU 经常跑到 100% 以上,下面写了一下排查的过程.通过阅读这篇文章你会了解到下面这些知识. Java 程序 CPU 占用高的排查思路 可能造成线上服务 ...

  10. 线上服务内存OOM问题定位[转自58沈剑]

    相信大家都有感触,线上服务内存OOM的问题,是最难定位的问题,不过归根结底,最常见的原因: 本身资源不够 申请的太多 资源耗尽 58到家架构部,运维部,58速运技术部联合进行了一次线上服务内存OOM问 ...

随机推荐

  1. Python_13 接口测试openpyxl和表操作

    一.openpyxl 安装   pip install openpyxl  在Terminal中输入 excel操作步骤 找到目标excel 打开 读取数据.编辑excel单元格 保存 关闭 open ...

  2. [Pytorch框架] 4.2.1 使用Visdom在 PyTorch 中进行可视化

    文章目录 4.2.1 使用Visdom在 PyTorch 中进行可视化 安装 坑 基本概念 Environments Panes VIEW 可视化接口 使用 绘制简单的图形 更新损失函数 import ...

  3. LeetCode 周赛 344(2023/05/07)手写递归函数的固定套路

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 今天下午有力扣杯战队赛,不知道官方是不是故意调低早上周赛难度给选手们练练手. 往期周赛回 ...

  4. 集线程池应用、多次HttpWebRequest请求,自动切换账号等等的移动信息查询软件

    具体内容就不说了,只是自己留着未来好找而已 主窗体: using System; using System.Collections.Generic; using System.ComponentMod ...

  5. Git&GitHub简介与入手(三)

    五.eclipse中的git使用 1.eclipse中本地库操作 (检测显示创建成功): (设置本地库范围签名): (一些git里的图标,保存着不同内容): https://github.com/gi ...

  6. 2023-02-20:小A认为如果在数组中有一个数出现了至少k次, 且这个数是该数组的众数,即出现次数最多的数之一, 那么这个数组被该数所支配, 显然当k比较大的时候,有些数组不被任何数所支配。 现在

    2023-02-20:小A认为如果在数组中有一个数出现了至少k次, 且这个数是该数组的众数,即出现次数最多的数之一, 那么这个数组被该数所支配, 显然当k比较大的时候,有些数组不被任何数所支配. 现在 ...

  7. 2021-01-21:java中,HashMap的读流程是什么?

    福哥答案2020-01-21: jdk1.7读流程:1.key是否为空值null,如果为空,直接遍历table[0]链表,寻找key==null键.调用的是getForNullKey()方法.如下:1 ...

  8. 2020-01-16:我截获了登录token的话,是不是就获得了登录状态,这样就不安全了。如何保证安全?

    福哥答案2020-01-06:[知乎答案:](https://www.zhihu.com/question/439602796)首先,Token 一般放在 Header 或者 Cookies 中,Ht ...

  9. 解决:django.db.utils.OperationalError: no such table: auth_user

    解决:django.db.utils.OperationalError: no such table: auth_user 我们在创建Django项目的时候已经创建这个表了,表一般都保存在轻量级数据库 ...

  10. GPT大语言模型Alpaca-lora本地化部署实践【大语言模型实践一】

    模型介绍 Alpaca模型是斯坦福大学研发的LLM(Large Language Model,大语言)开源模型,是一个在52K指令上从LLaMA 7B(Meta公司开源的7B)模型微调而来,具有70亿 ...