作者 | 刘慕雨
在信息系统建设方面,工商银行一直积极探索,以开放的姿态借鉴行业先进经验,旨在为客户提供更优质的金融服务和用户体验。随着分布式架构和云计算平台在工行的广泛应用,如何高效排查程序错误或性能瓶颈,是个棘手的问题。
为此,我们基于 Arthas 建设了在线诊断平台,在保护客户信息安全的原则基础上,对相关能力做了剪裁和整合,通过 Web 方式支持更复杂的交互场景,在实际线上问题分析中发挥关键作用。
工行在线诊断平台:
下面对工行在线诊断平台的建设做个阶段性总结,分享一下我们的建设经验、实际效果以及未来展望,也希望能给社区提供一个参考。
传统方式排查问题的痛点
对于后端工程师,一旦线上程序逻辑出错,问题排查如同破案,在分析研判时,问题现场的第一手信息是最珍贵的。开发人员很容易首先想到的就是阅读日志,从海量的日志中寻找蛛丝马迹,这就好比是对犯罪现场周边的视频监控录像逐一回看,非常辛苦。如果问题现场的日志记录缺失,就尝试在本地重现问题并调试解决,本地难以重现的,只能再加日志,再部署,再重现,然后再查日志,效率较低。对于复杂一些的比如程序性能问题,如何定位性能瓶颈,一不小心又要回到加日志、部署、查日志、再加日志的老路,不仅效率不高,也破坏了问题现场。
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 原理图:
比如,使用 watch 命令,实时观测方法的调用情况;使用 jad 命令,把字节码反编辑成 java 代码;使用 redefine 命令,可以对代码做热更新,让开发人员告别不停“加日志、部署、查日志、再加日志”的套娃时代。在 Arthas 刚推出没多久,还提供了一个简单的 Web Console 功能,实际是一个以 Websocket 访问 Arthas 进程的方式,这也为我们后面建设在线诊断平台提供了思路。
落地使用上的困难
直接使用 Arthas 的命令行交互方式,不能满足金融级运维要求,在落地使用上存在一些实际的问题:
信息安全问题:Arthas 可以通过命令行方式,直接观测方法的入参、返回值,这就涉及到一些客户敏感信息,直接在生产环境使用命令行操作显然是不合适的。
学习成本问题:工具的安装使用存在一定的学习成本,尤其是对于新员工来说。
多人协作问题:当多个开发者对同一个目标进程进行诊断时,可