Arthas入门篇

Arthas线上性能诊断

简介:

Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。

官网地址:简介 | arthas (aliyun.com)

功能清单:

https://wangrongyi.oss-cn-chengdu.aliyuncs.com/typora/功能清单.

启动arthas:

  • 本地启动:

    本地通过cmd命令启动,首先通过命令下载arthas的jar包,再通过命令启动,attach到需要检测的java进程上。

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

  • k8s容器启动

  • 线上docker容器内容器(需要root权限)

    1. 复制容器id

    image-20230710131935953

    1. 进入容器

      [root@cm-nginx-node-swarm spider-patrol]# docker exec -it 628a1e1b90f3 bash
      bash-4.4# cd /root
      bash-4.4# cd arthas/
      bash-4.4# java -jar arthas-boot.jar 1
      

      image-20230710132243977

arthas idea plugin 实践

​ 该插件使用教程可以参考插件作者汪小哥的文档

安装下载:

直接通过IDEA下载,或链接下载https://plugins.jetbrains.com/plugin/13581-arthas-idea

image-20230702213441082

基础使用

在使用之前首先要获取classloader的hash 值,然后获取命令,这个是一个交互流程需要连贯性,后续只要是static 的通过static spring context的都需要有这个交互的流程,连贯的,都在同一个界面进行操作.粘贴执行,然后获取结果即可。

[arthas@20796]$ sc -d com.cloudstore.leaf.DeviceAbnormalController | grep classLoaderHash
 classLoaderHash   18b4aac2  #类加载器的hashcode
[arthas@20796]$

获取static变量

image-20230702220138612

image-20230702220209221

粘贴命令,可以看到控制台打印出了静态变量的值。

image-20230702220235782

设置static变量

image-20230702220520265

ognl -x 3 '#field=@com.cloudstore.leaf.DeviceAbnormalController@class.getDeclaredField("ARTHAS_STR"),#field.setAccessible(true),#field.set(null,"设置的字符串")'  -c 18b4aac2

可以看到,变量已经被修改。

image-20230702220710406

注意:变量如果被final关键字修饰后,则不能通过此方法修改。

通过spring context 进行调用bean的方法、字段的内容

当获取到spring的上下文对象后,便可以通过context获得bean,进行一系列操作。

  1. 首先需要一个类获取Spring:

    /**
     * @author wangrongyi
     * @description 提供给arthas ognl 获取context的信息
     */
    @Component
    public class ApplicationContextProvider implements ApplicationContextAware {
    	private static ApplicationContext context;
    
    	public ApplicationContext getApplicationContext() {
    		return context;
    	}
    
    	@Override
    	public void setApplicationContext(ApplicationContext ctx) {
    		context = ctx;
    	}
    }
    
  2. 设置一下static spring context的路径,就是上面静态ApplicationContext变量的路径

    image-20230703091708329

  3. 设置完之后就可以通过ognl命令调用方法

    ognl的完整使用以及如何调用带参数的方法参考:【Arthas】命令之ognl使用姿势

    image-20230703093250987

    ognl -x 3 '#springContext=@com.cloudstore.leaf.core.config.ApplicationContextProvider@context,#springContext.getBean("deviceAbnormalController").testArthas()' -c 18b4aac2
    

    image-20230703094357450

    tips:私有方法也可以调用。Arthas可以与JRebel热部署插件结合在本地使用,不用写单测和接口就能对任意方法进行调用测试,对提升开发效率有奇效。

监控命令monitor、watch、trace、tt

image-20230703141346428

jad反编译:

可以通过反编译查看部署的代码是否生效。

image-20230703111242184

反编译整个类:jad --source-only com.cloudstore.leaf.DeviceAbnormalController

反编译指定方法:jad --source-only com.cloudstore.leaf.DeviceAbnormalController testArthas

arthas实现热更新(线上环境慎用!)

修改前:

image-20230703141838619

修改后:

  1. 打包上传需要替换掉的.class文件,

  2. 获取该类加载器的hashcode

    [arthas@20796]$ sc -d com.cloudstore.leaf.DeviceAbnormalController | grep classLoaderHash
     classLoaderHash  18b4aac2  #类加载器的hashcode
    [arthas@20796]$
    
  3. 通过redefine命令替换对应的.class文件

    image-20230703135941756

    [arthas@20796]$ redefine -c 18b4aac2 "D:\JavaProjects\spider\spider-leaf\leaf-api\target\classes\com\cloudstore\leaf\DeviceAbnormalController.class"
    redefine success, size: 1, classes:
    com.cloudstore.leaf.DeviceAbnormalController
    [arthas@20796]$
    

    image-20230703140244864

    注意:这种方法替换的是该java进程的二进制文件,并未修改.class 文件,所以反编译.class文件是看不到改动的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值