开发者社区> 阿里巴巴云原生小助手> 正文

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

简介: 线上系统为何经常出错?数据库为何屡遭黑手?业务调用为何频频失败?连环异常堆栈案,究竟是哪次调用所为?数百台服务器意外雪崩背后又隐藏着什么?是软件的扭曲还是硬件的沦丧?走进科学带你了解 Arthas,一款开源一年多 GitHub Star 2 万,99% 的阿里研发小哥都在用的 Java 终极诊断利器.
+关注继续查看

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
intel xeon(skylake) platinum 8163 性能评测 阿里云第四代ECS服务器
intel xeon(skylake) platinum 8163 性能评测阿里云第四代ECS服务器http://www.bieryun.com/4559.html 阿里云ECS服务器是一种弹性可伸缩的云服务器,通过虚拟化平台将服务器集群虚拟为多个性能可配的虚拟机(KVM),对整个集群系统中所有KVM进行监控和管理,并根据实际资源使用情况灵活 分配和调度资源池。
40601 0
探究retransformClasses致使JVM Metaspace OOM的问题
### 前言 本文深入分析Arthas 3.3.0~3.4.1版本trace大方法可能导致JVM Metaspace OOM的问题。通过分析trace命令生成的增强字节码及调试分析JVM retransformClasses的处理过程,找出发生Metaspace OOM的原因,然后给出解决办法。 ### 问题说明 构造了一个测试的大方法`demo.BigMethod250.test(
868 0
对于tnsping的连接超时的功能补充
tnsping,作为Oracle连接测试的一个小巧的工具,其实大家已经不陌生了,但是使用tnsping有一个问题,就是连接超时,当然这个和网络的安全策略等密不可分,但是摆在我面前的一个问题是,现在有大量的服务器,每台数据库服务器上都有tnsnames.ora,如果需要判断tnsnames.ora里面的配置是否生效,使用tnsping是一个很自然的选择。
1083 0
手把手教你在服务器如何免费搭建一套GPS定位系统平台
GPS定位系统一般是指部署在服务器端可以监控各类GPS北斗卫星定位硬件设备的系统软件,比如实时的位置和行驶轨迹等等。
2220 0
定位排查工作流的计算结果数据量不符合预期的方法
本文用两个简化过的实际例子,说明如何排查数据经过同步和计算后发现数据条数对不上的情况。
9332 0
1631
文章
0
问答
来源圈子
更多
阿里云 云原生应用平台 肩负阿里巴巴集团基础设施云化以及核心技术互联网化的重要职责,致力于打造稳定、标准、先进的云原生产品,成为云原生时代的引领者,推动行业全面想云原生的技术升级,成为阿里云新增长引擎。商业化产品包括容器、云原生中间件、函数计算等。
+ 订阅
相关文档: 应用高可用服务 AHAS 性能测试 PTS Prometheus监控
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载