使用Arthas排查解决项目部署后CPU飙高问题
什么是Arthas
Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
是否有一个全局视角来查看系统的运行状况?
有什么办法可以监控到JVM的实时运行状态?
怎么快速定位应用的热点,生成火焰图?
怎样直接从JVM内查找某个类的实例?
Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
本文通过对比传统排查方法和使用Arthas方法进行对比来介绍Arthas工具。
前期准备
首先准备一份Java代码,代码内容很简单,制造一个死循环,使cpu保持在较高的使用率上
import java.util.concurrent.*;
public class CpuDemo {public static void main(String[] args) {ExecutorService threadPool = new ThreadPoolExecutor(1, 1,1L, TimeUnit.SECONDS,new LinkedBlockingQueue<>(3),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());threadPool.submit(() -> {while (true) {compute();}});}private static int compute() {int a = 2048;int b = 1024;return (a + b) * 10;}
}
将CpuDemo.java文件上传至Linux虚拟机中,并进行编译启动。
root@sanguo-virtual-machine:/home# javac CpuDemo.java
root@sanguo-virtual-machine:/home# java CpuDemo
我们可以看到 cpu升高并保持在了一个较高的使用率上
传统排查方式
使用jps命令打印Java进程
可以看到我们刚才启动的CpuDemo,该步骤是确保我们的项目正常启动。使用top -Hp pid 命令可以查看指定进程的线程信息,然后通过shift+p 按cpu使用率进行排序,查看结果。
可以找到高占用 cpu 的线程 id 10776jstack命令打印线程信息
jstack 10764 |grep $(print "%x\n" 10776) -A 30
查看源代码后发现是compute()方法导致。该方法内是有死循环调用,导致 CPU 过高。问题找到。
使用Arthas
- 下载并运行Arthas
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
选择我们要分析的进程
可以使用dashboard命令查看整体的情况
我们可以看到,ID为8的线程对cpu的使用率占用最高,因该是这里出现了问题可以通过 thread ID 的命令查看该线程的相关信息
也可以使用命令thread -n num 命令 查看占用占用资源做多的num个命令
也可以得到相同的结果若是项目处于线上阶段且项目文件较多。可以通过jad命令来查看该文件所在行的问题
热更新代码
在某些项目重启十分繁琐的项目,而又出了bug需要订正的情况下,可以使用redefine命令进行热更新,减少损失。- 使用jad命令反编译出现问题的class
jad --source-only CpuDemo > /home/CpuDemo.java
- 修改问题代码
- 使用redefine命令热更新代码
redefine /home/CpuDemo.class
- 切回刚才在运行的代码后台,发现代码已经更改
- 使用jad命令反编译出现问题的class
更多关于Arthas的功能,可以查看官方文档
Arthas文档
使用Arthas排查解决项目部署后CPU飙高问题相关推荐
- Eclipse复制或修改项目后,把项目部署后发现还是原来的项目名称
Eclipse复制或修改项目后,把项目部署后发现还是原来的项目名称 解决: 到项目根目录打开.setting文件夹,找到"org.eclipse.wst.common.component&q ...
- 通过XShell将linux服务器上的Tomcat下项目部署后,怎样对日志操作来调试
场景 使用XShell将linux服务器上的Tomcat下的项目部署后, 发现项目跑不起来. 此时你想通过查看Tomcat运行的日志来调试. 实现 可以进入到Tomcat下的logs目录下 输入: l ...
- 解决nginx部署后css、js、图片等样式不加载的问题
解决nginx部署后css.js.图片等样式不加载的问题 参考文章: (1)解决nginx部署后css.js.图片等样式不加载的问题 (2)https://www.cnblogs.com/smallf ...
- CPU 飙高问题排查和解决方法
摘要 本文档记录了排查 CPU 飙高问题的处理过程和解决方法,从多个方面进行分析和排查. 问题简述 在一个生产环境中发现 CPU 飙高问题,但是无法确定问题的具体原因. 排查方法 使用 jstack ...
- 使用arthas排查cpu飙高问题
文章目录 一 1. 下载arthas 2. 启动 3. 选择指定jvm进程 4. 筛选线程 5. 日志分析 一 官方文档:https://arthas.aliyun.com/doc 1. 下载arth ...
- 记一次服务器CPU飙高使用率超过100%原因分析(Arthas)
文章目录 背景 一.告警分析 二.原因分析 1.找到java进程 2.进入 Arthas 3. 使用 Arthas 找到CPU占用最高的线程 4.定位原因 5.解决方案 总结 背景 某天下午频繁收到预 ...
- 你要偷偷学会排查线上 CPU 飙高的问题,然后惊艳所有人!
作者 l Hollis 来源 l Hollis(ID:hollischuang) 前段时间我们新上了一个新的应用,因为流量一直不大,集群QPS大概只有5左右,写接口的rt在30ms左右. 因为最近接入 ...
- 生产环境CPU飙高问题解决,记一次完整解决过程
一.发现问题 前段时间我们新上了一个新的应用,因为流量一直不大,集群QPS大概只有5左右,写接口的rt在30ms左右. 因为最近接入了新的业务,业务方给出的数据是日常QPS可以达到2000,大促峰值Q ...
- JVM中如何排查CPU飙高的问题
1.虚拟机对象布局 布局:对象头.实例数据.对齐填充 对象头: Mark Word 8字节,hashcode值.GC分代信息.偏向锁信息: Class Po ...
最新文章
- 搭建lamp环境QA
- 使用window.performance分析web前端性能
- ReSIProcate环境搭建
- java ee无法安装_为什么要导入javax.servlet。*; 安装Java EE仍无法解决 面向Java EE开发人员的Eclipse...
- gis里怎么把两个不同坐标系的图叠在一起_坐标系那些事儿
- list 泛型_带你深挖Java泛型类型擦除以及类型擦除带来的问题
- 基于以太坊的去中心化存储协议Swarm计划在2季度发布1.0版
- 教你使用 IDE/Maven 快速部署 Serverless 应用
- mysql 1539_MySQL:半同步(三)从库端初始化和回调函数
- Win10技巧:如何确定电脑是否适用Hyper-V虚拟机?
- 国外大牛开发者创造出Siri第三方服务器
- 如何将符号保存到php数据库当中并且打印出来!
- Pubg九月十六日服务器维护,绝地求生9月16日更新维护到几点?绝地求生9月16日更新时间公告...
- Web--html认识、标签、基本结构
- 一起用Python做个自动化短视频生成脚本,实现热门视频流水线生产!
- 【electron】应用在线升级
- 计算机视觉的相关会议,计算机视觉相关会议
- 前端——html——html图像
- 3D角色模型很难做?Maya、Zbrush人头建模终极秘笈
- 老公,我们现在无家可归了