手把手教你上手开源性能监控神器Arthas

2024-05-07 13:44

本文主要是介绍手把手教你上手开源性能监控神器Arthas,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

在日常的工作中,对于商业项目尤其是并发量较高的项目,系统在一些情况下会莫名其妙把CPU打满并且导致服务宕机,虽然90%的情况下,是迭代发版的代码有bug,但是既然有这个情况,线上出现事故了,领导叫你排查一下原因,这时候咋办,你总得知道怎么排查吧,大部分情况下我们根据日志可以查询到一些眉目,但是这种排查一般是只能看到内存溢出这样的原因,那么是哪个方法或者是哪个线程导致的呢,这时候就需要借助阿里巴巴的Arthas神器,这里只是众多解决方式中的一种,其他方式请自行尝试,能解决问题的方式都是最优解。

为什么选择Arthas

通常,本地开发环境无法访问生产环境。如果在生产环境中遇到问题,则无法使用 IDE 远程调试。更糟糕的是,在生产环境中调试是不可接受的,因为它会暂停所有线程,导致服务暂停。我们要深究原因,如果重启服务的话,可能就不能复现这个问题,从而导致你的服务一致存在这个隐患。

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

Arthas可以解决什么问题

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

Arthas 是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

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

Arthas的实操

下载arthas工具

方式一: 通过Linux命令下载
wget https://alibaba.github.io/arthas/arthas-boot.jar
方式二: 直接下载jar包,再上传服务器

下载地址: arthas-boot.jar下载地址

下载好之后,通过以下命令运行:

java -jar arthas-boot.jar 

运行arthas-boot.jar之后,arthas会检测当前服务器上的Java进程,并将进程列表展示出来,用户输入对应的编号(1、2、3、4…)进行选择,然后回车(见红色框,进程[1]就是tomcat进程)。比如我这里只有一个java进程,直接输入1,然后回车即可,这样相当于就进入arthas服务了

拓展

如果你的服务是通过docker容器的形式部署,那你需要先进入到你需要排查的服务容器内,再运行arthas,一般我们值把宿主机的arthas-boot.jar复制到容器内,命令如下:

docker cp arthas-boot.jar 955c815a8848:/opt/check

说明:955c815a8848是你的容器ID,你需要替换成你自己的容器ID, /opt/check是你的容器内的文件夹目录,你可以选择自己的路径即可,后续其他操作都是一样的

arthas常用的命令

  • dashboard

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

 dashboard

效果如下,三个区域分别是:线程情况 ,内存情况,运行环境

参数说明

这里可以看到线程情况和JVM内存情况

id :线程IDname : 线程名state : 线程状态CPU% : 线程使用CPU的百分比heap : 使用情况ps_eden_space :伊甸园内存情况ps_survivor_space : 幸存区内存情况ps_old_gen : 老年区内存情况

当我们发现某个线程的CPU占用不正常的时候,可以通过 thread来获取进程的 Class情况

  • 查看线程监控

常用参数

(1)输入thread会显示所有线程的状态信息

(2)输入thread -n 3会显示当前最忙的3个线程,可以用来排查线程CPU消耗

(3)输入thread -b 会显示当前处于BLOCKED状态的线程,可以排查线程锁的问题

  • 函数耗时监控
    通常说一个接口性能不好,其实就是接口响应时间比较长造成的,具体代码中哪个函数耗时比较长呢?可以使用trace功能来监控一下

解释:

-j 参数可以过滤掉jdk自身的函数

cn.testfan.perf.beihe.pinter.http.CaseController是接口所在的类

time是接口的入口函数

通过圈起来的部分可以看到,接口的入口函数time总耗时371ms

其中getDataFromDb函数耗时200ms

getDataFromRedis函数耗时100ms

getDataFromOuter函数耗时50ms

process函数耗时20ms

很明显,最慢的函数已经找到了,接下来就要去对代码进行进一步分析,然后再进行优化。

  • 通过 jad 来反编译
    我们可以通过 jad 类全名 来反编译代码,进行问题排查

  • watch监听返回值

通过watch 类名#方法名 命令来查看demo.MathGame#primeFactors函数的返回值:

  • 更多命令功能
更多功能
arthas还提供了更多的功能,比如:
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

写在最后

以上就是关于arthas的实操应用讲解,了解一个思路就行,真正排查的时候差不多也只用到这几个步骤,当然深入了解一下总是好的。如果想要掌握基本的排查方式,最好动手走一个,底层码农之间的成色差异,其实不是什么天赋的差异,大多数是付出的时间差异。分享不易,不要白嫖哦,给个三连,感激不尽。欢迎持续关注"安前码后",更多内容持续输出中,下期再见!

这篇关于手把手教你上手开源性能监控神器Arthas的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

使用zabbix进行监控网络设备流量

《使用zabbix进行监控网络设备流量》这篇文章主要为大家详细介绍了如何使用zabbix进行监控网络设备流量,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装zabbix配置ENSP环境配置zabbix实行监控交换机测试一台liunx服务器,这里使用的为Ubuntu22.04(

Ubuntu系统怎么安装Warp? 新一代AI 终端神器安装使用方法

《Ubuntu系统怎么安装Warp?新一代AI终端神器安装使用方法》Warp是一款使用Rust开发的现代化AI终端工具,该怎么再Ubuntu系统中安装使用呢?下面我们就来看看详细教程... Warp Terminal 是一款使用 Rust 开发的现代化「AI 终端」工具。最初它只支持 MACOS,但在 20

springboot健康检查监控全过程

《springboot健康检查监控全过程》文章介绍了SpringBoot如何使用Actuator和Micrometer进行健康检查和监控,通过配置和自定义健康指示器,开发者可以实时监控应用组件的状态,... 目录1. 引言重要性2. 配置Spring Boot ActuatorSpring Boot Act

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

IDEA中的Kafka管理神器详解

《IDEA中的Kafka管理神器详解》这款基于IDEA插件实现的Kafka管理工具,能够在本地IDE环境中直接运行,简化了设置流程,为开发者提供了更加紧密集成、高效且直观的Kafka操作体验... 目录免安装:IDEA中的Kafka管理神器!简介安装必要的插件创建 Kafka 连接第一步:创建连接第二步:选

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义