这四个问题场景你会排查原因吗?看看高手是如何使用 Arthas 快速定位原因的!

标签: 问题 原因 看看 | 发表时间:2020-04-04 01:34 | 作者:阿里巴巴云原生
出处:http://weekly.dockone.io

lALPGqGoY4ELYOHNAg7NBDg_1080_526.png

作者 | [张奇(司楚)]

当线上碰到头疼的问题时,还在对着代码一行行的看?真的不太时髦了啊喂~

1.jpeg

俗话说的好 “问题排查不用愁,Arthas 来帮您忙。” 今天就来说说这个让妈妈再也不用担心我排查问题的 Java 诊断神器——Arthas!

什么是 Arthas?

Arthas 是一款开源在线诊断工具,采用命令行交互模式,支持 web 端在线诊断,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。这是一款开源一年多 GitHub star 2 万,99% 的阿里研发小哥都在用的 Java 终极诊断利器!相对比直接下载使用,我推荐开发者可以试一下通过 IDE插件 Cloud Toolkit 中使用Arthas 来实现一键远程诊断功能。

得益于 Arthas 强大且丰富的功能,让 Arthas 能做的事情超乎想象。下面仅仅列举几项常见的使用情况,更多的使用场景可以在熟悉了 Arthas 之后自行探索。
  • 是否有一个全局视角来查看系统的运行状况?
  • 为什么 CPU 又升高了,到底是哪里占用了 CPU ?
  • 运行的多线程有死锁吗?有阻塞吗?
  • 程序运行耗时很长,是哪里耗时比较长呢?如何监测呢?
  • 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  • 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  • 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  • 有什么办法可以监控到 JVM 的实时运行状态?


Arthas 的命令、功能在其 官方文档有详细介绍,下文将介绍一下近期几个使用场景。

场景 1:定位压测时的性能瓶颈

平时服务器请求都很正常。压测时,依赖的服务、数据库也都没有到达瓶颈,但是机器的 CPU 全部飘红,why?

通过 jstack 命令,只能看到某一时刻的堆栈,没有抓到真凶。


thread 查看当前线程信息,查看线程的堆栈。


thread -n 3 -i 10000 可以统计 10 秒内最忙的 3 个线程,并且打印它们的堆栈,很容易发现问题。最终发现的问题比较简单:日志中打印了 location 的信息,包括 类名、方法名和行号。


动态获取代码的方法名、行号等信息,通常是通过 new Throwable() -> 打印 Throwable 的堆栈 -> 截取堆栈中最顶层的业务代码 -> 拆分字符串获取类、方法、行号等信息, 打印堆栈对性能损耗是比较大的。
2.png

场景 2:检测偶发的超时

有段时间,总是碰到几次偶尔的超时,但是看日志都正常,鹰眼的调用链路都完全 ok,没有哪一步数据库操作或者 HSF 调用是特别慢的。

各种监控统计的时间维度的耗时,都十分正常,无法找到那个 rt 的尖刺。

想到了可能是日志的问题,但是没有证据支撑。


trace 命令能监控每一步的耗时,并且可以配合条件表达式,当耗时超过 xx ms 时打印详细日志。
找台机器,输入命令,后面的就是静等了。再次出现 rt 尖刺时,能够捕捉到耗时的分布情况。

3.png

通过 Arthas 拿到的结果,定位到是日志打印的问题。同步日志改为异步日志后,问题解决。

场景3 debug?那要是动态字节码生成咋办?

之前碰到过一个 json 序列化时输出的数字带不带引号的问题。当时各种 debug、看代码,发现是通过 ASM 动态字节码的方式生成的序列化类。到这完全放弃了,debug 已经无法定位问题了。当时通过另外一种方式避免了这种问题。

反过来看这个问题的时候,我们可以通过 Arthas 的 jad 命令,反编译动态字节码生成的类,结合 watch 等命令,定位排查问题。


jad——反编译指定已加载类的源码
4.png

还可以通过 mc(menory compiler), redefine 命令线上热更新代码,欢迎探索。

有了这些能力就算万能了?不不,接着往下看。

场景 4 做点坏事

在问题排查过程中,发现了日志输出到了控制台,这个对性能的损耗是比较大的。有什么办法,在不发布的情况下紧急解决它?

首先找到对应的 class

```
sc -d ch.qos.logback.core.ConsoleAppender

class-info ch.qos.logback.core.ConsoleAppender
code-source /home/admin/.../lib/logback-core-1.2.3.jar
name ch.qos.logback.core.ConsoleAppender
isInterface false
isAnnotation false
isEnum false
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name ConsoleAppender
modifier public
annotation
interfaces
super-class +-ch.qos.logback.core.OutputStreamAppender
+-ch.qos.logback.core.UnsynchronizedAppenderBase
+-ch.qos.logback.core.spi.ContextAwareBase
+-java.lang.Object
class-loader +-com.taobao..LaunchedURLClassLoader@58dad04a
+-sun.misc.Launcher$AppClassLoader@18b4aac2
+-sun.misc.Launcher$ExtClassLoader@58ceff1
classLoaderHash 5f205aa
```

然后获取 class 的属性信息,找到 appender 列表

ognl -c 5f205aa '@org.slf4j.LoggerFactory@getLogger("root").aai.appenderList'

删除标准输出的 appender

1ognl -c 5f205aa '@org.slf4j.LoggerFactory@getLogger("root").aai.appenderList.remove(0)'

神器:火焰图

排查性能问题的时候,还有一个神器:火焰图通过火焰图,很清晰的看到一段时间内,对每个方法耗时的统计。

5.png

开始使用 Arthas

方式一:通过Cloud Toolkit 实现 Arthas 一键远程诊断

Cloud Toolkit 是阿里云发布的免费本地 IDE 插件,帮助开发者更高效地开发、测试、诊断并部署应用。通过插件,可以将本地应用一键部署到任意服务器,甚至云端(ECS、EDAS、ACK、ACR 和 小程序云等);并且还内置了 Arthas 诊断、Dubbo工具、Terminal 终端、文件上传、函数计算 和 MySQL 执行器等工具。不仅仅有 IntelliJ IDEA 主流版本,还有 Eclipse、Pycharm、Maven 等其他版本。

推荐使用 IDEA 插件下载 Cloud Toolkit 来使用 Arthas: http://t.tb.cn/2A5CbHWveOXzI7sFakaCw8


方式二:直接下载

地址: https://github.com/alibaba/arthas

Arthas 有奖征文开始啦!

6.png

为了让更多开发者开始用上 Arthas 这个Java 诊断神器,这一次我们联合 JetBrains 推出这次有奖征文活动,聊聊这些年你和 Arthas 之间的那些事儿。第一期征文活动将与3月26日——4月26日举办,后续征文活动将持续至2020年12月。

内容方向建议:
  • 使用 Arthas 排查过的问题
  • 对 Arthas 进行源码解读
  • 对 Arthas 提出建议
  • 不限,其它与 Arthas 有关的内容


3 步提交征文

  1. 直接使用 Arthas 或通过 Cloud Tookit 使用 Arthas;
  2. 将你的体验整理成文章发布在掘金社区;
  3. 按要求填写以下表单: http://alibabadeveloper.mikecrm.com/9khcRrs


你将获得的礼物

  • 凡提交满足投稿要求文章的同学,将获得 Arthas Most Valuable User 福袋一份(礼品随机),包含淘公仔、Arthas 贴纸、阿里云 T 恤、JetBrains 周边礼包;
  • 第一期最受欢迎的 top3 的文章,获得天猫精灵一台;
  • 年度 top 20 文章,将有机会获得 cherry 键盘及 JetBrains 提供的包括 Coupon 等周边礼包 。


你将获得的荣誉

除了实物奖励之外,你还会获得
  • 在阿里巴巴云原生公众号和 Arthas 技术社区的首页,展示您的文章及作者介绍模块,让更多的开发者了解你;
  • 成为 Arthas 社区的贡献者,参与社区的日常运营,并作为社区讲师参与 Arthas 线上/线下活动分享。


阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术圈。” 加粗文字

相关 [问题 原因 看看] 推荐:

这四个问题场景你会排查原因吗?看看高手是如何使用 Arthas 快速定位原因的!

- - DockOne.io
当线上碰到头疼的问题时,还在对着代码一行行的看. 俗话说的好 “问题排查不用愁,Arthas 来帮您忙. ” 今天就来说说这个让妈妈再也不用担心我排查问题的 Java 诊断神器——Arthas. Arthas 是一款开源在线诊断工具,采用命令行交互模式,支持 web 端在线诊断,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断.

导致Linux Kernel电源问题原因可能找到

- Hitsmaxft - Solidot
自Linux 2.6.38 kernel开始,移动Linux用户发现电力消耗迅速飚升,电池续航时间迅速减少,这迫使部分用户放弃使用Linux发行版如Ubuntu 11.04,电源退化(regression)问题受到了许多人的关注,在Launchpad上有数百人报告这一bug. phoronix.com执行了一次自动耗电量测试,寻找出问题的根源.

CPU 使用率低高负载的原因,看看这篇!

- - SegmentFault 最新的文章
产生的原因一句话总结就是:等待磁盘I/O完成的进程过多,导致进程队列长度过大,但是cpu运行的进程却很少,这样就体现到负载过大了,cpu使用率低. 下面内容是具体的原理分析:. 在分析负载为什么高之前先介绍下什么是负载、多任务操作系统、进程调度等相关概念. 什么是负载:负载就是cpu在一段时间内正在处理以及等待cpu处理的进程数之和的统计信息,也就是cpu使用队列的长度统计信息,这个数字越小越好(如果超过CPU核心*0.7就是不正常).

八皇后问题算什么,来看看无穷皇后问题吧

- Pstrey - Matrix67: My Blog
    当 1848 年国际象棋玩家 Max Bezzel 提出八皇后问题(eight queens puzzle)时,他恐怕怎么也想不到,100 多年以后,这个问题竟然成为了编程学习中最重要的必修课之一. 八皇后问题听上去非常简单:把八个皇后放在国际象棋棋盘上,使得这八个皇后互相之间不攻击(国际象棋棋盘是一个 8×8 的方阵,皇后则可以朝横竖斜八个方向中的任意一个方向走任意多步).

Google 解释 Google Docs 出现问题的原因:内存管理 bug

- zhipeng - cnBeta.COM
Google Docs在这周又经历了一次小范围的临时下线,再次导致部分用户对云端服务的批评. 其实对一般人来说,自己把电脑弄坏的几率要比云端出问题的几率高的多,当然如果你是一枚装机挨踢男,肯定还是更信任自己的水平,毕竟云端出问题之后只能坐在电脑前面干着急帮不上任何忙. 今天Google在自己的Google Enterprise Blog跟我们分享了一下这周Google Docs出问题的细节:.

Java EE企业系统性能问题的原因和解决建议

- - InfoQ cn
Pierre-Hugues Charbonneau(昵称是P-H)是加拿大CGI公司的高级IT顾问和系统架构师. 近日他发表了题为《 导致Java EE企业性能问题的十大原因》的文章,列举了对Java EE企业系统性能影响最大的因素,并做出了很好的建议. 在文中,P-H首先指出,在设计和实现Java EE相关技术的时候,性能问题是我们所要面临的最大挑战之一.

少走弯路,看看会导致创业失败的7大原因

- - 创业邦
  如果你正准备创业,失败是一条必经的道路. 但如果你无法弄明白失败的原因,成功永远不会眷顾到你. 以下是可能导致创业失败的七个主要原因:.   把收入看得太重是创业失败的一个重要原因. 刚开始创业的时候,千万不要把收入看的太重,更不能忽视客户. 当然,笔者并非是“教唆”创业者不重视收入,但是相对于客户资源而言,赚钱更简单些,因为只要有客户,公司总有机会实现盈利.

[随笔]看看今年程序员们解决问题的顺序

- 李斌 - C++博客-首页原创精华区
    技术上的问题多去google,wikipedia上看看绝对没错,想看性用品广告就多上上Baidu.     找同事帮忙,如果你的同事热心肠而且技术不错,而且遇到过类似的问题,他的建议就会很显得非常宝贵,也许就能一针见效.     去编程互助网站搜索下答案,不行就上去发帖提提问,热心人还是蛮多的,但是感觉这个网站上的Java/.Net的问题比较多.