目录

一、概念

二、整体逻辑

三、相关文档

四、故障注入实践


一、概念

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

二、整体逻辑

Arthas 的整体逻辑也是在 Java 的 Instrumentation基础上来实现,所有在加载的类会通过Agent的加载, 通过addTransformer之后,进行增强,然后将对应的Advice织入进去,对于类的查找,方法的查找,都是通过SearchUtil来进行的,通过InstrumentloadAllClass方法将所有的JVM加载的class按名字进行匹配,一致的会进行返回。

三、相关文档

快速入门

进阶使用

四、故障注入实践

在保证自身服务稳定的前提下,为了模拟远程调用服务出现异常情况,采用  Arthas 热更新线上服务代码的方式实现故障注入。

1、下载 Arthas 到服务器

curl -o /tmp/arthas-boot.jar https://arthas.aliyun.com/arthas-boot.jar

2、获取服务的进程号

ps -ef | grep 服务名

3、使用 Arthas atach 到服务上

/home/work/bin/服务名/java/bin/java -jar /tmp/arthas-boot.jar

4、输入服务进程号前的数字,并回车,进入 arthas 操作界面

5、在 Arthas 界面中使用 sc 命令加 -d 参数指定全限定名查找 Demo 类的相关信息,得到加载 Demo 类 ClassLoader 对应的 Hash 值

sc -d com.***.Demo | grep classLoaderHash | head -n1

6、编译Demo.java 文件,可以先提前将改好的代码传上来,在 Arthas 界面中使用 mc 命令内存编译Demo类,并通过 -c 参数指定由上一步获取的ClassLoader 的 hash 值( -d 参数为编译后文件输出目录)

$ mc -c hash值 /tmp/服务名/Demo.java -d /tmp/服务名

7、得到编译后的 Demo.class 文件后(可能会有匿名类Demo$1.class文件,如果没有修改匿名类逻辑,不需要热更新), 就可以用 retrasform 命令热更新代码了(class文件路径为上一步中输出的 /tmp/服务名/com/***/Demo.class )。

$ retransform /tmp/服务名/com/***/Demo.class

8、查看有多少个热加载更新的class,同一个就是id 增加的,删除之后,就是按最大Id也就是最近替进去的执行

retransform -l 

9、实践结束后,使用 retransform 命令撤销更新

retransform --deleteAll

10、注意:撤销之后,默认并不还原,还是 有特意添加的日志输出,jad 也还是影响的版本,要想显示的去生效旧版,还要再执行下面的指令才能完全恢复

retransform --classPattern com.***.Demo

11、退出arthas

如果只是退出当前的连接,可以用quit或者exit命令。Attach到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。如果想完全退出arthas,可以执行stop命令。

12、注意:当退出后,通过指令重新进入arthas操作界面时, 如果报arthas 3658端口占用错误

[ERROR] The telnet port 3658 is used by process 2822 instead of target process 6062, you will connect to an unexpected process.
[ERROR] 1. Try to restart arthas-boot, select process 2822, shutdown it first with running the 'stop' command.
[ERROR] 2. Or try to stop the existing arthas instance: java -jar arthas-client.jar 127.0.0.1 3658 -c "stop"
[ERROR] 3. Or try to use different telnet port, for example: java -jar arthas-boot.jar --telnet-port 9998 --http-port -1

13、根据提示,执行命令即可正常进入,一台机器上如果同时用arthas测试多个服务,可以采用不同的telnet端口号:

/home/work/bin/服务名/java/bin/java -jar /tmp/arthas-boot.jar --telnet-port 9998 --http-port -1

利用Arthas进行简单的故障注入相关推荐

  1. js入门·循环与判断/利用函数的简单实例/使用对象/列举对象属性的名称

    1,列举对象属性的名称 <script language="javascript"> var obj=new Object(); obj.a="您好,我是田洪 ...

  2. 在html利用canvas蚂蚁,html5 利用canvas实现简单的人物走动

    最近在学习html5,其中涉及到很关键的元素canvas-画布,在网上下载了一些游戏源代码,虽然能看懂,但是想单独地针对某个功能提取出来还是有难处的,于是乎自己又上网查找了一些例子,才将超级玛丽简单的 ...

  3. python爬虫简单实例-Python 利用Python编写简单网络爬虫实例3

    利用Python编写简单网络爬虫实例3 by:授客 QQ:1033553122 实验环境 python版本:3.3.5(2.7下报错 实验目的 获取目标网站"http://bbs.51tes ...

  4. Java中利用socket实现简单的服务端与客户端的通信(中级)——实现任意双向通信

    本文计划采用socket实现客户端和服务端的任意双向通信,即客户端可以随时给服务端发消息,服务端也可以随时给客户端发消息,最终结果就是一个类似与QQ的聊天软件的功能. 以下代码可以直接拷贝到Eclip ...

  5. Java中利用socket实现简单的服务端与客户端的通信(基础级)

    在上一篇文章中,简单的介绍了java中入门级的socket编程,简单的实现了客户端像服务器端发送数据,服务器端将数据接收并显示在控制台,没有涉及多线程.上一篇文章的链接:Java中利用socket实现 ...

  6. DL之RNN:基于TF利用RNN实现简单的序列数据类型(DIY序列数据集)的二分类(线性序列随机序列)

    DL之RNN:基于TF利用RNN实现简单的序列数据类型(DIY序列数据集)的二分类(线性序列&随机序列) 目录 序列数据类型&输出结果 设计思路 序列数据类型&输出结果 1.t ...

  7. 利用python发送邮件_利用python实现简单的邮件发送客户端示例

    脚本过于简单,供学习和参考.主要了解一下smtplib库的使用和超时机制的实现.使用signal.alarm实现超时机制. #!/usr/bin/env python # -*- coding: ut ...

  8. 利用 Arthas 解决启动 HDFS StandbyNameNode 加载 EditLog 慢的问题

    利用 Arthas 解决启动 StandbyNameNode 加载 EditLog 慢的问题 公司新搭 HDFS 集群,namenode做ha,但是在启动 StandbyNamenode 节点的时候出 ...

  9. C语言试题二十之利用以下的简单迭代方法求方程cos(x)-x=0的一个实根。

    1. 题目 编写函数function,它的功能是:利用以下的简单迭代方法求方程cos(x)-x=0的一个实根. 迭代步骤如下: (1)取x1初值为0.0: (2)x0=x1,把x1的值赋各x0; (3 ...

  10. 利用Arthas排查NoSuchMethodError

    1.前言 有时spring boot应用会遇到java.lang.NoSuchMethodError的问题,下面以具体的demo来说明怎样利用arthas来排查. Demo: https://gith ...

最新文章

  1. 负载均衡算法-处理能力均衡
  2. Apache Camel框架入门示例
  3. 四轴飞行器实践教程1.1.2飞行器的发展
  4. Android加密通信防抓包,[原创]基于Taintdroid思想的android ssl\tsl保密通信抓包研究(未成功,分享一下思路)...
  5. C++将一个数字转化为string的现成方法
  6. linux之SQL语句简明教程---SUBSTRING
  7. labview实例_手把手以实例教你学LabVIEW编程,条件结构编程方法
  8. response php,HttpResponse.php
  9. 树莓派 编译live555_树莓派raspberry4B入坑指南 part-6 docker编译古灵币钱包
  10. 创下新的纪录 京东618累计下单金额超3438亿元
  11. 《C++标准程序库》学习笔记(一)C++相关特性
  12. html搜索框 模糊搜索,前端js模糊搜索(模糊查询)
  13. 家用无线路由器的相关设置
  14. 54. Attribute isId 属性
  15. 技嘉主板bios设置方法
  16. 物联网解决方案:智慧物流方案
  17. Ubuntu压缩视频
  18. WinCC7.0如何通过授权管理器用U盘进行导入和导出授权?
  19. MOSE学习笔记(看的官方手册)
  20. 自动清理源计算机设备驱动,win10系统删除过期驱动程序设备的设置技巧

热门文章

  1. 网页设计如何排成一列_网页排版设计中对齐技巧能让网站产生高端感(下)
  2. 微信自研生产级paxos类库PhxPaxos实现原理介绍
  3. 糖果游戏(齐大第十一届校赛)
  4. 计算机音乐制作专业的大学,音乐制作专业哪些大学
  5. linux清理垃圾缓存文件在哪,Linux系统需要清理垃圾文件和优化系统吗?
  6. Win10上轻松安装docker,更改镜像安装目录
  7. Python中文文本分句 sentence tokenize
  8. 94个比付费软件更好的免费软件(转载)
  9. Unity3D纯白(Pure White)烘焙【2020】
  10. Unrecognised input. Possibly missing opening ‘{‘