你有解决在线问题的最佳方法吗?

当你在网上头疼的时候,你还在一行一行地看代码吗?这真的不是很时尚啊你好~

俗话说,“不要担心故障排除,阿尔萨斯会帮助你。”今天,让我们来谈谈这个Java诊断工件——Arthas,它让我妈妈不再担心我的故障排除!

什么是 Arthas?

Arthas是一个开源的在线诊断工具,采用命令行交互模式,支持网上在线诊断,并提供丰富的Tab自动完成功能,进一步方便问题定位和诊断。这是一个已经开源一年多的Java终极诊断工具,Github Star 2 万,和阿里99%的研发团队都在使用它!与直接下载相比,我建议开发人员可以尝试在IDE插件云工具包中使用Arthas来实现一键式远程诊断。

多亏了阿尔萨斯强大而丰富的功能,阿尔萨斯可以做得比他想象的更多。以下只是一些常见的使用场景。熟悉阿尔萨斯后,可以探索更多的使用场景。

系统健康有全局观吗?

为什么中央处理器再次上升,以及中央处理器具体在哪里被占用?

运行多线程时有死锁吗?有堵塞吗?

这个程序需要很长时间才能运行,但是哪里需要更长时间呢?如何监控

这个类是从哪个jar包加载的?你为什么要报告各种与班级相关的异常?

为什么我不执行我更改的代码?我没有承诺吗?错误的分支?

遇到问题时不能在线调试,只能通过添加日志重新发布吗?

有什么方法可以监控JVM的实时运行状态吗?

阿尔萨斯的命令和功能在它的官方文件中有详细描述,下面将描述几个最近的使用场景。

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

通常,服务器请求是正常的。在压力测试期间,相关的服务和数据库没有达到瓶颈,但是机器的CPU都是红色的。为什么?

通过jstack命令,只有堆栈在某个时刻才能被看到,而真正的罪魁祸首并没有被抓住。

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

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

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

你有解决在线问题的最佳方法吗?

场景 2:检测偶发的超时

有一段时间偶尔会超时,但日志正常,鹰眼呼叫链接完全正常,没有数据库操作或HSF呼叫特别慢。

各种监测统计的时间维度的耗时是非常正常的,并且不能发现rt的尖峰。

我认为这可能是杂志,但没有证据支持它。

Trace命令可以监控每一步的时间消耗,当时间消耗超过xx毫秒时,可以配合条件表达式打印详细日志

找到一台机器,输入命令,然后等待。当rt峰值再次出现时,可以捕获耗时的分布。

你有解决在线问题的最佳方法吗?

根据阿尔塞斯得到的结果,日志打印的问题被定位。同步日志改为异步日志后,问题就解决了。

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

以前,我遇到过json序列化不带引号的数字的问题。当时,各种调试和查看代码发现,它是一个序列化类生成的ASM动态词节码,这时候,它被完全放弃,调试无法再定位问题。当时,这个问题是以另一种方式避免的。

反过来看这个问题,我们可以使用阿尔萨斯的jad命令来反编译由动态单词节码,生成的类,并与诸如watch之类的命令相结合来定位和解决这个问题。

Jad——反编译为加载的类指定源代码

你有解决在线问题的最佳方法吗?

您也可以使用菜单编译器和重定义在线热更新代码。欢迎探索。

有了这些能力,即使万能吗?不,不,继续往下看。

场景 4:做点坏事

在对问题进行故障排除的过程中,发现日志被输出到控制台,这导致了很大的性能损失。有没有办法在不释放它的情况下紧急解决它?

首先找到对应的 class

sc-d ch . QoS . log back . core . console Pender

class-info ch . QoS . log back . core . console Pender

代码-源代码/主页/管理/./lib/logback-core-1.2.3.jar

名称ch . QoS . log back . core . console Pender

isInterface false

isAnnotation false

艾森假

isAnonymousClass false

我错了

isLocalClass false

isMemberClass false

isPrimitive false

合成假的

简单名称控制台程序

公众

注释

接口

super-class-ch . QoS . log back . core . OutputStreamAppender

-ch . QoS . log back . core . UnsynchronizedAppenderBase

-ch . QoS . log back . core . SPI . contextawarebase

对象

class-loader -com .淘宝.launchedurlClassLoader @ 58 dad 04a

-sun . misc . launcher $ AppClassLoader @ 18 B4 aa C2

-sun . misc . launcher $ ExtClassLoader @ 58 cef f1

classLoaderHash 5f205aa

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

ognl-c 5f 205 aa ' @ org . SLF 4j . Logger Factory @ GetLogger( ' root '). AAI . AppenderList '

删除标准输出的 appender

1 gnl-c 5f 205 aa ' @ org . SLF 4j . Logger Factory @ GetLogger( ' root ')。

神器:火焰图

当对性能问题进行故障排除时,还有另一个问题:火焰图清楚地显示了在一段时间内通过火焰图的每种方法的耗时统计。

你有解决在线问题的最佳方法吗?

开始使用 Arthas

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

云工具包是由阿里云发布的免费本地集成开发环境插件,用于帮助开发人员更高效地开发、测试、诊断和部署应用程序。通过插件,本地应用程序可以部署到任何服务器,甚至是云(ECS、EDAS、确认、ACR、小程序云等。);此外,还内置了阿尔萨斯诊断、Dubbo工具、终端、文件上传、函数计算和MySQL执行器。不仅仅是智能想法的主流版本,还有其他版本,比如Eclipse、Pycharm、Maven等等。

建议使用IDEA插件下载云工具包来使用阿尔萨斯:

http://t.tb.cn/2A5CbHWveOXzI7sFakaCw8

方式二:直接下载

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

阿尔塞斯的获奖论文开始了!

你有解决在线问题的最佳方法吗?

为了让更多的开发人员能够开始使用阿尔萨斯作为一个Java诊断工件,这次我们与捷脑科联合发起了这个获奖的论文竞赛,来谈论你和阿尔萨斯多年来的事情。征文收集的第一阶段将于3月26日(——4)举行,后续的征文收集将持续到2020年12月。

关于内容方向的建议:

阿尔萨斯检查的问题

解读阿尔萨斯的源代码

向阿尔萨斯提建议

不限于,与阿尔萨斯相关的其他内容

3 步提交征文

1.使用阿尔萨斯;直接或通过云工具包;

2.将你的经历整理成文章,并在金块社区发表;

3.根据需要填写以下表格:

http://alibabadeveloper.mikecrm.com/9khcRrs

你将获得的礼物

提交符合提交要求的文章的学生将获得一个阿尔萨斯最有价值用户幸运包(随机赠送),包括淘大娃娃、阿尔萨斯贴纸、阿里云T恤、捷脑浆周边礼品袋;

最受欢迎的前3名文章的第一期赢得了天猫精灵奖。

本年度前20名的文章将有机会获得樱桃键盘和周边礼包,包括捷脑通提供的优惠券。

你将获得的荣誉

除了实物奖励,您还将获得33,360英镑

在阿里巴巴云本地公共号码和阿尔萨斯技术社区的主页上展示你的文章和作者介绍模块,让更多的开发者了解你。

成为阿尔萨斯社区的贡献者,参与社区的日常运作,并作为社区讲师参与阿尔萨斯在线/离线活动。