arthas 查看哪个方法调用最耗时_阿里巴巴问题排查神器Arthas使用实践

Apache Dubbo是Alibaba开源的高性能RPC框架,在国内有非常多的用户。

  • Github:https://github.com/apache/incubator-dubbo
  • 文档:http://dubbo.incubator.apache.org/zh-cn/

Arthas是Alibaba开源的应用诊断利器,9月份开源以来,Github Star数三个月超过6000。

  • Github:https://github.com/alibaba/arthas
  • 文档:https://alibaba.github.io/arthas/

当Dubbo遇上Arthas,会碰撞出什么样的火花呢?下面来分享Arthas排查Dubbo问题的一些经验。

dubbo-arthas-demo

下面的排查分享基于这个dubbo-arthas-demo,非常简单的一个应用,浏览器请求从Spring MVC到Dubbo Client,再发送到Dubbo Server。

Demo里有两个spring boot应用,可以先启动server-demo,再启动client-demo。

  • https://github.com/hengyunabc/dubbo-arthas-demo
388e7b3b6176da5f0042b1f3477f687c.png

Client端:

b184209d1bb0cff27d4eacf1c26d986c.png

Server端:

23704e1ba377ba032da05107e508cb6f.png

Arthas快速开始

  • https://alibaba.github.io/arthas/install-detail.html
a40b17cd8bc177ab46a73c271dd188db.png

启动后,会列出所有的java进程,选择1,然后回车,就会连接上ServerDemoApplication

4959acbaa3459f7d17f87dec61ae53af.png

Dubbo线上服务抛出异常,怎么获取调用参数?

  • https://alibaba.github.io/arthas/watch.html

当线上服务抛出异常时,最着急的是什么参数导致了抛异常?

在demo里,访问http://localhost:8080/user/0,UserServiceImpl就会抛出一个异常,因为user id不合法。

在Arthas里执行 watch com.example.UserService * -e -x 2 '{params,throwExp}' ,然后再次访问,就可以看到watch命令把参数和异常都打印出来了。

4bd699538303a01fc2e697650b622307.png

怎样线上调试Dubbo服务代码?

  • https://alibaba.github.io/arthas/redefine.html

在本地开发时,可能会用到热部署工具,直接改代码,不需要重启应用。但是在线上环境,有没有办法直接动态调试代码?比如增加日志。

在Arthas里,可以通过redefine命令来达到线上不重启,动态更新代码的效果

比如我们修改下UserServiceImpl,用System.out打印出具体的User对象来:

160bf4edef8df172405790cc5f356960.png

本地编绎后,把

server-demo/target/classes/com/example/UserServiceImpl.class

传到线上服务器,然后用redefine命令来更新代码:

8bc04739add5eeed863531ec5f573c93.png

这样子更新成功之后,访问 http://localhost:8080/user/1,在ServerDemoApplication的控制台里就可以看到打印出了user信息。

怎样动态修改Dubbo的logger级别?

  • https://alibaba.github.io/arthas/ognl.html
  • https://alibaba.github.io/arthas/sc.html
  • https://commons.apache.org/proper/commons-ognl/language-guide.html

在排查问题时,需要查看到更多的信息,如果可以把logger级别修改为DEBUG,就非常有帮助。

ognl是apache开源的一个轻量级表达式引擎。下面通过Arthas里的ognl命令来动态修改logger级别。

首先获取Dubbo里TraceFilter的一个logger对象,看下它的实现类,可以发现是log4j。

dd5ad525cd77ee06250afbb7e4272ef3.png

再用sc命令来查看具体从哪个jar包里加载的:

f963ce361dda77a7fe0019eda240f2d6.png

可以看到log4j是通过slf4j代理的。

那么通过org.slf4j.LoggerFactory获取root logger,再修改它的level:

4833216aeafeee4450b957305d1ce8e8.png

可以看到修改之后,root logger的level变为DEBUG。

怎样减少测试小姐姐重复发请求的麻烦?

  • https://alibaba.github.io/arthas/tt.html

在平时开发时,可能需要测试小姐姐发请求过来联调,但是我们在debug时,可能不小心直接跳过去了。这样子就尴尬了,需要测试小姐姐再发请求过来。

Arthas里提供了tt命令,可以减少这种麻烦,可以直接重放请求。

ca878ef5b39eefa38121955fa41b76fc.png

上面的tt -t命令捕获到了3个请求。然后通过tt --play可以重放请求:

934e0c3ab55a5ec7927242f569d56061.png

Dubbo运行时有哪些Filter? 耗时是多少?

  • https://alibaba.github.io/arthas/trace.html

Dubbo运行时会加载很多的Filter,那么一个请求会经过哪些Filter处理,Filter里的耗时又是多少呢?

通过Arthas的trace命令,可以很方便地知道Filter的信息,可以看到详细的调用栈和耗时。

dc8996cabb14ffa0b2e8d54bdcd2cc21.png

Dubbo动态代理是怎样实现的?

  • https://alibaba.github.io/arthas/jad.html
  • com.alibaba.dubbo.common.bytecode.Wrapper

通过Arthas的jad命令,可以看到Dubbo通过javaassist动态生成的Wrappr类的代码:

9bc74edd75bc458c58eaa385a7c1c9dd.png

获取Spring context

除了上面介绍的一些排查技巧,下面分享一个获取Spring Context,然后“为所欲为”的例子。

在Dubbo里有一个扩展

com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory,把Spring Context保存到了里面。

因此,我们可以通过ognl命令获取到。

039e6f9459eedce7d94c67b694ffc0ed.png
  • SpringExtensionFactory@contexts.iterator.next 获取到SpringExtensionFactory里保存的spring context对象
  • #context.getBean("userServiceImpl").findUser(1) 获取到userServiceImpl再执行一次调用

只要充分发挥想像力,组合Arthas里的各种命令,可以发挥出神奇的效果。

文章来源:https://dwz.cn/5Vjkc9hh

作者: 云栖社区

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563438.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

及cp含义_新媒体运营炒CP,既好用,又好玩(第327回)

点击上方蓝色字关注我们,获得724小时新媒体运营协助炒CP这个词大家应该都听说过,英文是Coupling,是配对的意思,源自同人圈。比如,金晨与张继科出现在同一节目里,观众看两个人同框时感觉像一对,就…

c++输入错误重新输入_C程序-根据时长和时薪计算工资1.3(解决输入非数字选项退出的bug)...

程序内容:提供五种工资菜单,用户自行选择,读取用户输入的工作时长,计算工资和净收入,及其缴纳的税金。(C Primer Plus 第7章 第8题)程序更新:解决输入非数字选项后退出程序的bug。这…

linux 安装 交换分区大小,给已安装的Linux新增Swap交换分区

跟了我5年多的本本已步入花甲,CPU严重老化,运行Windows异常吃力,于是考虑换成Linux试试。忙活了一天,测试了2个“家用”Linux发行版,一个是深度的Linux Deepin 2013,另一个是雨林木风的StartOS 5.1。在测试过程中也遇到一些有用的…

linux音频驱动修复工具,Linux声卡驱动(4)——音频驱动实战

一、应用测试工具的使用1.在external/tinyalsa下有以C语言实现的alsa的测试程序,编译后生成tinypcminfo tinyplay tinycap tinymix 四个elf格式的测试工具(1) tinypcminfo :获取PCM In和PCM# tinypcminfo -D /dev/snd/controlC0# tinypcminfo -D /dev/sn…

二元相图软件_FactSage 软件教程 入门学习资料汇总

(一)英文版的学习资料(1)FactSage官网:http://www.factsage.com/打开FactSage官网,如下图所示,点击左侧FactSage界面上的模块按钮即可查看其使用方法。点击右侧的链接"Free FactSage Demo …

bufferreader readline一次读一行_python中read(),readline(),readlines()的区别

读取文件的三个方法:read()、readline()、readlines()。三种方法均可接受一个变量size,用于限制每次读取的数据量,也就是说从文件当前位置起读取size个字节;若无参数size,则表示读取至文件结束为止。接下来总结下三种读…

固定 顶部_一楼小院想建阳光房?固定的怕违建,那这样可伸缩的阳光房怎么样...

今天小编又有一个新鲜出炉的案例要跟大家分享啦!前几次与大家分享的都是伸缩阳光房顶,不论是手动还是电动款式 ,似乎都是针对天井、下沉式庭院等设计的。那针对一些小区里的一楼小院,固定的怕违建,有没有什么对策呢&am…

C语言坐标打飞机,C语言控制台实现打飞机小游戏

本文实例为大家分享了C语言实现打飞机小游戏的具体代码,供大家参考,具体内容如下初学C语言总觉得不能做些什么好玩的,这个小游戏只需 “一点点” (千真万确)C语言知识就能完成!总计不到200行的非空白代码(没有强行压缩行数)操作说…

合同相似可逆等价矩阵的关系及性质_行列式的性质问题

行列式的学习一方面要掌握计算行列式的一般方法;对性质要理解。考点与要求:了解:行列式的概念、方阵的乘积、行列式的性质;掌握:行列式的性质;会用:行列式的性质和行列式按行(列)展开定理计算行…

c++ windows 蓝牙库_蓝牙翻页笔(PPT 控制器) | ESP32学习之旅-Arduino版

本系列历史文章目录:ESP32概述与Arduino软件准备新冠肺炎疫情数据实时显示器B 粉计数器本期给大家带来的案例是:蓝牙翻页笔。先来看一下演示视频吧:蓝牙翻页笔 | PPT播放控制器 | 蓝牙键盘 | 用 Arduino 玩转掌控板 ESP32 / ESP8266 | 图形化…

python 程序运行在阿里云主机_阿里云主机Access key利用工具

简介(Gamma实验室核心成员:一灯老和尚所写)在日常渗透过程中我们经常遇到信息泄露出ALIYUN_ACCESSKEYID与ALIYUN_ACCESSKEYSECRET(阿里云API key),特别是laravel框架得debug信息。APP中也会泄露这些信息&am…

一张纸厚度是多少毫米_一张纸的威力有多大?纸折103次捅破宇宙,理论荒诞却无法反驳...

【图文摘自网络,如有侵权请联系删除】人类达到月球需要多久时间?地球和月亮的距离不是一成不变的,它有着近地点和远地点,地球里月球最远的距离在363300千米,最远为405500千米。而当年阿波罗号由火箭发射到登陆月球表面…

oracle 两表两列数据对比_Oracle、PostgreSQL与Mysql数据写入性能对比

最近因为工作需要,需要对Oracle和Mysql写入性能进行对比,以前都是听说Mysql性能比Oracle不是一个级别,现在亲测后,不比不知道,一比吓一跳。。。追加PostgreSql性能测试数据测试场景本地电脑(单机),通过程序…

锐驰机器人的市场_【年终盘点】2020年,锐驰的王炸新品!

点击蓝字关注我哦辛苦付出、苦熬实干,换来了硕果累累、丰收成片。回首2020年,锐驰秉承着锐意进取、快速创新的理念,在自动化道路上不断探索,推出了多款智能自动化机器,现在着重介绍以下3款:异型插件机器人、…

学生管理系统c#语言代码,基于C#语言的学生管理系统的设计(ASP.NET2.0)

摘 要随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。学生管理系统是学校管理中不可少的一部分。而基于B/S架构的学生管理系统是方便学校管理,实行电子办公的必要组成部分&#xf…

异常信息_一个针对异常信息通知的springboot starter

前言作为后端开发者,项目上线之后难免会遇到各种问题,一个良好且及时的异常通知机制可以让我们在项目的维护上避免很多不必要的麻烦。本项目的开发愿景是为了给使用者在线上项目的问题排查方面能够带来帮助,简单配置,做到真正的开…

2使用教学_建水三中智能交互式液晶一体机设备投入使用

“张老师,一体机的使用会了吗?”“一体机在教学中好用吗?”“告别多年粉笔加黑板的教学方式,不用再吸入粉笔灰了。”2月25日清晨,建水三中的老师们议论纷纷,大家关注的是如何操作使用教室里安装的一体机。建…

数据结构折半查找算法C语言,数据结构C语言实现----折半查找

运行结果&#xff1a;代码如下&#xff1a;#include//数组初始化函数void Array_get(int array[],int max){printf("请输入一个数组&#xff0c;大小从低到高&#xff0c;各个数字间以空格隔开&#xff1a;");for (size_t i 0; i < max; i){scanf("%d"…

生活中的算法的实际举例_驾校学的技术,在实际生活中,你能运用自如吗?

学驾照的过程不用说&#xff0c;每一个经历过的人都有着刻骨铭心的记忆。很多人认为自己流了很多汗水&#xff0c;付出了很多精力在练车场上摸爬滚打&#xff0c;这下肯定把驾驶技术给夯实了&#xff0c;以后开车上路一点问题也没有。但是事情真的是这样吗&#xff0c;驾校学的…

470p 更换固态硬盘_联想G510换固态硬盘遇到的问题

唉&#xff01;更正一下吧&#xff01;电脑识别光驱位机械硬盘没有成功&#xff0c;出现了新问题&#xff0c;偶尔能识别出来&#xff0c;通常情况下不能识别出来&#xff0c;正在寻找解决办法中.........现在对于刚发表的这篇文章&#xff0c;有点惭愧&#xff01;二更&#x…