当前位置:首页 > 科技  > 软件

实战!使用阿里 Arthas 工具分析 CPU 飙高

来源: 责编: 时间:2023-10-26 17:11:30 361观看
导读Arthas是阿里开源的 Java 诊断工具,相比 JDK 内置的诊断工具,要更人性化,并且功能强大,可以实现许多问题的一键定位,而且可以一键反编译类查看源码,甚至是直接进行生产代码热修复,实现在一个工具内快速定位和修复问题的一站

Arthas是阿里开源的 Java 诊断工具,相比 JDK 内置的诊断工具,要更人性化,并且功能强大,可以实现许多问题的一键定位,而且可以一键反编译类查看源码,甚至是直接进行生产代码热修复,实现在一个工具内快速定位和修复问题的一站式服务。F4J28资讯网——每日最新资讯28at.com

今天,我就带你使用 Arthas 定位一个 CPU 使用高的问题,系统学习下这个工具的使用。F4J28资讯网——每日最新资讯28at.com

首先,下载并启动 Arthas:F4J28资讯网——每日最新资讯28at.com

curl -O https://alibaba.github.io/arthas/arthas-boot.jarjava -jar arthas-boot.jar

启动后,直接找到我们要排查的 JVM 进程,然后可以看到 Arthas 附加进程成功:F4J28资讯网——每日最新资讯28at.com

[INFO] arthas-boot version: 3.1.7[INFO] Found existing java process, please choose one and hit RETURN.* [1]: 12707  [2]: 30724 org.jetbrains.jps.cmdline.Launcher  [3]: 30725 org.geekbang.time.commonmistakes.troubleshootingtools.highcpu.HighCPUApplication  [4]: 24312 sun.tools.jconsole.JConsole  [5]: 26328 org.jetbrains.jps.cmdline.Launcher  [6]: 24106 orgbeans.lib.profiler.server.ProfilerServer3[INFO] arthas home: /Users/zhuye/.arthas/lib/3.1.7/arthas[INFO] Try to attach process 30725[INFO] Attach process 30725 success.[INFO] arthas-client connect 127.0.0.1 3658  ,---.  ,------. ,--------.,--.  ,--.  ,---.   ,---. /  O  / |  .--. ''--.  .--'|  '--'  | /  O  / '   .-'|  .-.  ||  '--'.'   |  |   |  .--.  ||  .-.  |`.  `-.|  | |  ||  |/  /    |  |   |  |  |  ||  | |  |.-'    |`--' `--'`--' '--'   `--'   `--'  `--'`--' `--'`-----'wiki      https://alibaba.github.io/arthastutorials https://alibaba.github.io/arthas/arthas-tutorialsversion   3.1.7pid       30725time      2020-01-30 15:48:33

输出 help 命令,可以看到所有支持的命令列表。今天,我们会用到 dashboard、thread、jadwatchognl 命令,来定位这个 HighCPUApplication 进程。你可以通过官方文档:https://arthas.aliyun.com/doc/commands.html,查看这些命令的完整介绍:F4J28资讯网——每日最新资讯28at.com

图片图片F4J28资讯网——每日最新资讯28at.com

dashboard 命令用于整体展示进程所有线程、内存、GC 等情况,其输出如下:F4J28资讯网——每日最新资讯28at.com

图片图片F4J28资讯网——每日最新资讯28at.com

可以看到,CPU 高并不是 GC 引起的,占用 CPU 较多的线程有 8 个,其中 7 个是 ForkJoinPool.commonPool。F4J28资讯网——每日最新资讯28at.com

ForkJoinPool.commonPool 是并行流默认使用的线程池。F4J28资讯网——每日最新资讯28at.com

所以,此次 CPU 高的问题,应该出现在某段并行流的代码上。F4J28资讯网——每日最新资讯28at.com

接下来,要查看最繁忙的线程在执行的线程栈,可以使用 thread -n 命令。这里,我们查看下最忙的 8 个线程:F4J28资讯网——每日最新资讯28at.com

thread -n 8

输出如下:F4J28资讯网——每日最新资讯28at.com

图片图片F4J28资讯网——每日最新资讯28at.com

可以看到,由于这些线程都在处理 MD5 的操作,所以占用了大量 CPU 资源。我们希望分析出代码中哪些逻辑可能会执行这个操作,所以需要从方法栈上找出我们自己写的类,并重点关注。F4J28资讯网——每日最新资讯28at.com

由于主线程也参与了 ForkJoinPool 的任务处理,因此我们可以通过主线程的栈看到需要重点关注 org.geekbang.time.commonmistakes.troubleshootingtools.highcpu.HighCPUApplication 类的 doTask 方法。F4J28资讯网——每日最新资讯28at.com

接下来,使用 jad 命令直接对 HighCPUApplication 类反编译:F4J28资讯网——每日最新资讯28at.com

jad org.geekbang.time.commonmistakes.troubleshootingtools.highcpu.HighCPUApplication

可以看到,调用路径是 main->task()->doTask(),当 doTask 方法接收到的 int 参数等于某个常量的时候,会进行 1 万次的 MD5 操作,这就是耗费 CPU 的来源。那么,这个魔法值到底是多少呢?F4J28资讯网——每日最新资讯28at.com

图片图片F4J28资讯网——每日最新资讯28at.com

你可能想到了,通过 jad 命令继续查看 User 类即可。这里因为是 Demo,所以我没有给出很复杂的逻辑。在业务逻辑很复杂的代码中,判断逻辑不可能这么直白,我们可能还需要分析出 doTask 的“慢”会慢在什么入参上。F4J28资讯网——每日最新资讯28at.com

这时,我们可以使用 watch 命令来观察方法入参。如下命令,表示需要监控耗时超过 100 毫秒的 doTask 方法的入参,并且输出入参,展开 2 层入参参数:F4J28资讯网——每日最新资讯28at.com

watch org.geekbang.time.commonmistakes.troubleshootingtools.highcpu.HighCPUApplication doTask '{params}' '#cost>100' -x 2

可以看到,所有耗时较久的 doTask 方法的入参都是 0,意味着 User.ADMN_ID 常量应该是 0。F4J28资讯网——每日最新资讯28at.com

图片图片F4J28资讯网——每日最新资讯28at.com

最后,我们使用 ognl 命令来运行一个表达式,直接查询 User 类的 ADMIN_ID 静态字段来验证是不是这样,得到的结果果然是 0:F4J28资讯网——每日最新资讯28at.com

[arthas@31126]$ ognl '@org.geekbang.time.commonmistakes.troubleshootingtools.highcpu.User@ADMIN_ID'@Integer[0]

需要额外说明的是,由于 monitor、trace、watch 等命令是通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此诊断结束要执行 shutdown 来还原类或方法字节码,然后退出 Arthas。F4J28资讯网——每日最新资讯28at.com

在这个案例中,我们通过 Arthas 工具排查了高 CPU 的问题:F4J28资讯网——每日最新资讯28at.com

  • 首先,通过 dashboard + thread 命令,基本可以在几秒钟内一键定位问题,找出消耗 CPU 最多的线程和方法栈;
  • 然后,直接 jad 反编译相关代码,来确认根因;
  • 此外,如果调用入参不明确的话,可以使用 watch 观察方法入参,并根据方法执行时间来过滤慢请求的入参。

可见,使用 Arthas 来定位生产问题根本用不着原始代码,也用不着通过增加日志来帮助我们分析入参,一个工具即可完成定位问题、分析问题的全套流程。F4J28资讯网——每日最新资讯28at.com

对于应用故障分析,除了阿里 Arthas 之外,还可以关注去哪儿的Bistoury :https://github.com/qunarcorp/bistoury工具,其提供了可视化界面,并且可以针对多台机器进行管理,甚至提供了在线断点调试等功能,模拟 IDE 的调试体验。F4J28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-15212-0.html实战!使用阿里 Arthas 工具分析 CPU 飙高

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 嵌入式框架设计中的四种常用模式

下一篇: Vue 3.3.6 发布,得益于WeakMap,它更快了

标签:
  • 热门焦点
  • Raft算法:保障分布式系统共识的稳健之道

    1. 什么是Raft算法?Raft 是英文”Reliable、Replicated、Redundant、And Fault-Tolerant”(“可靠、可复制、可冗余、可容错”)的首字母缩写。Raft算法是一种用于在分布式系统
  • Automa-通过连接块来自动化你的浏览器

    1、前言通过浏览器插件可实现自动化脚本的录制与编写,具有代表性的工具就是:Selenium IDE、Katalon Recorder,对于简单的业务来说可快速实现自动化的上手工作。Selenium IDEKat
  • 三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • 当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己“当家”的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • 最薄的14英寸游戏笔记本电脑 Alienware X14已可以购买

    2022年1月份在国际消费电子展(CES2022)上首次亮相的Alienware新品——Alienware X14现在已经可以购买了,这款笔记本电脑被誉为世界上最薄的 14 英寸游戏笔
  • AI艺术欣赏体验会在上海梅赛德斯奔驰中心音乐俱乐部上演

    光影交错的镜像世界,虚实幻化的视觉奇观,虚拟偶像与真人共同主持,这些场景都出现在2019世界人工智能大会的舞台上。8月29日至31日,“AI艺术欣赏体验会”在上海
Top