记录一次线上服务CPU飙高问题
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)
推荐阅读
花了半天时间,使用spring-boot实现动态数据源,切换自如

记录一次线上服务CPU飙高问题的更多相关文章
- Linux(2)---记录一次线上服务 CPU 100%的排查过程
Linux(2)---记录一次线上服务 CPU 100%的排查过程 当时产生CPU飙升接近100%的原因是因为项目中的websocket时时断开又重连导致CPU飙升接近100% .如何排查的呢 是通过 ...
- 记一次线上服务CPU 100%的处理过程
告警 正在开会,突然钉钉告警声响个不停,同时市场人员反馈客户在投诉系统登不进了,报504错误.查看钉钉上的告警信息,几台业务服务器节点全部报CPU超过告警阈值,达100%. 赶紧从会上下来,SSH登录 ...
- 线上服务器CPU彪高的调试方式
原文内容来自于LZ(楼主)的印象笔记,如出现排版异常或图片丢失等问题,可查看当前链接:https://app.yinxiang.com/shard/s17/nl/19391737/2fee7b91-f ...
- 线上服务 CPU 100%?一键定位 so easy!
转自: https://my.oschina.net/leejun2005/blog/1524687 摘要: 本文主要针对 Java 服务而言 0.背景 经常做后端服务开发的同学,或多或少都 ...
- 线上服务CPU100%问题快速定位实战
功能问题,通过日志,单步调试相对比较好定位. 性能问题,例如线上服务器CPU100%,如何找到相关服务,如何定位问题代码,更考验技术人的功底. 58到家架构部,运维部,58速运技术部联合进行了一次线上 ...
- 线上服务CPU100%问题快速定位实战--转
来自微信公众号 架构师之路 功能问题,通过日志,单步调试相对比较好定位. 性能问题,例如线上服务器CPU100%,如何找到相关服务,如何定位问题代码,更考验技术人的功底. 58到家架构部,运维部,58 ...
- java进程CPU飙高
因为这段时间一直在弄监控,但是工作还是在进行中 因为机器不多,所以今天早上巡检了一下,看到一台生产机器上的CPU飙高 top
- 你要偷偷学会排查线上CPU飙高的问题,然后惊艳所有人!
GitHub 20k Star 的Java工程师成神之路,不来了解一下吗! GitHub 20k Star 的Java工程师成神之路,真的不来了解一下吗! GitHub 20k Star 的Java工 ...
- 一次线上服务高 CPU 占用优化实践 (转)
线上有一个非常繁忙的服务的 JVM 进程 CPU 经常跑到 100% 以上,下面写了一下排查的过程.通过阅读这篇文章你会了解到下面这些知识. Java 程序 CPU 占用高的排查思路 可能造成线上服务 ...
- 线上服务内存OOM问题定位[转自58沈剑]
相信大家都有感触,线上服务内存OOM的问题,是最难定位的问题,不过归根结底,最常见的原因: 本身资源不够 申请的太多 资源耗尽 58到家架构部,运维部,58速运技术部联合进行了一次线上服务内存OOM问 ...
随机推荐
- 进程间通信WebSocket 服务端未启动时,客户端重连报错
当WebSocket服务端未启动时,我们在客户端申请连接,会报 System.Net.Sockets.SocketException 异常. 当然,我们调试时异常设置默认是不勾选这个的.所以不影响正常 ...
- Windows屏幕解锁服务原理及实现(1)
https://github.com/zk2013/windows_remote_lock_unlock_screen 将生成的DLL注册至注册表 HKEY_LOCAL_MACHINE\SOFTWAR ...
- 【解决办法】配置banner信息时卡死/无反应,以及正确配置
环境: 工具:锐捷EVE模拟器 远程工具:SecureCRT 系统版本:Windows 10 问题描述 描述:在配置登录 banner 提示警告信息时,将 "^" 符号放到了警告信 ...
- 粘包/拆包问题一直都存在,只是到TCP就拆不动了。
OSI open-system-Interconnection TCP/IP 5层协议栈 应用层和操作系统的边界是 系统调用 ,对应到网络编程是socket api TCP/UDP 概况 TCP粘包问 ...
- js 获取 ajax返回数据及处理
$.ajax({ url: "http://xiaocui.dgoods.cn/app/index.php?i=5&c=entry&do=check&m=stonef ...
- vue中粘贴板clipboard的使用方法
一.npm安装clipboard npm install clipboard --save 二.页面结构 <span id="copyTarget">{{targetC ...
- cnpm : 无法加载文件 D:\nodejs\node_global\cnpm.ps1,因为在此系统上禁止运行 脚本。
错误信息: cnpm : 无法加载文件 D:\nodejs\node_global\cnpm.ps1,因为在此系统上禁止运行 脚本.有关详细信息,请参阅 https:/go.microsoft.com ...
- Redis内存兜底策略——内存淘汰及回收机制
Redis内存兜底策略--内存淘汰及回收机制 Redis内存淘汰及回收策略都是Redis内存优化兜底的策略,那它们是如何进行兜底的呢?先来说明一下什么是内存淘汰和内存回收策略: Redis内存淘汰:当 ...
- Odoo-----计算字段、depnds,onchange 机制、模型约束
1 计算字段和默认值问题 字段通过调用模型的方法的实时计算获得,一般都是 compute 属性为主的方法,这个计算方法通过计算self每条记录设置的的值,self 是一个有记录的有序集合,支持py ...
- Java基础之基础语法与面向对象
前言 小知识 Java由Sun公司于1995年推出,2009年Sun公司被Oracle公司收购,取得Java的版权 Java之父:James Gosling(詹姆斯·高斯林) 专业术语 JDK:jav ...