手把手教你上手开源性能监控神器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实现局域网远程监控电脑屏幕的方法

《使用Python实现局域网远程监控电脑屏幕的方法》文章介绍了两种使用Python在局域网内实现远程监控电脑屏幕的方法,方法一使用mss和socket,方法二使用PyAutoGUI和Flask,每种方... 目录方法一:使用mss和socket实现屏幕共享服务端(被监控端)客户端(监控端)方法二:使用PyA

Prometheus+cpolar如何在手机上也能监控服务器状态?

《Prometheus+cpolar如何在手机上也能监控服务器状态?》本文强调了通过Cpolar这一内网穿透工具,轻松突破Prometheus仅限于局域网访问的限制,实现外网随时随地访问监控数据,教你... 目录前言1.安装prometheus2.安装cpolar实现随时随地开发3.配置公网地址4.保留固定

Python数据验证神器Pydantic库的使用和实践中的避坑指南

《Python数据验证神器Pydantic库的使用和实践中的避坑指南》Pydantic是一个用于数据验证和设置的库,可以显著简化API接口开发,文章通过一个实际案例,展示了Pydantic如何在生产环... 目录1️⃣ 崩溃时刻:当你的API接口又双叒崩了!2️⃣ 神兵天降:3行代码解决验证难题3️⃣ 深度

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

CPython与PyPy解释器架构的性能测试结果对比

《CPython与PyPy解释器架构的性能测试结果对比》Python解释器的选择对应用程序性能有着决定性影响,CPython以其稳定性和丰富的生态系统著称;而PyPy作为基于JIT(即时编译)技术的替... 目录引言python解释器架构概述CPython架构解析PyPy架构解析架构对比可视化性能基准测试测

Java JAR 启动内存参数配置指南(从基础设置到性能优化)

《JavaJAR启动内存参数配置指南(从基础设置到性能优化)》在启动Java可执行JAR文件时,合理配置JVM内存参数是保障应用稳定性和性能的关键,本文将系统讲解如何通过命令行参数、环境变量等方式... 目录一、核心内存参数详解1.1 堆内存配置1.2 元空间配置(MetASPace)1.3 线程栈配置1.

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”