前言
有企业级项目经验的人都应该了解,生产环境是不能在本地进行调试的,本地也无法启动生产环境。开发人员可以尝试在测试环境复现生产环境中的问题,但是,某些问题无法在不同的环境中轻松复现,甚至在重新启动后就消失了。本篇文章将要介绍Arthas这个线上诊断工具,可以帮助开发人员排查线上问题,提升排查效率。
一、什么是Arthas
Arthas 是 Alibaba 开源的 Java 诊断工具,通过全局视角实时查看应用 load、内存、gc、线程、方法的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断。
Arthas(阿尔萨斯)能为我们这些开发人员做什么?当我们遇到以下问题且束手无策时,Arthas 可以帮助我们解决
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到 JVM 的实时运行状态?
- 怎么在线上查看一个方法的运行情况?
二、Arthas安装
Arthas这个工具的安装非常简单,只要把压缩包上传至服务器,然后解压即可使用,最新版可以在Arthas官网或者从 Maven 仓库下载。
下载完成,上传至服务器,解压后,在文件夹里有arthas-boot.jar,直接用java -jar的方式启动,arthas本身也是个Java程序。
java -jar arthas-boot.jar
三、Arthas排查线上问题示例
接下来作者演示一下如何用Arthas诊断和排查线上bug
问题出现:线上出现了个定时任务同步异常,排查相关日志后发现有空指针报错,但是具体的堆栈信息没有打印出来,导致定位不到是哪一行报的空指针异常,因为同步业务较复杂且业务数据量较多,要是一行一行去分析代码中可能报空指针的地方非常耗时,于是就用Arthas进行定位
①通过命令启动arthas
②列出了所有正在运行的java程序
③输入需要,敲回车,监控指定的java程序(也就是生产环境你需要监控的具体项目的Java程序)
④监控该java程序的arthas 监听端口号,因为启动时没有指定端口号,所以默认是3658
⑤arthas版本号
⑥监控的java程序pid
⑦进入arthas 命令行控制台
进入arthas 命令行控制台后输入以下命令(这条命令的含义是监测这个方法的运行情况,后面的参数是方法所在的包以及方法名)
trace com.jinzihao.common.util.SyncUtil syncUsers -n 5 --skipJDKMethod false
输入完毕后,我们需要复现问题,重新执行一次定时任务
+---[min=9.91E-4ms,max=58.495127ms,total=37327.082647ms,count=32401] java.util.List:contains() #855
+---[min=0.001105ms,max=0.014592ms,total=1.076124ms,count=473] com.jinzihao.common.entity.User:getIsValid() #855
+---[min=9.64E-4ms,max=0.122318ms,total=1.001302ms,count=473] java.lang.String:equals() #855 [throws Exception]
---throw:java.lang.NullPointerException #855 [null]
过了不久我们可以看到是方法的855行出现了空指针异常,成功定位到了问题。
使用完毕后我们不要忘记退出程序,以免占用内存资源,如果只是退出当前的连接,可以用quit或者exit命令,Attach 到目标进程上的 arthas 还会继续运行,端口会保持开放,下次连接时可以直接连接上。如果想完全退出 arthas,可以执行stop命令。
总结
本篇文章主要介绍了什么是Arthas以及演示了如何用Arthas排查生产环境的实际问题,Arthas还有很多命令用来排查线上问题,大家可以在Arthas官网的命令列表中自行浏览和学习。