阿里开源,在线分析代码性能

本文介绍了阿里巴巴开源的Arthas工具,如何帮助后端开发者解决线上代码性能问题,包括在线监测代码耗时、抓取方法参数、反编译代码和实时分析性能。通过实例演示了Arthas在实际问题排查中的便捷性和效率提升。
摘要由CSDN通过智能技术生成

前言

作为一名资深后端开发,你在生产环境一定会碰到这样的场景:

产品:线上这个页面加载比较慢,前端同学说是接口响应比较慢,你能帮忙优化下吗?

后端:不应该啊,测试环境很丝滑啊。

产品:要不你自己操作试下?

经过实操,线上环境果然一直转圈圈,然后你转眼看上那座山,看着那些拉几屏栈帧还没结束的函数,各种方法调用,嵌套,然后你那充满智慧的小脑袋瓜立马想到从日志上看出端倪,但是那少的可怜的日志反手给了你泼了一盆冷水。


方法调用链路繁杂,调用耗时在日志中缺失,目前能想到的最好的办法就是拉分支→加上耗时→上线→找到耗时最久的代码→拉分支→优化代码→上线。相信这是很多同学的处理方式,这个过程虽然思路清晰,但是很繁琐。

那如果有这样一个工具,只需简单的命令,就能在线给你列出所有调用链路耗时,那爽不爽,丝滑不丝滑,那我们就一起来了解下这个颠覆问题排查方式的工具,它就是Arthas。

Arthas介绍

  • 2.1 Arthas是什么?

Arthas是由阿里开源的一款线上监控诊断产品,遵循Apache License 2.0开源协议。

  • 2.2 Arthas能做什么?
  1. 无需修改代码在线监测代码耗时。
  2. 无需修改代码在线抓取方法入参出参。
  3. 在线反编译字节码文件。
  4. 生成火焰图查找引起FULLGC的大对象。
  5. 以及其他你能想到或想不到的功能,快来一起发掘吧……

Arthas实战

  • 3.1 环境准备
  • 3.1.1 编写测试工程:https://github.com/NotExistUserName/test-project.git,主要演示代码如下:
    Arthas演示代码

  • 3.1.2 测试工程打成可执行jar并上传至服务器,以8090端口启动服务。
测试工程启动

  • 3.1.3 执行 curl -O https://arthas.aliyun.com/arthas-boot.jar 下载arthas。
上传测试jar,并下载Arthas

  • 3.1.4 执行 java -jar arthas-boot.jar 运行Arthas,会得到如下信息:
Arthas运行后截图

  • 3.1.5 输入1,按回车,进行Arthas控制台如下:

PS:特别注意我们这里是输入1按回车,而不是输入7345,Arthas也有信息提示。

Arthas控制台

  • 3.2 常用功能实战
  • 3.2.1 在线抓取入参出参

我们假设测试工程中的方法
com.github.controller.UserController#getByUid已经上线,我们没有打印出参入参,那么此时Arthas就发挥大作用了,我们在控制台输入如下命令并回车:

watch com.github.controller.UserController getByUid -x 2 -b -s

然后我们请求接口
com.github.controller.UserController#getByUid,我们就可以清晰的看到接口的入参与出参:

watch命令执行截图

命令的用法也很简单,格式为:watch 全例名 方法名称 ,后面则是缺省参数:

-x:即指定Arthas展开入参和出参属性的层级,最大支持到4,默认为1。-x 2就是将对象展开到第二层级。

-b:即在方法调用前输出一次观察表达式的结果。

-s:即在方法调用后输出一次观察表达式的结果。(默认开启)


以上命令执行后,我们会发现Arthas抓取一次入参出参后并没有退出,而是之后的每次请求都会抓取,那么对于线上这么大的并发量,Arthas这种通过Java agent挂载方式实现,每次请求都进行拦截输出的话,那势必会对线上性能造成损耗,所以Arthas也提前考虑到了这点,贴心的为我们提供了-n 参数,即如下命令:

watch com.github.controller.UserController getByUid -x 2 -b -s -n 1

使用-n参数指定观察的次数

我们会发现加上-n 1之后,Arthas只观察了一次就自动退出了,这样就很有中庸之道的意味了,既为我们排查问题提供了线索,又不会过于影响线上性能。

  • 3.2.2 在线反编译Java代码

假如我们有一个需求提测了,但是现在测试提出一个与预期代码完全不符的问题,就和没有我们新增的那段代码是一样的效果,我们一般采用的方法就是将jar包从服务器上下载下来,然后用JD-GUI打开,看下服务器上的代码是否是最新的代码。

那么有了Arthas的加持,过程就会由繁转简,我们只需要在Arthas控制台执行如下命令:

jad com.github.controller.UserController

Arthas反编译代码

Arthas就会将反编译的结果丝滑的打印在控制台上,我们就能够很直观的看到我们的代码是不是最新的,从而快速解决玄学问题,让你彻底摆脱那句名言:不可能啊,我什么都没改啊?

当然如果你一个类中的方法很多的话,你如果只想看某一个方法是不是最新的,你只需要在以上命令后添加你需要反编译的方法名称即可,就像这样:

jad com.github.controller.UserController getByUid

  • 3.2.3 实时统计代码耗时,在线分析代码性能

就我个人而言,Arthas这个功能真的是王炸,很多时候,因为环境或者并发量等诸多原因,测试环境完全复现不了线上的性能问题,只能按照文章开头所描述的繁琐工作进行排查,这一套繁琐的流程下来,本来快速解决可以说是网络抖动,硬被拖成了生产事故。年度3.25逃不掉了。

那Arthas是如何协助我们高效的排查性能问题的呢,我们只要在控制台输入如下命令

trace com.github.controller.UserController getByUid

我们就会得到这样一张图:

Arthas耗时截图

我们可以很清晰的看到,getByUid这个方法的总耗时是:89.071157ms,调用栈中最耗时的方法是
com.github.json.JsonUtils:silentString2Object,总共耗时:79.734267ms,占比89.52%,我们能够很快的定位到性能慢的罪魁祸首是silentString2Object,那么只需要着重优化该方法即可优化线上性能问题。

结语

Arthas是一款功能非常强大且实用的工具,目前在阿里也是大面积推广,在日常工作中能够快速定位疑难杂症,如果说Spring是后端的春天,那Arthas必须是夏天的脆甜冰西瓜。这样一款良心工具各位同学爱了吗。快去上手实践吧。如果各位同学觉得对你有所帮助,请关注、点赞、评论、收藏来支持我,手头宽裕的话也可以赞赏来表达各位的认可,各位同学的支持是对我最大的鼓励。未来为大家带来更好的创作。 

分享一句非常喜欢的话:把根牢牢扎深,再等春风一来,便会春暖花开。


文章参考:

Arthas官网:
https://arthas.aliyun.com/doc/quick-start.html

Arthas开源项目地址:
https://github.com/alibaba/arthas

版权声明:以上引用信息以及图片均来自网络公开信息,如有侵权,请留言或联系

504401503@qq.com,立马删除。

  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖啡攻城狮Alex

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值