Arthas使用教程—— 阿里开源线上监控诊断产品

news2024/10/6 1:42:11

文章目录

  • 1 简介
  • 2背景
  • 3 图形界面工具 arthas 阿里开源
    • 3.1 :启动 arthas
    • 3.2 help :查看arthas所有命令
    • 3.3 查看 dashboard
    • 3.4 thread 列出当前进程所有线程占用CPU和内存情况
    • 3.5 jvm 查看该进程的各项参数 (类比 jinfo)
    • 3.6 通过 jad 来反编译 UserController Class
    • 3.8 `monitor` 监控方法的执行情况
    • 3.9 `watch`:检测函数返回值
    • 3.10 `trace`:根据路径追踪,并记录消耗时间
    • 3.11 `tt`:时间隧道,记录多个请求
    • 3.12 redefine 定义class
    • 3.13 退出 arthas
  • 4 项目中应用

在这里插入图片描述

1 简介

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

2背景

通常,本地开发环境无法访问生产环境。如果在生产环境中遇到问题,则无法使用 IDE 远程调试。更糟糕的是,在生产环境中调试是不可接受的,因为它会暂停所有线程,导致服务暂停。

开发人员可以尝试在测试环境或者预发环境中复现生产环境中的问题。但是,某些问题无法在不同的环境中轻松复现,甚至在重新启动后就消失了。

如果您正在考虑在代码中添加一些日志以帮助解决问题,您将必须经历以下阶段:测试、预发,然后生产。这种方法效率低下,更糟糕的是,该问题可能无法解决,因为一旦 JVM 重新启动,它可能无法复现,如上文所述。

Arthas 旨在解决这些问题。开发人员可以在线解决生产问题。无需 JVM 重启,无需代码更改。 Arthas 作为观察者永远不会暂停正在运行的线程。

3 图形界面工具 arthas 阿里开源

下载地址:https://arthas.aliyun.com/

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

3.1 :启动 arthas

直接通过java -jar 启动arthas的jar包文件

选择应用 java 进程:jvm-test 进程是第 1 个,则输入 1,再输入回车/enter。Arthas 会 attach 到目标进程上,并输出日志:

在这里插入图片描述

3.2 help :查看arthas所有命令

在这里插入图片描述

  • JVM 相关:
    • dashboard - 当前系统的实时数据面板
    • getstatic - 查看类的静态属性
    • heapdump - dump java heap, 类似 jmap 命令的 heap dump 功能
    • jvm - 查看当前 JVM 的信息
    • logger - 查看和修改 logger
    • mbean - 查看 Mbean 的信息
    • memory - 查看 JVM 的内存信息
    • ognl - 执行 ognl 表达式
    • perfcounter - 查看当前 JVM 的 Perf Counter 信息
    • sysenv - 查看 JVM 的环境变量
    • sysprop - 查看和修改 JVM 的系统属性
    • thread - 查看当前 JVM 的线程堆栈信息
    • vmoption - 查看和修改 JVM 里诊断相关的 option
    • vmtool - 从 jvm 里查询对象,执行 forceGc
  • class/classloader 相关:
    • classloader - 查看 classloader 的继承树,urls,类加载信息,使用 classloader 去 getResource
    • dump - dump 已加载类的 byte code 到特定目录
    • jad - 反编译指定已加载类的源码
    • mc - 内存编译器,内存编译.java文件为.class文件
    • redefine - 加载外部的.class文件,redefine 到 JVM 里
    • retransform - 加载外部的.class文件,retransform 到 JVM 里
    • sc - 查看 JVM 已加载的类信息
    • sm - 查看已加载类的方法信息
  • monitor/watch/trace 相关:
    • monitor - 方法执行监控
    • stack - 输出当前方法被调用的调用路径
    • trace - 方法内部调用路径,并输出方法路径上的每个节点上耗时
    • tt - 方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
    • watch - 方法执行数据观测
  • 基础命令
    • base64 - base64 编码转换,和 linux 里的 base64 命令类似
    • cat - 打印文件内容,和 linux 里的 cat 命令类似
    • cls - 清空当前屏幕区域
    • echo - 打印参数,和 linux 里的 echo 命令类似
    • grep - 匹配查找,和 linux 里的 grep 命令类似
    • help - 查看命令帮助信息
    • history - 打印命令历史
    • keymap - Arthas 快捷键列表及自定义快捷键
    • pwd - 返回当前的工作目录,和 linux 命令类似
    • quit - 退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
    • reset - 重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
    • session - 查看当前会话的信息
    • stop - 关闭 Arthas 服务端,所有 Arthas 客户端全部退出
    • tee - 复制标准输入到标准输出和指定的文件,和 linux 里的 tee 命令类似
    • version - 输出当前目标 Java 进程所加载的 Arthas 版本号

3.3 查看 dashboard

输入 dashboard,按回车/enter,会展示当前进程的信息,按ctrl+c可以中断执行。

可以看到进程里面有哪些线程,每个线程的状态、吃CPU的情况等。

在Memory中我们可以看到内存的占用情况:

  • 新生代:eden_space、survivor_space
  • 老年代:tenured_space
  • 非堆内存:nonheap

在这里插入图片描述

3.4 thread 列出当前进程所有线程占用CPU和内存情况

在这里插入图片描述

thread pid会打印线程 ID pid 的栈,通常pid 1是 main 函数的线程。

thread -b 寻找死锁

3.5 jvm 查看该进程的各项参数 (类比 jinfo)

在这里插入图片描述

我们在garbage collectors(GC)里面可以看到这里垃圾回收的统计情况

  • Copy(复制算法)用了49次,耗时506
  • MarkSweepCompact(标记整理算法)用了3次,耗时795

3.6 通过 jad 来反编译 UserController Class

在这里插入图片描述
在这里插入图片描述

3.8 monitor 监控方法的执行情况

监控com.example.jvm.controller.TestController类的 “getStr”方法 ,并且每5S更新一次状态。

monitor com.example.jvm.controller.TestController getStr -c 5

在这里插入图片描述

监控的维度说明

监控项说明
timestamp时间戳
classJava类
method方法(构造方法、普通方法)
total调用次数
success成功次数
fail失败次数
rt平均耗时
fail-rate失败率

3.9 watch:检测函数返回值

方法执行数据观测,让你能方便的观察到指定方法的调用情况。

能观察到的范围为:返回值抛出异常入参,通过编写OGNL 表达式进行对应变量的查看。

参数名称参数说明
class-pattern类名表达式匹配
method-pattern方法名表达式匹配
express观察表达式
condition-express条件表达式
[b]在方法调用之前观察before
[e]在方法异常之后观察 exception
[s]在方法返回之后观察 success
[f]在方法结束之后(正常返回和异常返回)观察 finish
[E]开启正则表达式匹配,默认为通配符匹配
[x:]指定输出结果的属性遍历深度,默认为 1

这里重点要说明的是观察表达式,观察表达式的构成主要由ognl 表达式组成,所以你可以这样写"{params,returnObj}",只要是一个合法的 ognl 表达式,都能被正常支持。

特别说明

  • watch 命令定义了4个观察事件点,即 -b 方法调用前,-e 方法异常后,-s 方法返回后,-f 方法结束后
  • 4个观察事件点 -b、-e、-s 默认关闭,-f 默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出
  • 这里要注意方法入参方法出参的区别,有可能在中间被修改导致前后不一致,除了 -b 事件点 params 代表方法入参外,其余事件都代表方法出参
  • 当使用 -b 时,由于观察事件点是在方法调用前,此时返回值或异常均不存在

通过watch命令可以查看函数的参数/返回值/异常信息。

  1. 查看方法执行的返回值
watch com.example.jvm.controller.UserController list returnObj

在这里插入图片描述

3.10 trace:根据路径追踪,并记录消耗时间

对方法内部调用路径进行追踪,并输出方法路径上的每个节点上耗时。

简介:

trace 命令能主动搜索 class-pattern/method-pattern 对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。

观察表达式的构成主要由ognl 表达式组成,所以你可以这样写"{params,returnObj}",只要是一个合法的 ognl 表达式,都能被正常支持。

很多时候我们只想看到某个方法的rt大于某个时间之后的trace结果,现在Arthas可以按照方法执行的耗时来进行过滤了,例如trace *StringUtils isBlank '#cost>100’表示当执行时间超过100ms的时候,才会输出trace的结果。

watch/stack/trace这个三个命令都支持#cost耗时条件过滤。

参数说明:

参数名称参数说明
class-pattern类名表达匹配
method-pattern方法名表达式匹配
condition-express条件表达式,使用OGNL表达式
[E]开启正则表达式匹配,默认是通配符匹配
[n:]设置命令执行次数
#cost方法执行耗时,单位是毫秒

案例:

#	trace函数指定类的指定方法
trace com.example.jvm.controller.UserController list

在这里插入图片描述

#	在浏览器上进行登录操作,检查最耗时的方法
trace *.DispatcherServlet *

在这里插入图片描述

3.11 tt:时间隧道,记录多个请求

time-tunnel 时间隧道。

记录下指定方法每次调用的入参和返回信息,并能对这些不同时间下调用的信息进行观测

参数解析:

tt的参数说明
-t记录某个方法在一个时间段中的调用
-l显示所有已经记录的列表
-n 次数只记录多少次
-s 表达式搜索表达式
-i 索引号查看指定索引号的详细调用信息
-p重新调用:指定的索引号时间碎片

案例:

#	最基本的使用来说,就是记录下当前方法的每次调用环境现场。
tt -t com.example.jvm.controller.UserController list

在这里插入图片描述

模拟报错:

    @Operation(summary = "业务接口模拟测试")
    @Parameters({
            @Parameter(name = "str",description = "字符串参数",in = ParameterIn.QUERY),
    })
    @GetMapping("work")
    public ResponseEntity<String> work(@RequestParam("str") String str){
        if (str.equals("1")){
            throw new RuntimeException("异常");
        }
        testService.work1();
        testService.work2();
        testService.work3();
        return ResponseEntity.ok().body("success");
    }

    public void work1() {
        try {
            Thread.sleep(1000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        log.info("work1");
    }

    public void work2() {
        try {
            Thread.sleep(2000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        log.info("work2");
    }

    public void work3() {
        try {
            Thread.sleep(3000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        log.info("work3");
    }

在这里插入图片描述

#	对现有记录进行检索
tt -l

在这里插入图片描述

#	需要筛选出 `primeFactors` 方法的调用信息
tt -s 'method.name=="getStr"'

在这里插入图片描述

#	查看某条记录详细信息
tt -i 1007

在这里插入图片描述

3.12 redefine 定义class

可以在不停止项目的情况下,修改java文件,通过javac 类名.java编译 再通过redefine 定义class上传到远程

我在Linux上放了一个小程序,输出zyw.

在这里插入图片描述

# 编辑T.java文件
vim T.java
# 编译T.java生成T.class文件
javac T.java
# 启动arthas 绑定TestMain进程
java -jar arthas-boot.jar
# 重新定义T.class 文件
redefine T.class 

在这里插入图片描述

3.13 退出 arthas

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

如果想完全退出 arthas,可以执行stop命令。

在这里插入图片描述

4 项目中应用

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1436163.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Chrono Engine学习总结】1-安装配置与程序运行

本文仅用于个人安装记录。 官方安装教程 https://api.projectchrono.org/8.0.0/tutorial_install_chrono.html Windows下安装 windows下安装就按照教程好了。采用cmake-gui进行配置&#xff0c;建议首次安装只安装核心模块。然后依此configure下irrlicht&#xff0c;sensor…

JVM 性能调优 - 参数调优(3)

查看 JVM 内存的占用情况 编写代码 package com.test;public class PrintMemoryDemo {public static void main(String[] args) {// 堆内存总量long totalMemory Runtime.getRuntime().totalMemory();// jvm 试图使用的最大堆内存long maxMemory Runtime.getRuntime().maxM…

国内游戏服务器价格表

游戏服务器租用多少钱一年&#xff1f;1个月游戏服务器费用多少&#xff1f;阿里云游戏服务器26元1个月、腾讯云游戏服务器32元&#xff0c;游戏服务器配置从4核16G、4核32G、8核32G、16核64G等配置可选&#xff0c;可以选择轻量应用服务器和云服务器&#xff0c;阿腾云atengyu…

PHP客服系统-vue客服聊天系统

PHP-Vue客服聊天系统是一款高效、灵活的客户服务解决方案&#xff0c;基于ThinkPHP6、Vue3和Workerman(Gateworker)框架开发&#xff0c;专为单商户场景打造。 系统亮点&#xff1a; 分布式部署支持&#xff0c;轻松应对高并发场景&#xff1b;本地消息存储功能&#xff0c;确…

Python 数据分析(PYDA)第三版(四)

原文&#xff1a;wesmckinney.com/book/ 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 八、数据整理&#xff1a;连接、合并和重塑 原文&#xff1a;wesmckinney.com/book/data-wrangling 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 此开放访问网络版本的…

STM32F1 - 点灯-寄存器模式

点灯 实验概述&#xff1a;Step1> 建立工程Step2> 宏定义 - 寄存器地址 实验概述&#xff1a; 用配置寄存器的方式&#xff0c;开关一个LED灯&#xff0c; 只用标准库中提供的启动文件&#xff0c; Step1> 建立工程 出现错误&#xff1a;导入文件类型错误 keil5编译中…

QMUI_Android:提升Android开发效率与质量的利器

QMUI_Android&#xff1a;提升Android开发效率与质量的利器 在Android应用开发过程中&#xff0c;开发者常常面临着重复编写基础组件和处理兼容性问题的挑战&#xff0c;这不仅耗费时间&#xff0c;也降低了开发效率。为了解决这一问题&#xff0c;Tencent推出了QMUI_Android框…

如何使用Python + 百度翻译API 自动大批量免费翻译Excel文件中的外语内容

手里有一个Excel文件,包括了大量的亚马逊德语搜索词(关键词),每个单元格1个,需要翻译为中文。但是文件大小超过了10M,不能使用百度或Google免费的文档功能,如果手工一个个的翻译然后粘贴又太麻烦,于是想到用Python加免费翻译API完成。 一、openpyxl库 用Python编辑处…

【数据结构】排序之冒泡排序和快速排序

简单不先于复杂&#xff0c;而是在复杂之后。 文章目录 1. 交换排序1.1 冒泡排序1.2 快速排序1.3 快速排序优化1.4 快速排序非递归 1. 交换排序 基本思想&#xff1a;所谓交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置&#xff0c;交换…

day44_jdbc

今日内容 0 复习昨日 1 讲作业 2 数据库连接池(druid) 3 反射 4 改造DBUtil 5 完成CRUD练习 0 复习昨日 1 sql注入 2 预处理语句 3 事务操作 4 DBUtil 1 作业【重要】 利用ORM完成,以下的几个方法非常重要,将来写项目就是这些操作 写项目步骤 搭建环境 创建项目导入依赖工具类数…

《动手学深度学习(PyTorch版)》笔记7.4

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

前端学习第四天

目录 一、复合选择器 1.后代选择器 2.子代选择器 3.并集选择器 4.交集选择器 5.伪类选择器 1.伪类-超链接&#xff08;拓展&#xff09; 二、CSS特性 1.继承性 2.层叠性 3.优先级 1.优先级-叠加计算规则 2.emmet写法 三、背景属性 1.背景图 ​编辑2.背景图平铺方…

【知识整理】一文理解系统服务高可用

一、如何理解高可用 1、什么是高可用 高可用性&#xff08;英语&#xff1a; High Availability&#xff0c;缩写为 HA&#xff09;&#xff0c;指系统无中断地执行其功能的能力&#xff0c;代表系统的可用性程度&#xff0c;是进行系统设计时的准则之一。 2、决定可用性的两…

指针进阶(上)

二级指针 二级指针是用来存放一级指针地址。 如何使用和解引用呢&#xff1f; #include <stdio.h>int main() {int a 5;int* p &a;int** p2 &p;**p2 10;printf("%d\n", a);return 0; }这里的解引用使用两颗星号的原因是&#xff1a;一个星号找到…

Python初学者学习记录——python基础综合案例:数据可视化——动态柱状图

一、案例效果 通过pyecharts可以实现数据的动态显示&#xff0c;直观的感受1960~2019年世界各国GDP的变化趋势 二、通过Bar构建基础柱状图 反转x轴和y轴 标签数值在右侧 from pyecharts.charts import Bar from pyecharts.options import LabelOpts# 构建柱状图对象 bar Bar()…

介绍docker

一&#xff1a;介绍docker&#xff1a; Docker 并没有单独的图形界面&#xff0c;它主要通过命令行来进行管理和操作 1、 docker ps&#xff1a;显示正在运行的容器。 docker images&#xff1a;显示本地的镜像。 docker run&#xff1a;创建并启动一个新容器。 docker stop&a…

台灯学生用哪个牌子好?学生用护眼台灯品牌推荐

晚上学习&#xff0c;有台灯肯定比没台灯好。只要是盏合格的、能用的台灯&#xff0c;都能给你一个稳定又亮堂的环境。但是有些不合格的台灯会给眼睛带来伤害&#xff0c;尤其是学习负担比较重的学生。那有哪些台灯是学生用着比较好用的呢&#xff1f; 一、学生使用护眼台灯的…

2-2 动手学深度学习v2-损失函数-笔记

损失函数&#xff0c;用来衡量预测值和真实值之间的区别。是机器学习里面一个非常重要的概念。 三个常用的损失函数 L2 loss、L1 loss、Huber’s Robust loss 均方损失 L2 Loss l ( y , y ′ ) 1 2 ( y − y ′ ) 2 l(y,y^{\prime})\frac{1}{2}(y-y^{\prime})^{2} l(y,y′)21…

Unity3d Shader篇(三)— 片元半兰伯特着色器解析

文章目录 前言一、片元半兰伯特着色器是什么&#xff1f;1. 片元漫反射着色器的工作原理2. 片元半兰伯特着色器的优缺点优点&#xff1a;缺点&#xff1a; 3. 公式 二、使用步骤1. Shader 属性定义2. SubShader 设置3. 渲染 Pass4. 定义结构体和顶点着色器函数5. 片元着色器函数…

计算机毕业设计 基于SpringBoot的线上教育培训办公系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…