面试题-Athas性能监控工具(原理部分未完成)
前言
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性能监控工具(原理部分未完成)的更多相关文章
- JVM内核-原理、诊断与优化学习笔记(七):性能监控工具
文章目录 系统性能监控 系统性能监控- linux uptime top vmstat(虚拟内存统计) pidstat 系统性能监控 - windows 任务管理器 Perfmon Process E ...
- 深入理解JVM(七)——性能监控工具
前言 工欲善其事必先利其器,性能优化和故障排查在我们大都数人眼里是件比较棘手的事情,一是需要具备一定的原理知识作为基础,二是需要掌握排查问题和解决问题的流程.方法.本文就将介绍利用性能监控工具,帮助开 ...
- JVM学习--(七)性能监控工具
前言 工欲善其事必先利其器,性能优化和故障排查在我们大都数人眼里是件比较棘手的事情,一是需要具备一定的原理知识作为基础,二是需要掌握排查问题和解决问题的流程.方法.本文就将介绍利用性能监控工具,帮助开 ...
- 深入理解JVM(七)——性能监控工具
前言 工欲善其事必先利其器,性能优化和故障排查在我们大都数人眼里是件比较棘手的事情,一是需要具备一定的原理知识作为基础,二是需要掌握排查问题和解决问题的流程.方法.本文就将介绍利用性能监控工具,帮助开 ...
- 深入理解JVM一性能监控工具
一.前言 工欲善其事必先利其器,性能优化和故障排查在我们大都数人眼里是件比较棘手的事情,一是需要具备一定的原理知识作为基础,二是需要掌握排查问题和解决问题的流程.方法.本文就将介绍利用性能监控工具,帮 ...
- 你值得拥有:25个Linux性能监控工具
一.基于命令行的性能监控工具 1.dstat - 多类型资源统计工具 该命令整合了vmstat,iostat和ifstat三种命令.同时增加了新的特性和功能可以让你能及时看到各种的资源使用情况,从而能 ...
- 深入理解JVM—性能监控工具
(转自:http://yhjhappy234.blog.163.com/blog/static/31632832201222691738865/) 我们知道,在JVM编译期和加载器,甚至运行期已经做了 ...
- CentOS 7上的性能监控工具
Linux中基于命令行的性能监控工具:dstat.top.netstat.vmstat.htop.ss.glances 1.dstat – 多类型资源统计工具(需配置epel源) 该命令整合了vmst ...
- 25个Linux性能监控工具
一段时间以来,我们在网上向读者介绍了如何为Linux以及类Linux操作系统配置多种不同的性能监控工具.在这篇文章中我们将罗列一系列使用最频繁的性能监控工具,并对介绍到的每一个工具提供了相应的简介链接 ...
- (转载)Java自带的GUI性能监控工具Jconsole以及JisualVM简介
原文链接:http://blog.csdn.net/chendc201/article/details/22905503 1 Jconsole 1.1 简介以及连接 JConsole是一个基于JMX的 ...
随机推荐
- Solution -「CF 808E」Selling Souvenirs
\(\mathscr{Description}\) Link. 01 背包. 物品种类 \(n\le10^5\),背包容量 \(m\le3\times10^5\),单个物品体积 \(w\i ...
- 第七章 (Nginx+Lua)Web开发实战商品详情页
本章以京东商品详情页为例,京东商品详情页虽然仅是单个页面,但是其数据聚合源是非常多的,除了一些实时性要求比较高的如价格.库存.服务支持等通过AJAX异步加载加载之外,其他的数据都是在后端做数据聚合然后 ...
- 自定义快捷命令程序(VC++加批处理)
一 概述 在看<从小工到专家-程序员修炼之道>时,看到建议使用Shell,很有感触.在很多时候,通过键盘操作,比鼠标的确会块很多,如果能用好shell命令(或批处理命令) ,的确能节省 ...
- ReentrantLock实现机制
掌握Reentrantlock 具体结构 下文Reentrantlock简称RL,阅读之前强烈建议读一下AQS源码解析: https://www.cnblogs.com/seamount3/p/186 ...
- Lua字节数组与float互转
纪念那些在双流工厂奋斗的日夜,防爆表屏项目 是一次很成功的实践,包括设计的页面堆栈和跳转机制 历史回退机制 页面密码保护机制 串口分包机制 ,运用综合所学来搭建的屏上独立内循环系统 ,自恋点说的话各 ...
- RocketMQ实战—2.RocketMQ集群生产部署
大纲 1.什么是消息中间件 2.消息中间件的技术选型 3.RocketMQ的架构原理和使用方式 4.消息中间件路由中心的架构原理 5.Broker的主从架构原理 6.高可用的消息中间件生产部署架构 7 ...
- C#正则提取字符串中的数字
首先需要引入命名空间System.Text.RegularExpressions,具体实现如下所示: //提取纯数字,该方式会将所有数字提取出来并拼接在一起,如:"ABC#123@AS456 ...
- Luogu P3059 Concurrently Balanced Strings G 题解 [ 紫 ] [ 线性 dp ] [ 哈希 ] [ 括号序列 ]
模拟赛搬的题,dp 思路很明显,但难点就在于找到要转移的点在哪. 暴力 首先我们可以先考虑 \(k=1\) 的情况,这应该很好想,就是对于每一个右括号,找到其匹配的左括号,然后进行转移即可,这个过程可 ...
- DM SQL关联列 like 优化案例
1.1.sql优化背景 达梦一哥们找我优化条SQL,反馈在DM8数据库执行时间很慢出不来结果, 监控工具显示这条SQL的执行时间需要20多万毫秒,安排. 1.2.慢sql和执行时间 select a. ...
- mysql之我的第一个jdbc程序
package com.yeyue.lesson01; import java.sql.*; public class jdbcFirstDemo { public static void main( ...