Arthas:阿里出品,线上问题快速搞定!

news2024/11/15 17:59:26

前面我们通过JVM线程分析及内存分析来让大家从服务器资源异常情况下排查代码问题,类似这种的解决方式,更多的是在服务器资源占用已经异常显现,我们就可以按照这种方式去排查和解决。

但实际工作中,可能会出现:接口的TPS很低,但是服务器的各项资源占用率也很低,我们很难通过CPU占用率和内存占用率异常去排查问题。那这里,我们再推荐一种排查工具-Arthas,Arthas 不仅仅能够让我们看到 JVM 的运行状态去定位性能问题,对于很多线上代码异常问题的排查,Arthas 也是手到擒来。

一、Arthas是什么?

Arthas 是阿里提供的一款 Java 开源诊断工具。能够查看应用的线程状态、JVM 信息等;并能够在线对业务问题诊断,比如查看方法调用的出入参、执行过程、抛出的异常、输出方法执行耗时等,极大的提升了线上问题的排查效率。

二、Arthas的使用

1、下载Arthas

我们这里使用命令下载:

wget https://alibaba.github.io/arthas/arthas-boot.jar

Arthas 提供的程序包是以 jar 的形式给出,因此我们可以看出 Arthas 本质也是个 Java 应用。

2、启动

然后使用 java -jar 命令启动,命令如下:

java -jar arthas-boot.jar

输入启动命令后会跳出选项选择要监控的后台 Java 进程,如下代码所示:

[root@JD ~]# java -jar arthas-boot.jar

[INFO] arthas-boot version: 3.3.3

[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.

  • [1]: 689 cctestplatform.jar

[2]: 31953 unimall.jar

[3]: 14643 sentinel-dashboard-1.7.2.jar

[4]: 20421 org.apache.zookeeper.server.quorum.QuorumPeerMain

[5]: 10694 demo-0.0.1-SNAPSHOT.jar

其中序号表示的就是 Arthas 自动识别的所在服务器的 Java 进程,然后输入要监控的进程的序号并回车,Arthas 便会接着启动,出现 Arthas Logo 之后便可以使用 Arthas 了,如下代码所示:

5

[INFO] arthas home: /root/.arthas/lib/3.4.4/arthas

[INFO] Try to attach process 10694

[INFO] Attach process 10694 success.

[INFO] arthas-client connect 127.0.0.1 3658

wiki https://arthas.aliyun.com/doc

tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html

version 3.4.4

pid 10694

三、Arthas实战演示

1、利用Arthas定位死锁问题

在排查问题前我们先了解下死锁,死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。如果没有外力的作用,那么死锁涉及的各个线程都将永久处于循环等待状态,导致业务无法预期运行,所以我们的代码要避免死锁的情况。

死锁代码示意如下:

    //线程Lock1代码示意

    while(true){

        synchronized("obj1"){

            Thread.sleep(3000);//获取obj1后先等一会儿,让Lock2有足够的时间锁住obj2

            synchronized("obj2"){

                System.out.println("Lock1 lock obj2");

            }

        }

    }



    //线程Lock2代码示意

    while(true){

        synchronized("obj2"){

            Thread.sleep(3000); //获取obj2后先等一会儿,让Lock1有足够的时间锁住obj1

            synchronized("obj1"){

                System.out.println("Lock2 lock obj1");

            }

        }

    }

把以上代码放到服务器中执行,然后我们可以使用 Arthas 的 jvm 命令查看到线程死锁数目为 2,说明程序发生了死锁,如下图所示:

接下来我们输入 thread -b 命令查看当前阻塞其他线程的线程,然后我们可以看到 Lock 1 被阻塞了,访问的资源被 Lock 2 占用,如图所示,根据提示的行数我们便能找到死锁位置,对代码进行优化。

2、使用trace查看方法耗时

写几个不同循环次数的方法,分别代表方法耗时不同,代码如下:

//示例代码,timeCost是个接口

public String timeCost(){

    cost1();

    cost2();

    cost3();

    .......

}

private void cost3() {

//进行200万次循环......

}

private void cost2() { 

 //进行10万次循环......

}

private void cost1() {

 //进行10次循环...... 

}

部署之后我们使用 trace 来查找最耗时的方法,在此过程中需要知道包名、类名,以及方法的名字。上述代码方法所在包名为 com.cctest.arthas_demo.controller,类名为 StressSceneController,所以我们需要输入如下 trace 命令:

trace

com.cctest.arthas_demo.controller.StressSceneController timeCost

输完命令后回车,然后 arthas 程序就进入了等待访问状态。这时候访问接口 /timeCost,我们就可以看到被测程序台在疯狂打印日志,等结束之后,arthas 命令窗口便输出了各方法耗时时间,如图所示:

我们可以看到 timeCost 方法总耗时 258391ms:

  • cost 1 调用耗时 9 ms;

  • cost 2 调用耗时 13909 ms;

  • cost 3 调用耗时 244472 ms。

这里我们就可以看出const2和const3耗时严重,既然已经定位到方法了,那基本上优化的思路也就有了。

3、使用watch命令查看被测方法的入参和返回值

当遇到线上数据问题时,我们一般有两种查找问题的途径:

  • 在开发环境中模拟线上数据来复现问题,不过因为环境等各方面的不同,很多情况下模拟数据复现都有难度;

  • 在生产日志里查找线索,如果没有相关方法的入参,以及没打印返回值的话,就难以找到有效的信息。

这两种传统查找问题的方式都存在一定的局限性,而使用 Arthas 的 watch 命令可以很方便地根据观察方法入参和出参来判断是否正确定位了代码问题。

比如如下的方法:

@GetMapping("/login")

public String login(@RequestParam(value="userName") String userName, @RequestParam(value="pwd")String pwd){

    return  "OK";

}

然后我们输入 watch 命令,其中 login 后面指定了需要控制台输出的内容,params[0] 代表第一个参数,如果参数有多个,只要 params 加上下标即可,returnObj 代表返回值,示意代码如下:

watch com.cctest.arthas_demo.controller.StressSceneController login "{params[0],params[1],returnObj}"

输入上述命令后的返回信息如下:

4、使用tt命令定位异常调用

tt 与上面的 watch 的命令有些类似,都可以排查函数的调用情况。但是对于函数调用 n 次中有几次是异常情况,用 watch 就没有那么方便,使用 tt 命令就可以很方便地查看异常的调用及其信息。

tt -t com.cctest.arthas_demo.controller.StressSceneController login

四、通过Web界面操作Arthas

Arthas 提供了客户端访问程序 Arthas Tunnel Server,这样我们便可以操作 Arthas 了。

1、下载

首先,我们需要下载arthas-tunnel-server.jar。

2、部署

把 Arthas Tunnel Server 部署到能和线上服务器通信的目标服务器;

3、启动

确保线上服务器启动了 Arthas,线上启动 Arthas 的操作命令,如下所示:

java -jar arthas-boot.jar --tunnel-server 'ws://目标服务器ip:目标服务器port/ws' --target-ip

4、访问界面

在浏览器中输入 http://目标服务器ip:目标服务器port,就可以访问 WebConsole

5、界面操作与命令行操作有何区别呢?

通过 Web 方式使用 Arthas 与我们上面所说的非 Web 的方式最大的不同:

  • Web 方式可以授权连接之后通过浏览器输入 Arthas 命令;

  • 非 Web 方式则是直接 ssh 连接服务器输入命令。

两者比较起来 Web 方式虽然操作麻烦些,不过在权限管控比较严格的情况下提供了使用 Arthas 的可行性。

文章将持续更新,欢迎关注公众号:服务端技术精选。欢迎点赞、关注、转发

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

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

相关文章

什么是网络安全CTF?

什么是网络安全CTF? CTF 的意义: 如何入门 CTF: 推荐的在线 CTF 平台: 什么是网络安全CTF? CTF (Capture The Flag) 是一种网络安全竞赛,参赛者需要解决各种安全挑战,例如破解密码、利用漏洞、分析恶意软件等&am…

二极管钳位型光伏逆变并网建模simulink仿真

整理了二极管钳位型光伏逆变并网建模simulink仿真,效果明显,附赠仿真报告。适合小白 二极管钳位型光伏逆变并网是将光伏发电系统中的直流电能转换为交流电能,并与电网连接。在此仿真中使用最大功率点追踪(MPPT)技术&a…

【C语言】编译与链接

1.翻译环境与运行环境 在ANSI C的任何一种实现中,存在两个不同的环境。 1.翻译环境,在这个环境中源代码被转换为可执行的机器指令(二进制指令) 2.执行环境,它用于实际执行代码 2.翻译环境 那么翻译环境是怎么将源代码…

【Docker】docker部署lnmp和wordpress网站

环境准备 docker:192.168.67.30 虚拟机:4核4G systemctl stop firewalld systemctl disable firewalld setenforce 0 安装docker #安装依赖包 yum -y install yum-utils device-mapper-persistent-data lvm2 #设置阿里云镜像 yum-config-manager --add…

vue3学习笔记-快速上手

创建第一个vue3的应用 之前看书学习vue,书籍对应的版本是vue2,今天群里看小伙伴聊天,觉得他们说得对 ,反正是从零开始学,而且vue2都不维护了,那为什么不直接学习vue3呢,于是乎,又开启了从0学vue3之路。 参考…

Linux之进程间通信(二)

system V system V共享内存是内核中专门设计的通信的方式, 粗粒度划分操作系统分为进程管理, 内存管理, 文件系统, 驱动管理.., 粒度更细地分还有 进程间通信模块. 对于操作系统, 通信的场景有很多, 有以传送数据, 快速传送数据, 传送特定数据块, 进程间协同与控制以目的, 它…

一键设置jdk环境脚本

自动化脚本 一、使用方法 创建一个txt文本,放在和jdk存放的同一目录下,复制粘贴进我的代码,利用全局替换,将jdk1.8,改成你自己的jdk包名字,再重新把这个文件保存为.vbs文件。然后运行就行了 MsgBox "Runing s…

线上社交app的搭建,圈子社交系统,小程序+app+H5三端,源码交付,支持二开!

在科技飞速发展的大背景下,年轻人社交不再局限于面对面,线上社交app已深入各大年轻人的手机中。相比于传统交友方式,线上社交app为用户提供了更加新奇的交友体验。同时,它还可以吸引更多的朋友,提高用户的整体交友体验…

第4篇:创建Nios II工程之Hello_World<三>

Q:接着我们再来完成Nios II软件工程设计部分。 A:从Quartus Tools选择Nios II Software Build Tools for Eclipse,打开Nios II SBT软件,Workspace指定到hello_world工程的software文件夹路径;再从File-->New-->…

Java学习13

目录 一.内部类: 1.概念: 2.内部类的分类: (1)定义在外部类的局部位置上(通常在方法体中): 1. 局部内部类(有类名) 2.匿名内部类(无类名-重点!…

Linux 基础命令使用创建用户

浏览网站的时候图片,看到一个小练习。创建用户分别位于不同的用户组。 解答下面的题目 2、建立用户使用 useradd,设置密码使用passwd的命令。大概不会使用命令可以借助man来解答。 先建立用户组: groupadd group1 # group1 不存在先建立&…

Redis底层数据结构之ZSkipList

目录 一、概述二、ZSkipList结构三、和平衡树和哈希表的对比 redis底层数据结构已完结👏👏👏: ☑️redis底层数据结构之SDS☑️redis底层数据结构之ziplist☑️redis底层数据结构之quicklist☑️redis底层数据结构之Dict☑️redis…

可替代IBM DOORS的现代化需求管理解决方案Jama Connect,支持数据迁移及重构、实时可追溯性、简化合规流程

作为一家快速发展的全球性公司,dSPACE一直致力于寻找保持领先和优化开发流程的方法。为推进其全球现代化计划,dSPACE开始寻找可以取代传统需求管理平台(IBM DOORS)的需求管理解决方案。 通过本次案例,您将了解dSPACE为…

【YOLO 系列】基于YOLO V8的火灾烟雾监控检测识别系统【python源码+Pyqt5界面+数据集+训练代码】

摘要: 火灾烟雾的及时检测对于人们的生命财产安全至关重要。然而,在大多数情况下,火灾往往在被发现时已经进展到了难以控制的阶段,这导致了严重的后果。为了解决这一问题,我们提出了基于深度学习技术的火灾烟雾检测系…

前端开发攻略---介绍HTML中的<dialog>标签,浏览器的原生弹框。

1、演示 2、介绍 <dialog> 标签用于定义对话框&#xff0c;即一个独立的窗口&#xff0c;通常用来显示对话框、提示框、确认框等弹出式内容。在对话框中&#xff0c;可以包含文本、表单元素、按钮等内容&#xff0c;用户可以和这些内容进行交互。 3、兼容性 4、示例代码 …

03-MVC执行流程-参数解析与Model

重要组件 准备Model&#xff0c;Controller Configuration public class WebConfig {ControllerAdvicestatic class MyControllerAdvice {ModelAttribute("b")public String bar() {return "bar";}}Controllerstatic class Controller1 {ResponseStatus(H…

现代永磁同步电机控制原理pdf及全套matlab仿真模型

现代永磁同步电机控制原理pdf及matlab仿真模型。全书包含SVPWM, DTC, Lun, smo, EKF, HFI等经典控制算法。将书中10章节涉及到的模型复原搭建模型。 模型获取链接&#xff1a;现代永磁同步电机控制原理pdf及全套matlab仿真模型

电商API数据采集接口||大数据的发展,带动电子商务产业链,促进了社会的进步

最近几年计算机技术在诸多领域得到了有效的应用&#xff0c;同时在多方面深刻影响着我国经济水平的发展。除此之外&#xff0c;人民群众的日常生活水平也受大数据技术的影响。 主流电商API数据采集接口||在这其中电子商务领域也在大数据技术的支持下&#xff0c;得到了明显的进…

windows环境下DVWA靶场搭建

目录 一&#xff0c;安装PHPstudy 二&#xff0c;DVWA靶场上传 一&#xff0c;安装PHPstudy 具体安装步骤&#xff0c;请看上篇文章https://blog.csdn.net/m0_72210904/article/details/138258609?spm1001.2014.3001.5501 二&#xff0c;DVWA靶场上传 压缩包&#xff1a;&…

计算机混合运算(计算器)

学习贺利坚老师,计算机混合运算, 做出处理混合运算 数据结构例程——表达式求值&#xff08;用栈结构&#xff09;_用栈表达式求值-CSDN博客文章浏览阅读1.5w次&#xff0c;点赞14次&#xff0c;收藏61次。本文针对数据结构基础系列网络课程(3)&#xff1a;栈和队列中第5课时栈…