首页 > 其他分享 >锋利的在线诊断工具——Arthas

锋利的在线诊断工具——Arthas

时间:2024-11-03 13:08:39浏览次数:3  
标签:java 在线 -- 锋利 Arthas jar arthas com

导航

  • 前言
  • 火线告警,CPU飚了
  • 服务重启,迅速救火
  • 黑盒:无尽的猜测和不安
  • Arthas:锋利的Java诊断工具
  • 在线追踪Cpu占比高的代码段
  • 代码重构,星夜上线,稳了
  • 结语
  • 参考

肮脏的代码必须重构,但漂亮的代码也需要很多重构。

前言

有些代码在当初编写的时候是非常稳健的,但是随着数据量的不断增加,有些代码的“性能瓶颈”逐渐暴露出来。

这就可能会导致一些不可预知的线上事故。

那么,如何快速定位问题和处置问题就变得极其重要。

火线告警,CPU飚了

运维三板斧,重启、重装、重新买!

在多年的职业历练中,我养成了一个习惯——随时关注群里用户的反馈。

在一个阳光很好的午后,我和同事们正在加班加点的赶一个版本。

突然,群里有人反馈,线上的一个功能出现了问题,需要紧急处理。



随即便是更多的业务对接群开始炸锅。

上个月因为数据库性能问题,已经出现了几次线上宕机的情况,被用户吐槽。
为此,我们做了大量的优化工作:

  • 慢sql优化
  • 去高频接口
  • 数据冷热分离
  • ...

今天再次遇到这样的问题,我们惊讶了几秒,然后很快恢复了镇定。

服务重启,迅速救火

我和业务团队的同事一边安抚用户的情绪,一边查看报警日志。

紧急着查看了报警日志,发现部署该业务接口的两台ecs CPU飙高了...



再看数据库的CPU使用率并未报警。

当机立断,先重启一下服务。(PS:不要慌,不要慌,不要慌!)

大约两分钟之后,我们验证了可用性,并查看ecs和数据库各项指标,正常。

于是大家一一回复了用户群,对接群终于安静了。

黑盒:无尽的猜测和不安

路漫漫其修远兮,吾将上下而求索。

在这个时候,我已经开始了我的思考——是哪个功能或者哪句代码引发了ecs cpu标高呢?

过去,我们的思路总是先去查看网关日志,从时间点上排查可能导致性能问题的接口,然后逐渐深入。

然而,这个项目已经迭代3年多了,接口繁多,想快速定位无疑是大海捞针。

所以,对于这种黑盒般的问题,因为缺乏诊断工具,往往让我们陷入无尽的猜测和不安中。

是否有这样的工具帮助我快速定位到问题的代码呢?

Arthas:锋利的Java诊断工具

在这次的问题诊断中,我使用了Arthas来进行线上问题的诊断。

Arthas(阿尔萨斯)(是Alibaba开源的Java诊断工具,深受开发者喜爱。
在线排查问题,无需重启、动态跟踪Java代码、实时监控 JVM 状态。

Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的Tab自动补全功能,进一步方便进行问题的定位和诊断。

当你遇到以下类似问题而束手无策时,Arthas 可以帮助你解决:

  • 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  • 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  • 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  • 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  • 是否有一个全局视角来查看系统的运行状况?
  • 有什么办法可以监控到 JVM 的实时运行状态?
  • 怎么快速定位应用的热点,生成火焰图?

官方教程

使用arthas-boot(推荐)

下载arthas-boot.jar,然后用java -jar的方式启动:

  • 执行该程序的用户需要和目标进程具有相同的权限。比如以admin用户来执行:sudo su admin && java -jar arthas-boot.jar 或 sudo -u admin -EH java -jar arthas-boot.jar。
  • 如果 attach 不上目标进程,可以查看~/logs/arthas/ 目录下的日志。
  • 如果下载速度比较慢,可以使用 aliyun 的镜像:java -jar arthas-boot.jar --repo-mirror aliyun --use-http
  • java -jar arthas-boot.jar -h 打印更多参数信息。
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar




选择应用java进程:

blog-webapp-0.0.1-SNAPSHOT.jar进程是第1个,则输入1,再输入回车/enter。Arthas 会 attach 到目标进程上,并输出日志:

[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 27575 blog-webapp-0.0.1-SNAPSHOT.jar
1
[INFO] local lastest version: 3.7.2, remote lastest version: 4.0.2, try to download from remote.
[INFO] Start download arthas from remote server: https://arthas.aliyun.com/download/4.0.2?mirror=aliyun
[INFO] Download arthas success.
[INFO] arthas home: /root/.arthas/lib/4.0.2/arthas
[INFO] Try to attach process 27575
[INFO] Attach process 27575 success.
[INFO] arthas-client connect 127.0.0.1 3658
  ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---.
 /  O  \ |  .--. ''--.  .--'|  '--'  | /  O  \ '   .-'
|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.
|  | |  ||  |\  \    |  |   |  |  |  ||  | |  |.-'    |
`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'

wiki       https://arthas.aliyun.com/doc
tutorials  https://arthas.aliyun.com/doc/arthas-tutorials.html
version    4.0.2
main_class
pid        27575
time       2024-11-02 22:28:37.037

在线追踪CPU占比高的代码段

从官方文档可以看到Arthas可以帮助定位到cpu飙高的代码段。

具体如何操作呢?

可以关注一下这个命令:thread

展示当前最忙的前 N 个线程并打印堆栈(https://arthas.aliyun.com/doc/thread.html)

$ thread -n 3
"C1 CompilerThread0" [Internal] cpuUsage=1.63% deltaTime=3ms time=1170ms

"arthas-command-execute" Id=23 cpuUsage=0.11% deltaTime=0ms time=401ms RUNNABLE
    at [email protected]/sun.management.ThreadImpl.dumpThreads0(Native Method)
    at [email protected]/sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:466)
    at com.taobao.arthas.core.command.monitor200.ThreadCommand.processTopBusyThreads(ThreadCommand.java:199)
    at com.taobao.arthas.core.command.monitor200.ThreadCommand.process(ThreadCommand.java:122)
    at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.process(AnnotatedCommandImpl.java:82)
    at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.access$100(AnnotatedCommandImpl.java:18)
    at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:111)
    at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:108)
    at com.taobao.arthas.core.shell.system.impl.ProcessImpl$CommandProcessTask.run(ProcessImpl.java:385)
    at [email protected]/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at [email protected]/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at [email protected]/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
    at [email protected]/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at [email protected]/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at [email protected]/java.lang.Thread.run(Thread.java:834)


"VM Periodic Task Thread" [Internal] cpuUsage=0.07% deltaTime=0ms time=584ms

上面展示了cpu最高的三个线程。

通过这种方式我们就可以定位到到cpu飙高的代码段。(这里是示例,具体项目案例这里就不粘贴了~)

代码重构,星夜上线,稳了

通过这个工具相对比较精准的定到了导致cpu飙高的代码片段。

进一步进入代码发现,是因为这里有一个接口,包含了一个分页查询,在返回数据的时候,需要对数据进行了包装。
这里的代码逻辑如下:
遍历循环,查询数据库,然后计算了一个数据赋值给某个扩展字段。

如果是普通接口,数据量不大,也不会有什么问题。

但是,这里是IM群里会话接口,在某一个瞬间(比如,大量用户同时登录软件),拉去IM群里的会话列表,所以这里的代码逻辑就会导致cpu飙高。

Note: 本项目类似企业微信的IM群聊,但是没有使用本地数据库,聊天数据从接口实时拉取。

于是,快速重构了这段代码,星夜上线。

至此,该问题就解决了。

结语

哪有什么岁月静好,总有人在看不到地方为你负重前行。

所谓的"技术好",不是单纯的卖弄技术,而是能够针对灵活多变的场景,恰到好处的运用技术。

活到老,学到老。

在这个过程中,我们要保持对技术的敬畏,不断学习,不断进步。

善于使用工具来解决问题,让我们的生活更加美好。

这里笔者只根据个人多年的工作经验,一点点思考和分享,抛砖引玉,欢迎大家怕批评和斧正。

参考



标签:java,在线,--,锋利,Arthas,jar,arthas,com
From: https://www.cnblogs.com/lucky_hu/p/18523177

相关文章

  • 技术驱动教育:SpringBoot在线试题库解决方案
    1绪论1.1研究背景现在大家正处于互联网加的时代,这个时代它就是一个信息内容无比丰富,信息处理与管理变得越加高效的网络化的时代,这个时代让大家的生活不仅变得更加地便利化,也让时间变得更加地宝贵化,因为每天的每分钟,每秒钟这些时间都能让人们处理大批量的日常事务,这些场......
  • SpringBoot实战:打造高效在线试题库
    1绪论1.1研究背景现在大家正处于互联网加的时代,这个时代它就是一个信息内容无比丰富,信息处理与管理变得越加高效的网络化的时代,这个时代让大家的生活不仅变得更加地便利化,也让时间变得更加地宝贵化,因为每天的每分钟,每秒钟这些时间都能让人们处理大批量的日常事务,这些场......
  • SpringBoot实现:高效在线试题库系统
    1绪论1.1研究背景现在大家正处于互联网加的时代,这个时代它就是一个信息内容无比丰富,信息处理与管理变得越加高效的网络化的时代,这个时代让大家的生活不仅变得更加地便利化,也让时间变得更加地宝贵化,因为每天的每分钟,每秒钟这些时间都能让人们处理大批量的日常事务,这些场......
  • 智能教育工具:基于SpringBoot的在线试题库
    1绪论1.1研究背景现在大家正处于互联网加的时代,这个时代它就是一个信息内容无比丰富,信息处理与管理变得越加高效的网络化的时代,这个时代让大家的生活不仅变得更加地便利化,也让时间变得更加地宝贵化,因为每天的每分钟,每秒钟这些时间都能让人们处理大批量的日常事务,这些场......
  • 【开题报告】基于Springboot+vue框架的在线学堂系统(程序+源码+论文) 计算机毕业设计
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和教育信息化的不断推进,在线学习已成为人们获取知识、提升技能的重要途径。传统的教育模式受限于地域、时间和资源等因素,难......
  • 基于django框架在线图书推荐系统的设计与实现 python个性化图书/书籍/电子书推荐系统
    基于django框架在线图书推荐系统的设计与实现python个性化图书/书籍/电子书推荐系统平均加权混合推荐热门推荐协同过滤算法推荐爬虫排行榜数据可视化分析机器学习深度学习大数据一、项目简介1、开发工具和使用技术Pycharm、Python3及以上版本,Django3.6及以上版......
  • php毕业设计基于PHP的电子购物商城在线购物系统商城网站电子产品商城php+mysql+html计
    一、功能介绍php在线购物商城电商网站详细技术:HTML+CSS+JS+PHP+MYSQL系统分为用户和管理员两种身份用户功能如下:1.登陆注册2.查看商品详情、蛋糕资讯3.加入购物车、结算订单4.评价5.修改密码6.搜索蛋糕7.退出登录管理员功能如下:1.登录退出2.蛋糕管理(添加、修改和......
  • 【语音识别】男女声在线识别【含Matlab源码 8997期】
    ......
  • 基于django的在线购物商城推荐系统 python个性化购物商城推荐系统的设计与开发 爬虫
    基于django的在线购物商城推荐系统python个性化购物商城推荐系统的设计与开发爬虫排行榜可视化数据基于流行度的热点推荐平均加权混合推荐协同过滤推荐大数据机器学习深度学习OnlineShopRecommendPy一、项目简介1、开发工具和使用技术Pycharm、Python3及以上版......
  • springboot在线吉他配套服务系统-计算机毕业设计源码53451
    目录摘要1绪论1.1选题背景与意义1.2国内外研究现状1.3论文结构与章节安排2系统分析2.1可行性分析2.2系统流程分析2.2.1数据流程2.2.2业务流程2.3系统功能分析2.3.1功能性分析2.3.2非功能性分析2.4系统用例分析2.5本章小结3系统总体......