Arthas线上环境问题排查定位工具

news2024/12/26 6:54:50

一、Arthas简介

Arthas是alibaba推出的一款JVM性能诊断调优的工具,也可以称之为是线上监控诊断产品,通过全局的视角可以实时的查看应用load、内存、GC、线程的状态信息,并且还可以在不修改应用代码的前提下,对业务问题进行诊断,包括查看方法调用的出参、入参、异常等,监测方法执行耗时,类加载信息等等,大大提升了线上问题的排查效率。

二、Arthas场景

一般情况下,本地开发环境不能访问生产环境,如果在生产环境中遇到了问题,那么就无法使用IDE远程调试,更加糟糕的是在生产环境中调试是不可接受的,因为它会停止所有线程,导致服务暂停。

开发人员可以尝试在测试环境或者预发环境中复现生产环境中的问题,但是某些问题无法在不同的环境中轻松的复现,甚至在重启后就消失了。

如果考虑在代码中添加一些日志帮助解决问题,就必须经历以下阶段:测试、预发、然后生产,这种方法效率比较低,更糟糕的是,该问题可能无法解决,因为一旦JVM重新启动,可能无法复现。

那么Arthas可以解决这些问题,开发人员可以在线解决生产问题,无需JVM启动,无需代码更改,Arthas作为观察者永远不会暂停正在运行的线程。

三、Arthas解决哪些问题?

  • 这个类从哪个jar包加载的,为什么各种报错
  • 我改的代码为什么没有执行到?难道是我没有Commit?分支搞错了?
  • 遇到问题无法在线上debug,难道只能通过加日志在重新发布吗?
  • 线上遇到某个用户的数据处理有问题,但线上同样无法debug,线下无法重现
  • 是否有一个全局视角来查看系统的运行状况?
  • 有什么办法可以监控到JVM的实时运行状态?
  • 怎么快速定位应用的热点,生成火焰图?
  • 怎样直接从JVM内查找某个类的实例?

四、Arthas下载

curl -O https://arthas.aliyun.com/arthas-boot.jar

五、Arthas启动

  • 启动arthas-boot.jar
java -jar arthas-boot.jar
  • 选择监控的应用进程

    • 这个时候会列出所有可监控的应用进程,输入对应的编号即可

    在这里插入图片描述

六、全局监控仪表

  • dashboard

    • dashboard命令,可以实时的显示出所有线程的情况、内存的情况、运行环境信息、cpu占用等情况。

    在这里插入图片描述

  • thread

    • thread命令,可以显示出所有线程信息

    在这里插入图片描述

  • thread id

    • thread 线程对应的ID,可以显示线程的具体信息

    在这里插入图片描述

七、方法级别监控

我们在调优的时候,需要定位到应用的具体方法,所以arthas提供了一套对于方法的监控,但是方法的监控我们需要手动输入很多参数,为了方便,我们就在IDEA中安装arthas idea插件,可以自动生成带参数的命令,只需要复制即可。

1、安装插件

在这里插入图片描述

在这里插入图片描述

2、watch

watch命令用来查看方法的一些具体信息,比如入参、出参、异常等情况。

-n:执行次数

-x:每次调用监控的层级深度

watch com.cy.example.Demo testHandler '{params,returnObj,throwExp}'  -n 5  -x 3 

在这里插入图片描述

3、trace

trace命令用于查看方法的运行耗时

-n:执行次数

trace com.cy.example.Demo testHandler  -n 5 --skipJDKMethod false 

在这里插入图片描述

3、stack

stack命令用于查看该方法在哪被调用了

-n:执行次数

stack com.cy.example.Demo testHandler  -n 5 

在这里插入图片描述

八、类级别监控

1、sc

sc命令:查看JVM已加载的类信息

# 显示JVM已加载的类信息
sc com.cy.example.Demo 

# 打印出类信息
sc -d com.cy.example.Demo

在这里插入图片描述

2、sm

sm命令:查看JVM已加载类的方法信息

# 查看加载类的方法信息
sm com.cy.example.Demo

# 查看加载类的方法详细信息
sm -d com.cy.example.Demo

# 查看加载类的指定方法信息
sm com.cy.example.Demo testHandler

# 查看加载类的指定方法的详细信息
sm -d com.cy.example.Demo testHandler

在这里插入图片描述

在这里插入图片描述

九、线上问题定位

当项目已经上线,出了问题我们需要进行问题定位,可以从以下几点进行查看:

  • 代码版本是否引入正确
  • CPU占用率过高,哪个程序占用过高
  • 死锁的问题

1、反编译

反编译的方式很多,但是大多数都是在开发环境进行反编译,我们需要在线上环境进行反编译,从而能看出我们的代码版本是否引入正确,可能代码版本是1.4,我们引入的是1.3

jad 反编译类名
jad com.cy.example.Demo

在这里插入图片描述

2、CPU占用率

# 展示出CPU占用率从高到低指定个数的线程
thread -n 3

在这里插入图片描述

3、死锁

可以通过命令直接查看所有的死锁

我这里没有写死锁的代码,因此没有死锁

thread -b

在这里插入图片描述

十、线上代码热更新

在不停止线上服务的情况下修改代码

需要注意的是,热更新的字节码文件不能新增属性和方法,并且热更新后原来的类不能恢复

# 通过jad对文件进行反编译,并且输出到其他地方
jad Demo > /usr/NewDemo.java

# 对NewDemo.java进行更改代码

# 使用mc在内存中对NewDemo.java进行编译
mc /usr/NewDemo.java -d /usr

# 热更新
redefine /usr/NewDemo.class

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1829638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

yolo实现大人 小孩 老年人的识别

通过构建人脸检测数据集,实现检测人脸模型的训练 通过构建小孩人脸 大人人脸 老年人人脸的分类数据集,训练分类模型 通过级联人脸检测模型与分类模型,实现图片 视频 摄像头中的人脸检测➕年龄属性判断 python开发语言 pytorch框架 yolo算…

电子设计教程基础篇(电容)

文章目录 前言一、电容原理1.原理2.公式 二、电容种类1.结构1、固定电容2、可变电容3、微调电容 2.介质材料1、气体介质电容1、空气电容2、真空电容3、充气式电容 2、固体介质电容1、无机1、云母电容2、陶瓷电容1、瓷片电容2、独石电容 3、玻璃釉电容(CI&#xff09…

go的netpoll学习

go的运行时调度框架简介 Go的运行时(runtime)中,由调度器管理:goroutine(G)、操作系统线程(M)和逻辑处理器(P)之间的关系 以实现高效的并发执行 当一个gorout…

单例集合:Collection

一.Collection Collection是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的。 一.add添加 1.细节1 如果我们要往List系列集合中添加数据,那么方法永远返回true,因为List系列的是允许元素重复的。 2.细节2 如果要往Set系列集合中添加数据,如果当前要添加元素不…

【redis】Redis的经典使用场景

目录 1.最常见——缓存2.数据共享分布式3.分布式锁4.全局ID5.计数器6.限流7.位统计8.购物车9.用户消息时间线timeline10.消息队列11.抽奖点赞、签到、打卡13.商品标签14.商品筛选15.用户关注、推荐模型16排行榜 1.最常见——缓存 数据类型:string例如:热…

tauri嵌入外部二进制文件,以及sidecar是什么意思?

sidecar是什么意思 有时,为了使应用程序正常运行或防止用户安装额外的依赖项(例如Node.js或Python或者ffmpeg等),你可能需要嵌入依赖的二进制文件,我们将这种二进制文件称为"sidecar",中文意思就…

LabVIEW常用的加密硬件

LabVIEW在工程和科学领域中广泛应用,其中数据保护和程序安全尤为重要。为了确保数据的安全性和完整性,常用的加密硬件设备包括TPM(可信平台模块)、HSM(硬件安全模块)和专用加密芯片。本文将推荐几款常用的加…

[DDR4] DDR 简史

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解DDR4》 存和硬盘,这对电脑的左膀右臂,共同扛起了存储的重任。内存以其超凡的存取速度闻名,但一旦断电,内存中的数据也会消失。它就像我们的工作桌面&…

Python基础用法 之 变量

1.变量的定义 变量的作用:是⽤来保存数据的。定义的语法:变量名 数据值使用:直接使⽤变量名 即可使⽤变量中存储的数据。注意:变量必须先定义后使用。 (即 必须 先存⼊数据 才能 获取数据) 。 # 需求 1, 定义⼀个变量 保存你的名…

(超详细)基于动态顺序表实现简单的通讯录项目

前言: 我们在上一章节用c语言实现了线性表中的的动态顺序表,那么顺序表就只是顺序表吗?当然不是,使用顺序表结构可以实现很多项目,许多项目的数据结构都会用到顺序表,本章节我们就要使用顺序表实现一个简易…

爬虫案例:建设库JS逆向

爬虫流程 1. 确定目标网址和所需内容 https://www.jiansheku.com/search/enterprise/ 只是个学习案例,所以目标就有我自己来选择,企业名称,法定代表人,注册资本,成立日期 2. 对目标网站,进行分析 动态…

win10没有Hyper-v的解决方法

win10没有Hyper-v的解决方法 问题:最近想装下docker,但是在控制面板-程序-启用或关闭Windows功能下找不到Hyper-v节点。 废话不多说,直接上实操教程 1.将下面命令复制到文本文档中,并将文档重命名Hyper.cmd pushd "%~dp0&q…

29.添加录入注入信息界面

上一个内容:28.启动与暂停程序 以 28.启动与暂停程序 它的代码为基础进行修改 效果图: 新建Dialog 给新建的dialog添加空间,如下图 给每个输入框创建一个变量 代码: void CWndAddGame::OnBnClickedButton1() {static TCHAR BASE…

Go如何在本地引用以及发布并引用自定义工具包

如何引用本地自定义工具包 我们首先要准备两个项目,分别为需要引入的工具包和当前项目。 myutils、myproject1. myutils为我们的项目1-工具包 package mypakgeimport "strings"func IsContains(s string) bool {if strings.Contains(s, "a")…

HAL库开发--定时器的配置方式和占空比输出

知不足而奋进 望远山而前行 目录 文章目录 前言 目标 内容 需求 Timer配置 分频系数 Timer编码 总结 前言 定时器(Timer)在嵌入式系统中是一种重要的硬件资源,常用于生成精确的时间延迟、周期性触发事件或产生PWM信号等应用。本文将…

排序算法!

文章目录 插入排序冒泡排序选择排序归并排序希尔排序 提示:本文分析算法复杂度时,默认目标是n个元素升序排序,代码注释已经写好,就不单独拎出来了 插入排序 插入排序就是把待排序序列的第一个元素看作是有序序列,把第…

Internet Download Manager(IDM6.41)软件安装包下载及安装教程

Internet Download Manager有一个智能下载逻辑加速器,具有智能动态文件分割和安全的多部分下载技术,可以加速下载。与其他下载加速器和管理器不同,Internet下载管理器在下载开始之前对文件进行分段,而Internet下载管理器在下载过程…

华为云下Ubuntu20.04中Docker的部署

我想用Docker拉取splash,Docker目前已经无法使用(镜像都在国外)。这导致了 docker pull 命令的失败,原因是timeout。所以我们有必要将docker的源设置在国内,直接用国内的镜像。 1.在华为云下的Ubuntu20.04因为源的原因…

AMD Lisa Su专访:谈与英伟达、Intel竞争 直言Arm不是敌人

AMD CEO Lisa Su(苏姿丰)绝对称得上是芯片届的风云人物,尤其是进入了AI新时代,她的声望达到了十年来最高点。翻看其成长历史,苏姿丰在麻省理工学院获得电气工程博士学位后(在麻省理工学院学习八年半&#x…

【Ardiuno】实验使用OPT语音模块播放语音(图文)

当我们需要在程序中播放语音内容时,就需要使用到语音模块,今天我们就来实验一下使用OPT语音模块来方法语音。 const int voicePin 5; const int voiceBusyPin 18; const int testLEDPin 2;unsigned long pmillis 0;int busyVal 0; …