赞
踩
上个月,阿里开源了监控与诊断工具 「Arthas」,一款可用于线上问题分析的利器,短期之内收获了大量关注,在 Twitter 上连 Java 官方的 Twitter 也转发了,真的很赞。
GitHub 上是这样自述的:
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
我一般看到感兴趣的开源工具,会找几个最感兴趣的功能点切入,从源码了解设计与实现原理。对于一些自己了解的实现思路,再从源码中验证一下是否是采用相同的实现思路。如果实现和自己想的一样,可能你会想,啊哈,想到一块了。如果源码中是另一种实现,你就会想 Cool, 还可以这样玩。仿佛如同在和源码的作者对话一样。
这次趁着国庆假期看了一些「Arthas」的源码,大致总结下。
从源码的包结构上,可以看到分为几个大的 模块:
Agent -- VM 加载的自定义 Agent
Client -- Telnet 客户端实现
Core -- Arthas 核心实现,包含连接 VM, 解析各类命令等
Site -- Arthas 的帮助手册站点内容
我主要看了以下几个功能:
连接进程
反编译class,获取源码
查询指定加载的 class
连接到指定的进程,是后续监控与诊断的基础。只有先 attach 到进程之上,才能获取 VM 对应的信息,查询 ClassLoader 加载的类等等。
怎样连接到进程呢?
用于类似诊断工具的读者可能都有印象,像 JProfile、 VisualVM 等工具,都会让你选择一个要连接到的进程。然后再在指定的 VM 上进行操作。比如查看对应的内存分区信息,内存垃圾收集信息,执行 BTrace脚本等等。
咱们先来想想,这些可供连接的进程列表,是怎么列出来的呢?
一般可能会是类似 ps aux | grep java
这种,或者是使用 Java 提供的工具 jps -lv
都可以列出包含进程id的内容。我在很早之前的文章里写过一点 jps 的内容(你可能不知道的几个java小工具),其背后实现,是会将本地启动的所有 Java 进程,以 pid
做为文件名存放在Java 的临时目录中。这个列表,遍历这些文件即可得出来。
Arthas 是怎么做的呢?
在启动脚本 as.sh
中,有关于进程列表的代码如下,实现也是通过jps
然后把Jps自己排除掉:
- # check pid
- if [ -z ${TARGET_PID} ] && [ ${BATCH_MODE} = false ]; then
- local IFS_backup=$IFS
- IFS=$'\n'
- CANDIDATES=($(${JAVA_HOME}/bin/jps -l | grep -v sun.tools.jps.Jps | awk '{print $0}'))
-
- if [ ${#CANDIDATES[@]} -eq 0 ]; then
- echo "Error: no available java process to attach."
- # recover IFS
- IFS=$IFS_backup
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。