前言

Arthas工具已经被我们项目组简单的应用到了物流项目的日常运维中。物流项目之前出现过生产消费速度不一致导致内存队列中的消息数据积压的问题,在后来解决了问题之后,我们项目组就更加重视了对JVM的日常监控,希望能借助工具及时的发现问题。这次把这篇文章归类到面试题中,是想表达这篇文章不是单纯的操作性文章,也会进行相关的原理分析,希望能对性能监控相关的面试有所帮助。

Arthas

Arthas能做什么?

就笔者的粗浅理解来说,Arthas主要能解决两个方面的问题:

  • 线上debug
  • 更方便的查看jvm相关的信息

Arthas的基本命令功能

dashboard

dashboard是一个上帝视角的数据监控面板,也是我们平时使用最多的功能,通过它可以监控线程/虚拟机和操作系统的基本信息,如下图:

一般来说,我们会监控Runnable线程都是哪些nio线程,数量代表了活跃一直在上数的物流门数量,还会看一下当前堆的大小,是否有内存泄漏的问题,还会看一下垃圾收集器的回收次数和单次回收时间,查看下是否有异常情况出现。

sc和sm

sc命令可以查看jvm已经加载的类信息。

可以使用-d -f输出更加详细的信息。

比如,我们想查看RabbitMQ的一个配置类是否被正确加载进来,就可以使用sc命令实现

[arthas@24222]$ sc *.RabbitConfig
cn.net.icomp.svcmw.config.RabbitConfig
cn.net.icomp.svcmw.config.RabbitConfig$$EnhancerBySpringCGLIB$$33a99423

可以查看到除了本来的类以外,还有一个spring用CGLIB加强的动态代理类

sm可以查看加载到元数据区的方法

jad

jad可以线上反编译class字节码,查问题利器!官方文档中介绍还可以配合mc和redefine热替换class,这个目前没有尝试过。

比如,可以使用jad反编译一个任务代码

方法监控相关

笔者认为方法监控相关的命令是很有意思的命令组,值得认真学习并应用到实际工作中。

注意:方法监控类相关的指令,原理是通过字节码增强的技术实现的,监控完毕后必须要调用stop(之前会自动reset)停止arthas或者reset重置加强过的类,否则可能会影响代码性能。

前置知识-OGNL表达式

参考资料:OGNL 语言介绍与实践

简单理解,OGNL就是一个可以提供对对象中的变量访问和设置的表达式。

watch-方法执行数据观测

watch主要用于观察 方法 的 入参 出参 返回值 和 异常等信息,还可以通过OGNL表达式对Arthas的通知对象中的其他相关变量进行查看。

所有可以观察的变量如下:

public class Advice {
private final ClassLoader loader;//调用类的类加载器
private final Class<?> clazz;//调用类的class对象
private final ArthasMethod method;//调用的方法
private final Object target;//当前对象实例
private final Object[] params;//入参
private final Object returnObj;//返回对象
private final Throwable throwExp;//抛出的异常
private final boolean isBefore;//方法开始就通知的标记变量
private final boolean isThrow;//方法是否抛出异常
private final boolean isReturn;//方法是否正常返回
}

只观测方法进入时的入参,无返回值时,可以这样写

watch 类名表达式 方法名表达式 "{params}" -b -x 2

只观察方法异常时的出餐和返回值时,可以这样写

watch 类名表达式 方法名表达式 "{params,returnObj}" -e -x 2

只观察方法的正常返回时的出参和返回值时,可以这样写

watch 类名表达式 方法名表达式 "{params,returnObj}" -s -x 2

注意:

  • 如果不加 -e -b -s的参数,默认是方法异常和正常返回的两种情况都会进行观察。
  • -x 参数代表了遍历深度
  • 还可以加 -n参数 指定执行的次数
  • 还可以在观察表达式后面 加入额外的条件表达式,进一步过滤返回结果,比如:
    • 按照cost耗时进行过滤 '#cost>200'
    • 按照param的第一个参数是否小于0进行过滤 "params[0]<0"

trace命令-跟踪方法内部调用路径并统计耗时

原理文章:Trace命令的实现原理

简单总结下:

  • trace匹配的是对应方法字节码中的方法调用指令(invokeXXX指令,只能从当前方法开始匹配第一层子方法,无法继续深入,如果想要监控方法调用链上的多层,需要用正则表达式手动匹配多个类和方法)
  • 同一个线程中执行的所有方法按照调用顺序可建立一个树

代码实践:统计解码方法中耗时大于1ms的方法调用

[arthas@24222]$ trace *.ProtocolService decode '#cost > 1'

方法返回:

stack-统计当前方法的调用路径(了解当前方法都被哪些方法调用过)

其实统计的就是堆栈信息,和报异常打印的堆栈信息类似。

代码实战

统计decode方法的调用堆栈,只显示两条数据

[arthas@24222]$ stack *.ProtocolService decode  -n 2

命令返回

tt-记录下每次方法调用的环境现场

tt存在的意义在于可以完整的记录针对当前方法的所有调用信息,包括每次调用的出入参(准确来说是出参,如果方法中对入参没有任何修改,那么出参=入参)返回值等等。

代码实战:

记录下decode方法的最近4次的方法调用,然后查看其中某一次方法调用。

[arthas@24222]$ tt -t *.ProtocolService decode -n 4

结果如下:

查看1004编号的这次方法调用。

小技巧:可以配合-x 2 把结果遍历深度设置为2(可以观察到返回值对象中属性的具体值)

monitor-方法执行统计(非实时方法)

monitor命令会给出一个周期内的某方法的统计信息,包括,调用次数成功次数失败次数,平均调用时间失败率等等。

代码实战:

每10秒统计一次,decode方法相关信息

[arthas@24222]$ monitor -c 10 *.ProtocolService decode

代码结果如下:


Arthas异常情况处理

端口被占用异常

如果观测了其中一个应用之后,使用exit指令关闭arthas,然后再使用下面指令启动arthas

 java -jar /usr/local/arthas-packaging-3.2.0-bin/arthas-boot.jar

启动后会提示如下:

[root@rfidapp ~]# java -jar /usr/local/arthas-packaging-3.2.0-bin/arthas-boot.jar
[INFO] arthas-boot version: 3.2.0
[INFO] Process 10704 already using port 3658
[INFO] Process 10704 already using port 8563
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 10704 org.apache.storm.LogWriter
[2]: 17459 /data/sg/ledsend-0.0.1-SNAPSHOT.V2020071501jar
[3]: 10726 org.apache.storm.daemon.worker
[4]: 13594 org.apache.catalina.startup.Bootstrap
[5]: 24222 /data/sg/svc-mw-0.0.1-SNAPSHOT-V20200618.jar
[6]: 32015 org.apache.storm.daemon.supervisor.Supervisor
[7]: 25839 /data/sg/ledcalculate-0.0.1-SNAPSHOT.jar

如果选择了另外一个应用进行观测,就会报下面的错误

[ERROR] Target process 24222 is not the process using port 3658, you will connect to an unexpected process.
[ERROR] 1. Try to restart arthas-boot, select process 10704, shutdown it first with running the 'stop' command.
[ERROR] 2. Or try to use different telnet port, for example: java -jar arthas-boot.jar --telnet-port 9998 --http-port -1

这个提示表明,arthas的telnet端口和http端口已经被占用,如果要使用默认的端口,就需要关闭前一个观测的应用;要么就使用指定其他端口的方式来启动arthas,这两种方式都可以解决问题。

面试题-Athas性能监控工具(原理部分未完成)的更多相关文章

  1. JVM内核-原理、诊断与优化学习笔记(七):性能监控工具

    文章目录 系统性能监控 系统性能监控- linux uptime top vmstat(虚拟内存统计) pidstat 系统性能监控 - windows 任务管理器 Perfmon Process E ...

  2. 深入理解JVM(七)——性能监控工具

    前言 工欲善其事必先利其器,性能优化和故障排查在我们大都数人眼里是件比较棘手的事情,一是需要具备一定的原理知识作为基础,二是需要掌握排查问题和解决问题的流程.方法.本文就将介绍利用性能监控工具,帮助开 ...

  3. JVM学习--(七)性能监控工具

    前言 工欲善其事必先利其器,性能优化和故障排查在我们大都数人眼里是件比较棘手的事情,一是需要具备一定的原理知识作为基础,二是需要掌握排查问题和解决问题的流程.方法.本文就将介绍利用性能监控工具,帮助开 ...

  4. 深入理解JVM(七)——性能监控工具

    前言 工欲善其事必先利其器,性能优化和故障排查在我们大都数人眼里是件比较棘手的事情,一是需要具备一定的原理知识作为基础,二是需要掌握排查问题和解决问题的流程.方法.本文就将介绍利用性能监控工具,帮助开 ...

  5. 深入理解JVM一性能监控工具

    一.前言 工欲善其事必先利其器,性能优化和故障排查在我们大都数人眼里是件比较棘手的事情,一是需要具备一定的原理知识作为基础,二是需要掌握排查问题和解决问题的流程.方法.本文就将介绍利用性能监控工具,帮 ...

  6. 你值得拥有:25个Linux性能监控工具

    一.基于命令行的性能监控工具 1.dstat - 多类型资源统计工具 该命令整合了vmstat,iostat和ifstat三种命令.同时增加了新的特性和功能可以让你能及时看到各种的资源使用情况,从而能 ...

  7. 深入理解JVM—性能监控工具

    (转自:http://yhjhappy234.blog.163.com/blog/static/31632832201222691738865/) 我们知道,在JVM编译期和加载器,甚至运行期已经做了 ...

  8. CentOS 7上的性能监控工具

    Linux中基于命令行的性能监控工具:dstat.top.netstat.vmstat.htop.ss.glances 1.dstat – 多类型资源统计工具(需配置epel源) 该命令整合了vmst ...

  9. 25个Linux性能监控工具

    一段时间以来,我们在网上向读者介绍了如何为Linux以及类Linux操作系统配置多种不同的性能监控工具.在这篇文章中我们将罗列一系列使用最频繁的性能监控工具,并对介绍到的每一个工具提供了相应的简介链接 ...

  10. (转载)Java自带的GUI性能监控工具Jconsole以及JisualVM简介

    原文链接:http://blog.csdn.net/chendc201/article/details/22905503 1 Jconsole 1.1 简介以及连接 JConsole是一个基于JMX的 ...

随机推荐

  1. OpenMMLab AI实战营 第一课笔记

    OpenMMLab AI实战营 第一课笔记 OpenMMLab AI实战营第一节课由子豪兄讲解,课程主要内容主要围绕计算机视觉和OpenMMLab开源算法体系以及机器学习和神经网络简介进行展开.这里要 ...

  2. Apgar score

    Apgar score Apgar is a quick test performed on a baby at 1 and 5 minutes after birth. The 1-minute s ...

  3. C Primer Plus 第6版 第五章 编程练习参考答案

    编译环境VS Code+WSL GCC 源码在文末下载 /*第1题*************************/ #include<stdio.h> #define MIN_TO_H ...

  4. vue基础4

    Q:1.动画的使用方法以及动画库的使用方式 2.vue中的指令有哪些? 3.vue中生命周期钩子函数有哪些?分别代表什么含义? 4.filter的语法是什么? 5.computed的特点是什么? 6. ...

  5. runoob-Android 基础入门教程-1

    https://www.runoob.com/w3cnote/android-tutorial-interface-design.html 公司的话,大部分使用的都是Axure Rp,但是这个东西比较 ...

  6. 项目PMP之七项目成本管理

    项目PMP之七--项目成本管理   一.定义:在预算内管理成本:预测项目成本 核心理念:重点关注项目活动的成本:同时决策的影响.相关方的不同时间不同方法的测算 趋势:挣值进度(ES)逻辑:敏捷的方式则 ...

  7. .NET Core 中如何构建一个弹性的 HTTP 请求机制?

    1. 理解弹性 HTTP 请求机制 什么是弹性? 弹性是指系统在面对故障或异常情况时,能够保持或快速恢复到正常状态的能力.在 HTTP 请求的上下文中,弹性意味着当请求失败时,系统能够自动采取一系列措 ...

  8. linux创建快捷方式

    第一方法设置软连接 ln -s test.log test2.log     第二方法 第一步 新建 /usr/share/applications 目录下的某个快捷方式文件 如 touch /usr ...

  9. IDEA debug时候直接报ClassNotFoundException,代码正常,也可以正常运行

    原因,是因为在某些类误点了断点,需要取消

  10. 五分钟搞定!Linux平台上用Ansible自动化部署SQL Server AlwaysOn集群

    五分钟搞定!Linux平台上用Ansible自动化部署SQL Server AlwaysOn集群 前言 以下内容是由红帽官方博客整理而成,使用Ansible在Linux平台上自动化部署SQL Serv ...