• Ukieweb

    佳的博客

    曾梦想仗剑天涯,后来工作忙没去。

Arthas - Alibaba 开源 Java 诊断工具 线上问题定位处理的终极利器

Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。

前言

在使用 Arthas 之前,当遇到 Java 线上问题时,如 CPU 飙升、负载突高、内存溢出等问题,你需要查命令,查网络,然后 jps、jstack、jmap、jhat、jstat、hprof 等一通操作。最终焦头烂额,还不一定能查出问题所在。而现在,大多数的常见问题你都可以使用 Arthas 轻松定位,迅速解决,及时止损,准时下班。

1、Arthas 介绍

Arthas 是 Alibaba 在 2018 年 9 月开源的 Java 诊断工具。支持 JDK6+, 采用命令行交互模式,提供 Tab 自动不全,可以方便的定位和诊断线上程序运行问题。

Arthas 官方文档十分详细,本文也参考了官方文档内容,同时在开源在的 Github 的项目里的 Issues 里不仅有问题反馈,更有大量的使用案例,也可以进行学习参考。

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

官方文档:https://alibaba.github.io/arthas

2、Arthas 使用场景

得益于 Arthas 强大且丰富的功能,让 Arthas 能做的事情超乎想象。下面仅仅列举几项常见的使用情况,更多的使用场景可以在熟悉了 Arthas 之后自行探索。

  1. 是否有一个全局视角来查看系统的运行状况?

  2. 为什么 CPU 又升高了,到底是哪里占用了 CPU ?

  3. 运行的多线程有死锁吗?有阻塞吗?

  4. 程序运行耗时很长,是哪里耗时比较长呢?如何监测呢?

  5. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?

  6. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?

  7. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?

  8. 有什么办法可以监控到 JVM 的实时运行状态

3、Arthas 下载运行

前文已经提到,Arthas 是一款命令行交互模式的 Java 诊断工具,由于是 Java 编写,所以可以直接下载相应 的 jar 包运行

如果下载速度比较慢,可以尝试用阿里云的镜像仓库,比如要下载3.x.x版本(替换3.x.x为最新版本),下载的url是:

https://maven.aliyun.com/repository/public/com/taobao/arthas/arthas-packaging/3.x.x/arthas-packaging-3.x.x-bin.zip

curl -O https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar
  • -pid 15146 指定目标java进程ID

  • -target-ip 127.0.0.1 指定监听 ip

  • -telnet-port 3658 此端口供telnet 用,

  • -http-port 8563 指定http端口

更多参数设置

[root@tmp opt]# java -jar arthas-boot.jar -h                            
[INFO] arthas-boot version: 3.2.0
Usage: arthas-boot [-h] [--target-ip <value>] [--telnet-port <value>]
       [--http-port <value>] [--session-timeout <value>] [--arthas-home <value>]
       [--use-version <value>] [--repo-mirror <value>] [--versions] [--use-http]
       [--attach-only] [-c <value>] [-f <value>] [--height <value>] [--width
       <value>] [-v] [--tunnel-server <value>] [--agent-id <value>] [--stat-url
       <value>] [pid]
Options and Arguments:
 -h,--help                      Print usage
    --target-ip <value>         The target jvm listen ip, default 127.0.0.1
    --telnet-port <value>       The target jvm listen telnet port, default 3658
    --http-port <value>         The target jvm listen http port, default 8563
    --session-timeout <value>   The session timeout seconds, default 1800
                                (30min)
    --arthas-home <value>       The arthas home
    --use-version <value>       Use special version arthas
    --repo-mirror <value>       Use special maven repository mirror, value is
                                center/aliyun or http repo url.
    --versions                  List local and remote arthas versions
    --use-http                  Enforce use http to download, default use https
    --attach-only               Attach target process only, do not connect
 -c,--command <value>           Command to execute, multiple commands separated
                                by ;
 -f,--batch-file <value>        The batch file to execute
    --height <value>            arthas-client terminal height
    --width <value>             arthas-client terminal width
 -v,--verbose                   Verbose, print debug info.
    --tunnel-server <value>     The tunnel server url
    --agent-id <value>          The agent id register to tunnel server
    --stat-url <value>          The report stat url
 <pid>                          Target pid

除了直接运行之外,还可以: 把Arthas安装到基础镜像里以Java Agent的方式启动执行结果存日志,方便分析

4、教程

命令列表

https://arthas.gitee.io/commands.html

在线视频

https://alibaba.github.io/arthas/arthas-tutorials?language=cn


image.png

5. 通过 浏览器/telnet 连接arthas

Arthas 目前支持 Web Console,用户在 attach 成功之后,可以直接访问http://127.0.0.1:3658/  或者 终端: telnet ip 3658

image.png


默认情况下,arthas 只 listen 127.0.0.1,所以如果想从远程连接,则可以使用 --target-ip 参数指定 listen IP,更多参考 -h 的帮助说明。 注意会有安全风险,考虑下面的 tunnel server 的方案https://alibaba.github.io/arthas/web-console.html#arthas-tunnel-serverarthas

4、使用过程问题记录

  • 直接退出后 占用端口 未释方:  退出 arthas 时候,需要使用 stop 清理

0
0
下一篇:java 程序 jvm 内存分配使用 及 相关概念详解

0 条评论

老佳啊

85后,大专学历,中原人士,家里没矿。

由于年轻时长的比较帅气,导致在别人眼里,我一直不谈恋爱的原因是清高,实则是自己的小自卑。最大的人生目标就是找一个相知相爱相容的人,共度余生。

和人相处时如果能感受到真诚,会非常注重彼此的关系,对别人没有什么心机,即使有利益冲突,一般也会以和为贵,因为在这个世界上,物质的东西,从来不会吸引到我。

特别迷恋那些大山大水,如果现在还能隐居,可能早就去了。对那些宏伟的有底蕴的人文景观比较不感冒。

从事于IT行业,却一直对厨房念念不忘,由于身材魁梧,总觉得自己上辈子是个将军,可惜这辈子没当兵,也不会打架。