Arthas线上环境问题排查定位工具

2024-06-17 00:36

本文主要是介绍Arthas线上环境问题排查定位工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、Arthas简介

Arthas是alibaba推出的一款JVM性能诊断调优的工具,也可以称之为是线上监控诊断产品,通过全局的视角可以实时的查看应用load、内存、GC、线程的状态信息,并且还可以在不修改应用代码的前提下,对业务问题进行诊断,包括查看方法调用的出参、入参、异常等,监测方法执行耗时,类加载信息等等,大大提升了线上问题的排查效率。

二、Arthas场景

一般情况下,本地开发环境不能访问生产环境,如果在生产环境中遇到了问题,那么就无法使用IDE远程调试,更加糟糕的是在生产环境中调试是不可接受的,因为它会停止所有线程,导致服务暂停。

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

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

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

三、Arthas解决哪些问题?

  • 这个类从哪个jar包加载的,为什么各种报错
  • 我改的代码为什么没有执行到?难道是我没有Commit?分支搞错了?
  • 遇到问题无法在线上debug,难道只能通过加日志在重新发布吗?
  • 线上遇到某个用户的数据处理有问题,但线上同样无法debug,线下无法重现
  • 是否有一个全局视角来查看系统的运行状况?
  • 有什么办法可以监控到JVM的实时运行状态?
  • 怎么快速定位应用的热点,生成火焰图?
  • 怎样直接从JVM内查找某个类的实例?

四、Arthas下载

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

五、Arthas启动

  • 启动arthas-boot.jar
java -jar arthas-boot.jar
  • 选择监控的应用进程

    • 这个时候会列出所有可监控的应用进程,输入对应的编号即可

    在这里插入图片描述

六、全局监控仪表

  • dashboard

    • dashboard命令,可以实时的显示出所有线程的情况、内存的情况、运行环境信息、cpu占用等情况。

    在这里插入图片描述

  • thread

    • thread命令,可以显示出所有线程信息

    在这里插入图片描述

  • thread id

    • thread 线程对应的ID,可以显示线程的具体信息

    在这里插入图片描述

七、方法级别监控

我们在调优的时候,需要定位到应用的具体方法,所以arthas提供了一套对于方法的监控,但是方法的监控我们需要手动输入很多参数,为了方便,我们就在IDEA中安装arthas idea插件,可以自动生成带参数的命令,只需要复制即可。

1、安装插件

在这里插入图片描述

在这里插入图片描述

2、watch

watch命令用来查看方法的一些具体信息,比如入参、出参、异常等情况。

-n:执行次数

-x:每次调用监控的层级深度

watch com.cy.example.Demo testHandler '{params,returnObj,throwExp}'  -n 5  -x 3 

在这里插入图片描述

3、trace

trace命令用于查看方法的运行耗时

-n:执行次数

trace com.cy.example.Demo testHandler  -n 5 --skipJDKMethod false 

在这里插入图片描述

3、stack

stack命令用于查看该方法在哪被调用了

-n:执行次数

stack com.cy.example.Demo testHandler  -n 5 

在这里插入图片描述

八、类级别监控

1、sc

sc命令:查看JVM已加载的类信息

# 显示JVM已加载的类信息
sc com.cy.example.Demo # 打印出类信息
sc -d com.cy.example.Demo

在这里插入图片描述

2、sm

sm命令:查看JVM已加载类的方法信息

# 查看加载类的方法信息
sm com.cy.example.Demo# 查看加载类的方法详细信息
sm -d com.cy.example.Demo# 查看加载类的指定方法信息
sm com.cy.example.Demo testHandler# 查看加载类的指定方法的详细信息
sm -d com.cy.example.Demo testHandler

在这里插入图片描述

在这里插入图片描述

九、线上问题定位

当项目已经上线,出了问题我们需要进行问题定位,可以从以下几点进行查看:

  • 代码版本是否引入正确
  • CPU占用率过高,哪个程序占用过高
  • 死锁的问题

1、反编译

反编译的方式很多,但是大多数都是在开发环境进行反编译,我们需要在线上环境进行反编译,从而能看出我们的代码版本是否引入正确,可能代码版本是1.4,我们引入的是1.3

jad 反编译类名
jad com.cy.example.Demo

在这里插入图片描述

2、CPU占用率

# 展示出CPU占用率从高到低指定个数的线程
thread -n 3

在这里插入图片描述

3、死锁

可以通过命令直接查看所有的死锁

我这里没有写死锁的代码,因此没有死锁

thread -b

在这里插入图片描述

十、线上代码热更新

在不停止线上服务的情况下修改代码

需要注意的是,热更新的字节码文件不能新增属性和方法,并且热更新后原来的类不能恢复

# 通过jad对文件进行反编译,并且输出到其他地方
jad Demo > /usr/NewDemo.java# 对NewDemo.java进行更改代码# 使用mc在内存中对NewDemo.java进行编译
mc /usr/NewDemo.java -d /usr# 热更新
redefine /usr/NewDemo.class

这篇关于Arthas线上环境问题排查定位工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1067992

相关文章

SQLite3命令行工具最佳实践指南

《SQLite3命令行工具最佳实践指南》SQLite3是轻量级嵌入式数据库,无需服务器支持,具备ACID事务与跨平台特性,适用于小型项目和学习,sqlite3.exe作为命令行工具,支持SQL执行、数... 目录1. SQLite3简介和特点2. sqlite3.exe使用概述2.1 sqlite3.exe

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件