Arthas常用功能及一次线上问题排查
一、Arthas简介
Arthas是Alibaba开源的Java诊断工具,功能很强大,它是通过Agent方式来连接运行的Java进程、主要通过交互式来完成功能。
https://arthas.aliyun.com/doc/stack.html
首先贴出官方文档,自己使用也不多,主要用于一次线上问题排查
二、运行
java -jar arthas-boot.jar ,运行Arthas
选择要粘附的进程,输入编号即可

使用以下两个命令其中一个查看java程序的进程号
ps -ef
jps
备注:也可以通过浏览器连接Arthas,只是执行命令的时候需要加--target-ip参数
三、dashboard
输入以下命令进入仪表盘,监控线程,内存状态,GC等信息

四、thread
打印全部线程:thread
打印最忙的前10条线程: thread -n 10
根据线程号打印: thread 20
找出阻塞其他线程的线程 注意, 目前只支持找出synchronized关键字阻塞住的线程, 如果是java.util.concurrent.Lock, 目前还不支持。
thread -b
如果响应慢,阻塞状态的线程比较多,我们需要重点关注
五、查看已经加载的类(如果没有代码权限,使用jad)
sc com.XXX.sgw.controller.*
sc com.XXX.controller.AccessLogController

六、追踪方法堆栈调用时间
跟踪方法内部调用,输出各个节点的耗时,主要用于响应慢的时候
trace comXXX.controller.api.ServiceGatewayV1Controller list
trace com.XXX.service.ServiceGatewayV1Service customizeQuery m -n 2 ,一般需要输出多次结果,所以这里可以通过-n指定结果数量

七、查看程序调用出入参
类似于debug,查看被测方法的参数和返回值
watch com.XXX.controller.api.ServiceGatewayV1Controller list "{params[0],params[1],returnObj}"
watch com.XXX.service.ServiceGatewayV1Service customizeQuery "{params[0],params[1],params[2],returnObj}"

八、回溯方法执行
下面关注:耗时、IS-RET为false表示失败
tt -t com.XXX.vo.PageVo getPageSize
tt -i 1037 -w "target.getPageSize()"
九、查看方法被调用路径
stack com.XXX.service.impl.PostgresqlServiceImpl customQuery

十、反编译线上代码
jad --source-only com.yingzi.data.sgw.controller.api.ServiceGatewayV1Controller
jad --source-only com.yingzi.data.sgw.controller.api.ServiceGatewayV1Controller getDataByAlgorithm
十一、以3秒为一个时间窗口,统计时间窗口内调用次数,成功次数,失败次数,平时RT时间。用于监控方法的执行情况
monitor -c 3 com.yingzi.data.sgw.controller.api.ServiceGatewayV1Controller list

十二、JVM
重点关注下死锁(DEADLOCK-COUNT,下面不为0,表示有死锁)
根据下面的栈信息,可以看到,这两个线程互相请求被对方占用未释放的资源导致了死锁。举个例子,现实中很少

十三、profiler(火焰图)
系统cpu高的时候,我们可以看系统调用,相比于perf命令,profiler的步骤要更简便点,
profiler start,启动,默认是生成cpu的火焰图,which event to trace (cpu, alloc, lock, cache-misses etc.), default value is cpu
profiler stop,停止,可以看到生成的svg文件路径

Arthas常用功能及一次线上问题排查的更多相关文章
- 线上问题排查神器 Arthas
线上问题排查神器 Arthas 之前介绍过 BTrace,线上问题排查神器 BTrace 的使用,也说它是线上问题排查神器.都是神器,但今天这个也很厉害,是不是更厉害不好说,但是使用起来非常简单.如果 ...
- Java线上问题排查神器Arthas实战分析
概述 背景 是不是在实际开发工作当中经常碰到自己写的代码在开发.测试环境行云流水稳得一笔,可一到线上就经常不是缺这个就是少那个反正就是一顿报错抽风似的,线上调试代码又很麻烦,让人头疼得抓狂:而且deb ...
- Java线上问题排查思路及Linux常用问题分析命令学习
前言 之前线上有过一两次OOM的问题,但是每次定位问题都有点手足无措的感觉,刚好利用星期天,以测试环境为模版来学习一下Linux常用的几个排查问题的命令. 也可以帮助自己在以后的工作中快速的排查线上问 ...
- java:线上问题排查常用手段(转)
出处:java:线上问题排查常用手段 一.jmap找出占用内存较大的实例 先给个示例代码: import java.util.ArrayList; import java.util.List; imp ...
- JVM 线上故障排查
JVM 线上故障排查 Linux 1.1 CPU 1.2 内存 1.3 存储 1.4 网络 一.CPU 飚高 寻找原因 二.内存问题排查 三.一般排查问题的方法 四.应用场景举例 4.1 怎么查看某个 ...
- 【转】又一次线上 OOM 排查经过
又一次线上OOM排查经过 最近线上一个服务又出现了频繁Full GC的情况,导致提供的业务经常超时.问题出现非常不稳定,经过两周的时候,终于又捕捉到了一次Full GC,于是联系运维做Heap Dum ...
- Java架构师线上问题排查,这些命令程序员一定用得到!
Java架构师线上问题排查,这些命令程序员一定用得到! 线上问题排查,以下场景,你遇到过吗? 一.了解机器连接数情况 问题:1.2.3.4的sshd的监听端口是22,如何统计1.2.3.4的sshd服 ...
- JVM线上问题排查
前言 本文介绍服务器内运行的 Java 应用产生的 OOM 问题 和 CPU 100% 的问题定位 1. 内存 OOM 问题定位 某Java服务(比如进程id pid 为 3320)出现OOM,常见的 ...
- BTrace:线上问题排查工具
BTrace简介 GitHub地址:BTrace 下载地址:v1.3.11.3 官方使用教程:Btrace使用教程 使用场景 BTrace 是一个事后工具,所谓事后工具就是在服务已经上线了,但是发现存 ...
随机推荐
- 学习SVN03
SVN版本控制系统最佳实践 第1章SVN介绍及应用场景 1.1什么是SVN(Subversion) Svn(subversion)是近年来崛起非常优秀的版本管理工具,与CVS管理工具一样,SVN是 ...
- Python - 数据存储与数据库简介
- C++ | 智能指针初探
智能指针初探 在 c/c++ 语言中有一种特殊的类型--指针类型. 指针作为实体,是一个用来保存一个内存地址的计算机语言中的变量.它可以直接对内存地址中的数据进行操作,是一种非常灵活的变量.指针被誉为 ...
- numpy入门—Numpy的核心array对象以及创建array的方法
Numpy的核心array对象以及创建array的方法 array对象的背景: Numpy的核心数据结构,就叫做array就是数组,array对象可以是一维数组,也可以是多维数组: Python的Li ...
- 微信小程序 使用filter过滤器几种方式
由于微信小程序 技术生态比较闭合,导致很多 现代前端框架很多积累出的成果都没有实现(可能未来会逐一实现). 用惯了现代 再耍小程序 总感觉很不顺手. 需要结果的请直接看最后的WXS View Filt ...
- web音频流转发之AudioNode
前言 上一章地址: web音频流转发之音频源下一张地址:web音频流转发之音视频直播在这一章我说几个我们需要用到的音频处理模块也就3个吧,包括我们转发流是需要用到的核心模块.更多模块请看MDN,或者看 ...
- PCI总线基本概念与历史
PCI总线历史 这里必须说下 PCI-SIG,1991 年下半年,Intel 公司,并联合IBM.Compaq.AST.HP.DEC 等100 多家公司成立了PCI 集团 并且Intel公司首先提出了 ...
- JDBC 4.0 开始Java操作数据库不用再使用 Class.forName加载驱动类了
JDBC 4.0 开始Java操作数据库不用再使用 Class.forName加载驱动类了 代码示例 转自 https://docs.oracle.com/javase/tutorial/jdbc/o ...
- Java基础之浅谈集合
Java基础知识.关于List.Set.Map接口的了解,以及ArrayList.LinkedList.HashSet.TreeSet.HashMap.TreeMap...
- python向上取整以50为界
import math def getNum(limit_num,num): if num%limit_num==0: print(num) else: num=math.ceil(num/limit ...