关于arthas落地化

2020-11-27  本文已影响0人  JAVA弑云

转载https://github.com/lyghzh/pub/blob/main/doc/%E5%B7%A5%E5%95%86%E9%93%B6%E8%A1%8C%E6%89%93%E9%80%A0%E5%9C%A8%E7%BA%BF%E8%AF%8A%E6%96%AD%E5%B9%B3%E5%8F%B0%E7%9A%84%E6%8E%A2%E7%B4%A2%E4%B8%8E%E5%AE%9E%E8%B7%B5.md

工商银行打造在线诊断平台的探索与实践

作者 | 刘慕雨

在信息系统建设方面,工商银行一直积极探索,以开放的姿态借鉴行业先进经验,旨在为客户提供更优质的金融服务和用户体验。随着分布式架构和云计算平台在工行的广泛应用,如何高效排查程序错误或性能瓶颈,是个棘手的问题。为此,我们基于Arthas建设了在线诊断平台,在保护客户信息安全的原则基础上,对相关能力做了剪裁和整合,通过Web方式支持更复杂的交互场景,在实际线上问题分析中发挥关键作用。

工行在线诊断平台:


image.png

下面对工行在线诊断平台的建设做个阶段性总结,分享一下我们的建设经验、实际效果以及未来展望,也希望能给社区提供一个参考。

传统方式排查问题的痛点

对于后端工程师,一旦线上程序逻辑出错,问题排查如同破案,在分析研判时,问题现场的第一手信息是最珍贵的。开发人员很容易首先想到的就是阅读日志,从海量的日志中寻找蛛丝马迹,这就好比是对犯罪现场周边的视频监控录像逐一回看,非常辛苦。如果问题现场的日志记录缺失,就尝试在本地重现问题并调试解决,本地难以重现的,只能再加日志,再部署,再重现,然后再查日志,效率较低。对于复杂一些的比如程序性能问题,如何定位性能瓶颈,一不小心又要回到加日志、部署、查日志、再加日志的老路,不仅效率不高,也破坏了问题现场。

JDK提供的工具如jps、jmap、jstat、jstack、jconsole等,可以为工程师提供一些帮助。Linux操作系统的命令,如top、free、pidstat、vmstat、iostat等,也是排查问题尤其是性能调优必不可少的工具。但直接使用这些工具,对工程师的个人技术能力和经验要求较高。而且对企业来说,在生产环境直接通过命令行操作,是很敏感的行为。因此,如何在保证安全的基础上,又能像调试本地程序一样更便捷的排查分析,是个棘手的问题。

Arthas的解决方案

2018年我们在参加一次Dubbo Meetup上,听了关于使用开源的Arthas工具排查Dubbo问题的分享。研究发现,Arthas通过JVM的Attach机制,在不影响服务连续性的情况下,实时连接到目标进程,便于工程师在线排查问题。此外,Arthas的字节码增强框架,可以通过Instrumentation技术动态修改字节码(需要Java虚拟机实现支持retransformClasses),替换成新的class,这就为在线调试提供了可能。

Arthas原理图:


image.png

比如,使用watch命令,实时观测方法的调用情况;使用jad命令,把字节码反编辑成java代码;使用redefine命令,可以对代码做热更新,让开发人员告别不停“加日志、部署、查日志、再加日志”的套娃时代。在Arthas刚推出没多久,还提供了一个简单的Web Console功能,实际是一个以Websocket访问Arthas进程的方式,这也为我们后面建设在线诊断平台提供了思路。

落地使用上的困难

直接使用Arthas的命令行交互方式,不能满足金融级运维要求,在落地使用上存在一些实际的问题:

技术方案

我们设计了一套轻巧的架构,让开发人员以Web UI的方式,便捷、直观的使用各类在线诊断能力。那么我们是怎么做的呢?

1. 整体架构

整体架构大致分成在线诊断平台、在线诊断网关(后简称网关)、在线诊断进程三部分,通过一个网关集群统一代理对云上、云下节点的访问,网关提供Restful接口给在线诊断平台(后简称平台)调用。一个接口可能组合了多个Arthas指令,也可能对指令的执行结果进行剪裁和修改,处理成json格式数据返回给平台做展示。

整体架构图:


image.png

2. 诊断过程详解

工程师第一次对目标服务器进行诊断时,涉及安装、启动、使用、卸载等一系列步骤,如下图所示:


image.png

(1)诊断前准备: 下图是我们的安装界面,当用户授权通过后,即可填写目标服务器信息开始安装。如果是传统虚拟机时,用户需输入虚拟机ip和目标进程关键字(如进程的pid、进程的启动类名、进程的jar名称等);如果是容器,还需提供容器id:

image.png

(2)开始安装: 用户点击安装后,会触发一系列操作。首先在线诊断平台发送一个探活请求给网关,网关收到请求后相应的也发送一个空指令给目标节点。平台根据响应判断,如果探活成功,则发送诊断请求开始诊断;否则发送安装请求到行内指定的管理系统(传统虚拟机/容器,后续简称通道)。
(3)获取安装介质: 以传统虚拟机为例(如果是容器则把安装介质下发到宿主机),通道去目标服务器指定目录查找诊断程序的版本文件,如果获取成功且版本是最新的,则通道直接执行启动脚本。否则,通道会通知目标服务器从公共的文件服务器上,下载最新版本的安装介质。
(4)启动诊断程序: 安装介质实际是一个压缩包,包括安装脚本、jar、版本文件等。安装介质首次下载到目标服务器后,通道对其解压并执行启动脚本。我们修改了Arthas的启动脚本,根据用户输入的进程关键字,找到目标进程,然后使用和目标进程相同的jdk版本,启动诊断程序。注意,启动时Arthas的target-ip参数被设置为网关地址,以隔离其他渠道访问,默认值127.0.0.1表示只能本地访问。
(5)使用和卸载: 诊断进程接收用户诊断指令,开始诊断。使用完用户可手工点击卸载,销毁诊断进程。

实际使用效果

这里举几个例子,看一下平台的实际使用效果。

1. 控制面板

基于dashboard命令,控制面板实时展示目标进程的整体运行情况,包括线程、jvm、操作系统等,每隔10s刷新一次,用户也可选择手动刷新。线程按CPU使用率取TOP10,jvm主要展示内存分布和GC情况:


image.png

点击查询更多可以查看详情,比如监控jvm的内存及垃圾回收情况:


image.png

2. 线程清单

线程清单页面按CPU使用率分页展示所有线程,支持按线程状态(如RUNNABLE、BLOCKED)过滤,在控制面板页面点击查看更多,也可以直接跳到此页面:
[图片上传失败...(image-3d7371-1606444135307)]

点击某条记录,跳转到线程详情,展示线程堆栈,在堆栈中选中一个方法,则可以直接进行方法观测、方法追踪、方法追溯、方法监控、反编译等操作:
[图片上传失败...(image-9a9501-1606444135307)]

3.方法监测

方法监测指的是对方法运行情况的监控和观测,具体包括下面几个功能。
(1)方法观测: 支持对选中的堆栈中的方法进行观测,也就是watch命令,这里以开发环境举例(开发环境不做数据脱敏),可以实时捕获方法的输入、输出、异常堆栈、执行耗时等,并且支持指定观测次数、耗时限制等条件。比如我这里对UserServiceImpl类的findUser方法的调用情况进行观测:
[图片上传失败...(image-140407-1606444135307)]

当方法抛异常时展示堆栈:
[图片上传失败...(image-535444-1606444135307)]

(2)方法追踪: 方法追踪指的是追踪方法的调用栈,打印每个方法的执行耗时,基于trace命令实现,在排查性能问题时非常有用。看一下方法追踪的界面,直接高亮标记出调用栈上耗时最久的方法,也支持配置过滤规则,过滤一些不关心的方法(比如java底层代码)。在这个方法调用栈界面,又可以选中其中某个方法,进行观测、追溯、监控等操作,不同的诊断能力之间都是打通的:
[图片上传失败...(image-aac74d-1606444135307)]

(3)方法追溯: 有时需要追溯方法被谁调用了,则可以使用方法追溯。比如这里通过方法追溯可以看到Dubbo的Filter处理链:
[图片上传失败...(image-b04d2e-1606444135307)]

(4)方法监控: 有时我们需要对某个方法一段时间的执行情况进行观测,这时可以使用方法监控功能。比如这里每隔10秒统计一次方法的执行次数、成功失败次数、平均耗时、失败率等指标:
[图片上传失败...(image-845635-1606444135307)]

4. 反编译

当我们需要确认Java虚拟机加载的代码情况时,比如你修改的代码是否生效,我们在本地经常使用一些反编译工具以达目的。jad命令提供了在线反编译能力,我们基于jad以界面的形式展示Java虚拟机加载的实际代码,同时也会展示类加载器树、类的路径。比如这里对findUser方法的反编译情况(不指定方法名的话,则对整个类反编译),可以看到这个类属于springboot项目,被spring的类加载器加载:
[图片上传失败...(image-662698-1606444135307)]

5. 其他能力

我们对其他的实用命令,也做了一些封装和定制,比如sc、sm、redefine、tt等,这里就不一一介绍。此外,我们也将实时诊断能力和内部监控运维系统相整合,在排查问题时,可以通过直接跳转的方式申请在线诊断权限,对目标进程做实时诊断。下图是行内全链路跟踪产品截图,支持直接对问题链路关联的节点进行诊断:
[图片上传失败...(image-7cd195-1606444135307)]

回顾与展望

简要回顾一下前面提到的几个困难和我们的解决方案:

当前,工行在线诊断平台已在实际线上问题分析中持续发挥关键作用,Arthas也越来越得到社区的关注和开发者的认可。Arthas官方在新版本中已经支持了Rest接口,提供结构数据,也支持了更丰富的诊断命令,这跟我们的建设思路不谋而合。未来,我们将继续积极参与社区建设,将工行的实践经验分享给大家。

上一篇 下一篇

猜你喜欢

热点阅读