手把手教你上手开源性能监控神器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

相关文章

基于Python+PyQt5打造一个跨平台Emoji表情管理神器

《基于Python+PyQt5打造一个跨平台Emoji表情管理神器》在当今数字化社交时代,Emoji已成为全球通用的视觉语言,本文主要为大家详细介绍了如何使用Python和PyQt5开发一个功能全面的... 目录概述功能特性1. 全量Emoji集合2. 智能搜索系统3. 高效交互设计4. 现代化UI展示效果

JVisualVM之Java性能监控与调优利器详解

《JVisualVM之Java性能监控与调优利器详解》本文将详细介绍JVisualVM的使用方法,并结合实际案例展示如何利用它进行性能调优,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1. JVisualVM简介2. JVisualVM的安装与启动2.1 启动JVisualVM2

Java使用MethodHandle来替代反射,提高性能问题

《Java使用MethodHandle来替代反射,提高性能问题》:本文主要介绍Java使用MethodHandle来替代反射,提高性能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录一、认识MethodHandle1、简介2、使用方式3、与反射的区别二、示例1、基本使用2、(重要)

Python+PyQt5实现MySQL数据库备份神器

《Python+PyQt5实现MySQL数据库备份神器》在数据库管理工作中,定期备份是确保数据安全的重要措施,本文将介绍如何使用Python+PyQt5开发一个高颜值,多功能的MySQL数据库备份工具... 目录概述功能特性核心功能矩阵特色功能界面展示主界面设计动态效果演示使用教程环境准备操作流程代码深度解

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

使用Python实现实时金价监控并自动提醒功能

《使用Python实现实时金价监控并自动提醒功能》在日常投资中,很多朋友喜欢在一些平台买点黄金,低买高卖赚点小差价,但黄金价格实时波动频繁,总是盯着手机太累了,于是我用Python写了一个实时金价监控... 目录工具能干啥?手把手教你用1、先装好这些"食材"2、代码实现讲解1. 用户输入参数2. 设置无头浏

Java的"伪泛型"变"真泛型"后对性能的影响

《Java的伪泛型变真泛型后对性能的影响》泛型擦除本质上就是擦除与泛型相关的一切信息,例如参数化类型、类型变量等,Javac还将在需要时进行类型检查及强制类型转换,甚至在必要时会合成桥方法,这篇文章主... 目录1、真假泛型2、性能影响泛型存在于Java源代码中,在编译为字节码文件之前都会进行泛型擦除(ty

Python+PyQt5开发一个Windows电脑启动项管理神器

《Python+PyQt5开发一个Windows电脑启动项管理神器》:本文主要介绍如何使用PyQt5开发一款颜值与功能并存的Windows启动项管理工具,不仅能查看/删除现有启动项,还能智能添加新... 目录开篇:为什么我们需要启动项管理工具功能全景图核心技术解析1. Windows注册表操作2. 启动文件

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指