性能测试如何定位瓶颈?偶发超时?看高手如何快速排查问题

lALPGqGoY4ELYOHNAg7NBDg_1080_526.png

做者 | [张奇(司楚)]java

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

1.jpeg

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

什么是 Arthas?

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

得益于 Arthas 强大且丰富的功能,让 Arthas 能作的事情超乎想象。下面仅仅列举几项常见的使用状况,更多的使用场景能够在熟悉了 Arthas 以后自行探索。数据库

  • 是否有一个全局视角来查看系统的运行情况?
  • 为何 CPU 又升高了,究竟是哪里占用了 CPU ?
  • 运行的多线程有死锁吗?有阻塞吗?
  • 程序运行耗时很长,是哪里耗时比较长呢?如何监测呢?
  • 这个类从哪一个 jar 包加载的?为何会报各类类相关的 Exception?
  • 我改的代码为何没有执行到?难道是我没 commit?分支搞错了?
  • 遇到问题没法在线上 debug,难道只能经过加日志再从新发布吗?
  • 有什么办法能够监控到 JVM 的实时运行状态?

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

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

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

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

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

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

动态获取代码的方法名、行号等信息,一般是经过 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<br />

方式二:直接下载

地址: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 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,作最懂云原生开发者的技术圈。”

相关文章
相关标签/搜索