阿里 arthas 使用介绍

2023-05-16

背景:

一次线上问题的综合排查排查,两个相同的系统的某个模块,数据量更少的系统查询更慢。
先说下整体思路:

  1. 查看系统整理负载,网络有100左右毫秒的延迟,看起来影响不大
  2. 查看正序运行整体情况,一次查询会经历3次FGC,有问题,解决后虽然会快一些但是还是有点慢
  3. 跟踪调用栈,发现有点在获查询结果的时候特别慢
  4. 排查是否有mysql慢查询(定义为1秒以上的查询),结果是没有
  5. 通过arthas发现调用了20多次查询,每次网络延迟100ms,加起来就有2s了,定位出问题。

这样看起来arthas真的很强大,它不仅仅能处理上述问题,还能....

  • 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  • 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  • 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  • 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  • 是否有一个全局视角来查看系统的运行状况?
  • 有什么办法可以监控到JVM的实时运行状态?
  • 代码出现异常,怎么能获取请求参数和返回值。

Arthas到底是什么

Arthas 是Alibaba开源的Java诊断工具,采用命令行交互模式,提供了丰富的功能,是排查jvm相关问题的利器。
在逛github时,发现了这款利器,深入了解之后,简直惊为天人。下面先列举一下它能做的一些事情:

  • 提供性能看板,包括线程、cpu、内存等信息,并且会定时的刷新。
  • 根据各种条件查看线程快照。比如找出cpu占用率最高的n个线程等
  • 输出jvm的各种信息,如gc算法、jdk版本、ClassPath等
  • 查看/设置sysprop和sysenv
  • 查看某个类的静态属性,也可以通过ognl语法执行一些语句
  • 查看已加载的类的详细信息,比如这个类从哪个jar包加载的。也可以查看类的方法的信息
  • dump某个类的字节码到指定目录
  • 直接反编译指定的类
  • 查看类加载器的一些信息
  • 可以让jvm重新加载某个类
  • 监控方法的执行,同时可以获取到执行的入参、出参以及抛出的异常
  • 追踪方法执行的调用栈,以及各个方法的调用时间

Arthas运行原理

 

Arthas命令列表

 

athas的各个命令

sc 和 sm

  • 通过sc可以查看已加载类的相关信息,比如该类是从哪个jar包加载的,被哪个类加载器加载的,以及是否是接口等等。
  • sm查看已加载类的方法详情。

dashboard

进入当前系统的实时数据面板,按 ctrl+c 退出。这个面板会实时刷新,其中包括线程信息、内存信息、gc信息、还有一些运行时的数据。
另外,当运行在Ali-tomcat时,会显示当前tomcat的实时信息,如HTTP请求的qps, rt, 错误数, 线程池信息等等。

 

thread

通过thread命令可以查看当前jvm进程的线程详情。可以查看线程的cpu使用时间占比,通过指定各种参数可以找出最忙的几个线程,以及阻塞其他线程的线程。具体如何使用这里不多做介绍,大家可以去看arthas的官方文档。

当前最忙的前N个线程并打印堆栈
thread -i 5000 
thread -i 5000 

 

jvm

通过jvm命令直接输出当前jvm的各种信息。

getstatic

通过getstatic命令可以方便的查看类的静态属性。

getstatic demo.MahtGame random

 

sysprop和sysenv

  • 通过sysprop可以查看所有的系统变量,也可以设置某个系统变量。
  • 同理,通过sysenv可以查看所有的操作系统环境变量,也可以查看设置某个环境变量。

ognl

执行ognl表达式,可执行任意代码

Ognl @demo.MathGame@random

 

动态修改日志级别

  1. 通过ognl获取对应类上的logger对象实现类
  2. sc命令来查看具体从哪个jar包里加载的,sc -d org.apache.log4j.Logger
  3. 通过ognl修改日志级别

 

更详细的介绍:https://github.com/alibaba/arthas/issues/11

dump

将已加载类的字节码dump到本地磁盘上。

jad

有时我们经常会不确定线上或者测试环境的包是否是我们修改过的,这时候就可以通过jad反编译来看下。

反编译指定已加载类的源码,jad demo.MathGame

 

classloader

将 JVM 中所有的classloader的信息统计出来,并可以展示继承树,urls等。

redafine

该命令可以加载外部的.class文件,然后覆盖 jvm已加载的类。注意,这个命令不一定都能覆盖成功,如果添加了新的field,就不会加载成功。

关于redefine,arthas的github上有个非常经典的userCase:

https://github.com/alibaba/arthas/issues/263

动态更新代码,不用重启jvm

 

watch

  • 让你能方便的观察到指定方法的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 OGNL 表达式进行对应变量的查看。
  • watch的使用姿势比较丰富,可以在四个不同的场景观察方法的执行。比如方法调用之前、方法调用之后、方法异常之后、方法结束之后。默认观察的是方法结束之后。
  • 如果观察的是方法结束之后的场景,由于入参可能在执行方法时被改变,所以此时输出的可能不是真正的入参。因此,要看真正的入参,要看方法调用之前的,也就是加上-b的参数。
  • 另外,使用-b参数观察的话,则观察不到方法返回的结果以及抛出的异常了。
参数名称参数说明
class-pattern类名表达式匹配
method-pattern方法名表达式匹配
express观察表达式
condition-express条件表达式
[b]在方法调用之前观察
[e]在方法异常之后观察
[s]在方法返回之后观察
[f]在方法结束之后(正常返回和异常返回)观察
[E]开启正则表达式匹配,默认为通配符匹配
[x:]指定输出结果的属性遍历深度,默认为 1
[n:]只执行n次,默认会不断输出,除非用户按下cltr+c
# 观察CommonTest的test方法
# 输出 入参、返回结果、抛出的异常 —— 输出的内容可以动态调整
# 后面跟着的是 条件表达式,表示耗时超过10ms才输出
# -n 表示只执行一次,-x表示 入参和返回结果的展开层次为5层
watch *.CommonTest test "{params,returnObj,throwExp}" '#cost>10' -x 5 -n 1

# 耗时大于10ms并且第一个参数等于1才输出
watch *.CommonTest test "{params,returnObj,throwExp}" '#cost>10 && params[0]==1' -x 5 -n 1
# 第一个参数大于1 并且第二个参数等于hello才输出
watch *.CommonTest test "{params,returnObj,throwExp}" 'params[0]>1 && params[1]=="hello"' -x 5 -n 1
# 第一个参数小于5或者第二个参数等于"world"就输出
watch *.CommonTest test "{params,returnObj,throwExp}" 'params[0]<5 || params[1]=="wolrd"' -x 5 -n 1
# 第一个参数的name字段等于world时才输出。
# 由于在方法执行过程中参数的name属性可能发生改变,因此加上-b才能观察到真正的入参
watch -b *.CommonTest test "{params,returnObj,throwExp}" 'params[0].name=="wolrd"' -x 5 -n 1

# 由于同时指定了-s和-b,所以方法被调用一次,就会输出2次结果(两个场景分开输出),分别是方法被调用前,和返回之后
# 注意,这里如果-n只设置成1,那么只会输出-b对应的输出,-s对应的输出由于没有次数了就无法输出了
watch *.CommonTest test '{params,returnObj,throwExp}' -x 5 -n 2 -s -b

在填写条件表达式时要注意一点,条件表达式中的params默认都是获取的方法执行完后的参数信息,比如入参a的属性name方法执行前是"hello",在方法执行后变成了"world",那么条件表达式传入'params[0].name="hello"'将不会输出,只有填入'params[0].name="hello"'才可以匹配上。这点对于后面的trace、stack命令也是一样的。

查看方法输入参数/返回值/异常信息,watch demo.MathGame primeFactors "{params,returnObj}" -x 2
 

monitor

monitor命令可以监控方法的执行情况。比如调用成功次数,失败次数,失败率、平均执行时间等等。默认120秒输出一次,也就是说,当我们输入monitor命令之后,每120秒就会输出一次统计结果。

通过-c参数可以修改输出频率,支持通配符和正则表达式。
monitor -c 5 demo.MathGame primeFactors
 

trace

方法内部调用路径,并输出方法路径上的每个节点上耗时,tt命令会记录每次方法调用的各种信息。它和watch有些相似但是它能记录下各个时间点的调用信息,之后随时查看,甚至replay这次调用。

trace demo.MathGame run

 

tt

timetunnel,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测,同时可回放该方法调用
tt -t demo.MathGame primeFactors

 

直接重放请求参数

1.使用tt –t 类名次 方法名次
2.tt –play -i 1000

另外介绍几个我经常用的工具,jmap,jstat,jstack,dump这些基本的就不介绍了。

Tprofiler

TProfiler是一个可以在生产环境长期使用的性能分析工具.它同时支持剖析和采样两种方式,记录方法执行的时间和次数,生成方法热点 对象创建热点 线程状态分析等数据,为查找系统性能瓶颈提供数据支持.

TProfiler在JVM启动时把时间采集程序注入到字节码中,整个过程无需修改应用源码.运行时会把数据写到日志文件,一般情况下每小时输出的日志小于50M.

show-busy-java-threads

  • 查找cpu性能消耗过程
    top命令找出消耗CPU高的Java进程及其线程id:
    开启线程显示模式(top -H,或是打开top后按H)
    按CPU使用率排序(top缺省是按CPU使用降序,已经合要求;打开top后按P可以显式指定按CPU使用降序)
    记下Java进程id及其CPU高的线程id
  • 查看消耗CPU高的线程栈:
    用进程id作为参数,jstack出有问题的Java进程
    手动转换线程id成十六进制(可以用printf %x 1234)
    在jstack输出中查找十六进制的线程id(可以用vim的查找功能/0x1234,或是grep 0x1234 -A 20)
  • 查看对应的线程栈,分析问题
    查问题时,会要多次上面的操作以分析确定问题,这个过程太繁琐太慢了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

阿里 arthas 使用介绍 的相关文章

  • Java Timer使用介绍

    x1f680 优质资源分享 x1f680 学习路线指引 xff08 点击解锁 xff09 知识定位人群定位 x1f9e1 Python实战微信订餐小程序 x1f9e1 进阶级本课程是python flask 43 微信小程序的完美结合 xf
  • 阿里Arthas(阿尔赛斯)-java诊断工具使用入门

    1 下载官方测试程序启动 doda 64 host166 game curl O https arthas aliyun com math game jar doda 64 host166 game java jar math game j
  • 阿里 arthas 使用介绍

    背景 xff1a 一次线上问题的综合排查排查 xff0c 两个相同的系统的某个模块 xff0c 数据量更少的系统查询更慢 先说下整体思路 xff1a 查看系统整理负载 xff0c 网络有100左右毫秒的延迟 xff0c 看起来影响不大查看正
  • Linux防火墙——iptables以及firewalld的使用介绍

    本文基于Linux上CentOS 7版本配合iptables iptables services firewalld等服务进行演示 一 防火墙概念以及Netfilter机制介绍 1 概念 2 防火墙两大类型 3 Netfilter功能 二
  • CAS新版本(6.0-RC4)使用介绍(一)

    新版本CAS介绍 xff08 6 0 RC4 xff09 简介 Central Authentication Service CAS xff0c 通常称为CAS CAS是一种针对Web的企业多语言单点登录解决方案 xff0c 并尝试成为您的
  • 性能测试工具iPerf和Netperf使用介绍

    实验教程 任务目的 1 掌握iPerf的功能和基本命令 xff0c 利用iPerf测试主机之间的吞吐量 xff0c 熟悉基本命令参数的作用 xff0c 为后期实验做准备 2 掌握Netperf的功能和基本命令 xff0c 能够根据不同的测试
  • Python日志系统logging使用介绍

    日志记录对于软件开发调试和运行都非常重要 Python标准库提供了一个日志记录系统 xff0c 可以很方便的在python项目中添加日志记录 本文将详细介绍如何使用python的 logging 模块来记录日志 目录 基础使用日志级别基本配
  • explian使用介绍

    1 xff09 id列数字越大越先执行 xff0c 如果说数字一样大 xff0c 那么就从上往下依次执行 xff0c id列为null的就表是这是一个结果集 xff0c 不需要使用它来进行查询 2 xff09 select type列常见的
  • rosbag使用介绍

    rosbag 1 录制包 span class token comment 录制所有的topic span rosbag record span class token operator span a 2 查看包的信息 rosbag inf
  • alsa amixer 使用介绍

    alsa utils 提供的工具中 xff0c arecord 可以用来录音 xff0c aplay 可以用来播放 xff0c amixer 可以用来控制音量 增益等 amixer controls numid 61 34 iface 61
  • OKHttpUtils使用介绍

    一 xff0c 概述 在上一篇blog的末尾讲到了OKHttp使用时的缺点 xff0c 和对OKHttp封装的必要性 在github上有很多对OKHttp封装的优秀框架 xff0c 其首推的就是hongyang大神的OKHttpUtils
  • arthas启动-服务端启动流程

    从前面介绍的arthas启动 agent初始化一文中我们看到了AgentBootstrap bind函数 该函数的实现就是使用反射创建一个ArthasBootstrap对象 传入关键信息Instrumentation 以及启动参数 我们就关
  • arthas的trace、watch、tt、profiler命令的使用

    arthas的trace watch tt profiler命令的使用
  • Spring Boot Admin 集成诊断利器 Arthas 实践

    简介 Arthas 是 Alibaba 开源的 Java 诊断工具 具有实时查看系统的运行状况 查看函数调用参数 返回值和异常 在线热更新代码 秒解决类冲突问题 定位类加载路径 生成热点 通过网页诊断线上应用 如今在各大厂都有广泛应用 也延
  • 【Arthas】Arthas Command处理流程

    1 概述 转载 Arthas Command处理流程 2 开篇 这篇文章主要是为了分析Arthas的命令的执行过程 整体过程包括任务的创建和任务的执行 arthas的命令都是实现统一的接口 对外通过process方法进行调用 public
  • 【Arthas】Arthas mc内存动态编译原理

    1 概述 转载 Arthas mc内存动态编译原理 2 开篇 Arthas支持通过mc命令进行java文件的内存动态编译 mc Memory Compiler 内存编译器 编译 java文件生成 class 从JDK1 6开始引入了Java
  • 四、Arthas

    四 Arthas 1 安装 卸载 1 Arthas支持在Linux Unix Mac等平台上一键安装 请复制以下内容 并粘贴到命令行中 敲回车执行即可 curl L https arthas aliyun com install sh sh
  • 使用Arthas排查问题

    简介 Arthas 是Alibaba开源的Java诊断工具 深受开发者喜爱 当你遇到以下类似问题而束手无策时 Arthas可以帮助你解决 这个类从哪个 jar 包加载的 为什么会报各种类相关的 Exception 我改的代码为什么没有执行到
  • 【Arthas】Arthas retransform动态重新加载类

    1 概述 转载 Arthas retransform动态重新加载类 2 开篇 Arthas提供retransform命令来重新加载已加载的类 通过该命令可以在有限制的反编译已加载的类重新修改后生成class文件重新加载 在测试环境中可以尝试
  • 【Arthas】Arthas 类查找和反编译原理

    1 概述 转载 Arthas 类查找和反编译原理 2 开篇 Arthas支持通过类相关的操作命令 包括sc sm jad等 sc Search Class 命令搜索出所有已经加载到 JVM 中的 Class 信息 sm Search Met

随机推荐

  • 图谱实战 | 京东基于时序知识图谱的问答系统

    转载公众号 DataFunSummit 分享嘉宾 xff1a 商超博士 京东硅谷研究院 研究员 编辑整理 xff1a 张存旺 北航杭州创新研究院 出品平台 xff1a DataFunTalk 导读 xff1a 本文将分享Temporal K
  • 肖仰华 | 基于知识图谱的问答系统

    本文转载自公众号知识工场 本文整理自复旦大学知识工场肖仰华教授在VLDB 2017 会议上的论文报告 xff0c 题目为 KBQA Learning Question Answering over QA Corpora and Knowle
  • 研讨会 | 知识图谱前沿技术课程暨学术研讨会(武汉大学站)

    知识图谱作为大数据时代重要的知识表示方式之一 xff0c 已经成为人工智能领域的一个重要支撑 4月 28日 xff0c 武汉大学信息集成与应用实验室 与 复旦大学知识工场实验室 联合举办 知识图谱前沿技术课程暨学术研讨会 xff0c 将结合
  • jdbc中Statement和PreparedStatement有什么区别?哪个性能更好?

    Statement和PreparedStatement的功能主要是对sql语句的执行 区别 xff08 1 xff09 Statement每执行一条sql语句就需要生成一条执行计划 xff0c 执行100条就需要100条执行计划Prepar
  • redis的特性

    redis的特性 承接上文redis入门篇 xff0c 本文具体介绍一下redis的特性 xff0c 以及与另外一个nosql数据库memcached的对比 一 redis的优点 根据上文 xff0c 我们知道redis的如下特性成为了他的
  • Ubuntu22.04安装windows字体

    找到C Windows目录 xff0c 将其中的Fonts文件夹拷贝至ubuntu中 将该文件夹放至ubuntu的 usr share fonts目录下面 xff0c 可用下列命令 span class token function sud
  • 阿里巴巴笔试题选解

    阿里巴巴笔试题选解 9月22日 xff0c 阿里巴巴北邮站 小题 xff1a 1 有三个结点 xff0c 可以构成多少种二叉树形结构 xff1f 2 一副牌52 张 去掉大小王 xff0c 从中抽取两张牌 xff0c 一红一黑的概率是多少
  • ActiveMQ与Logback日志组件SLF4J冲突导致日志不输出

    ActiveMQ与Logback中的SLF4J日志组件冲突导致日志不输出 xff0c 控制台提示 Class path contains multiple SLF4J bindings 的解决方案 近期码的时候发现logback的组件日志都
  • 腾讯2014软件开发笔试题目

    腾讯2014软件开发笔试题目 9月21日 xff0c 腾讯2014软件开发校招 简答题 广州 简答题 xff1a 1 请设计一个排队系统 xff0c 能够让每个进入队伍的用户都能看到自己在 中所处的位置和变化 队伍可能随时有人加入和退出 x
  • C++ 进程间通信详解

    一 xff0c C 43 43 常用进程间通信 管道 Pipe xff1a 管道可用于具有亲缘关系进程间的通信 xff0c 允许一个进程和另一个与它有共同祖先的进程之间进行通信 命名管道 named pipe xff1a 命名管道克服了管道
  • OTA系统包的制作和测试方法

    OTA有两种制作方案 整包升级 xff0c 以及差分包升级 整包升级 完整的升级文件aosp XXXX XXX ota 01 20 010 00 00 zip 差异包 将第一个ota整包升级包和第二个ota整包升级包 xff0c 执行 bu
  • JAVA日记之javaJDK原生简单爬虫

    java原生爬虫 指定一个种子url放入到队列中 从队列中获取某个URL 使用HTTP协议发起网络请求 在发起网络请求的过程中 xff0c 需要将域名转化成IP地址 xff0c 也就是域名解析 得到服务器的响应 xff0c 此时是二进制的输
  • idea中修改自定义maven打包参数,打成一个大的jar

    解决idea打包只会把项目本身打成一个jar的问题 加上这条指令 clean package spring boot repackage Dmaven test skip 61 true f pom xml 在maven命令单这个里会生成新
  • 虚拟机桥接后更换外部网络无法访问

    另外一个网卡也改成这样 然后关闭再打开即可
  • kafka安装配置详解和安装成功验证

    kafka安装后测试 kafka配置项详解 默认 kafka server properties 配置如下 xff1a Server Basics 服务器基础知识 The id of the broker This must be set
  • jvm类加载器以及类加载原理学习

    宏观运行java com tuling jvm Math class命令后执行的流程 底层C 43 43 调用sun misc launcher getlauncher 方法 xff0c 获取launcher对象 xff0c jvm全局唯一
  • httpclient 开启ssl后加代理代理死锁

    记录一个遇到的问题 httpclient 开启ssl后加代理代理死锁 最近做一个爬虫使用搜狗识图功能 xff0c 由于ip问题需要增加代理 xff0c 使用httpclient4 5 3 开启了ssl 代码由异步线程执行 在查看日志时候发现
  • JAVA日记之mybatis-3一对一,一对多,多对多xml与注解配置 ----喝最烈的酒.

    1 Mybatis多表查询 1 1 一对一查询 1 1 1 一对一查询的模型 用户表和订单表的关系为 xff0c 一个用户有多个订单 xff0c 一个订单只从属于一个用户 一对一查询的需求 xff1a 查询一个订单 xff0c 与此同时查询
  • pandas 读取文件时的设置header

    用pandas 中的read table 函数时 xff0c 发现header设置值不一样 xff0c 所获得的结果也不一样 之前一直认为header 61 0 和header 61 None是一样的 xff0c 其实是不一样的 读取一个有
  • 阿里 arthas 使用介绍

    背景 xff1a 一次线上问题的综合排查排查 xff0c 两个相同的系统的某个模块 xff0c 数据量更少的系统查询更慢 先说下整体思路 xff1a 查看系统整理负载 xff0c 网络有100左右毫秒的延迟 xff0c 看起来影响不大查看正