问题排查
- 针对各种常见的线上问题,梳理下排查思路。
业务问题
- 线上问题大多数时候都是业务问题引发的问题,当线上环境绝大多数请求都是正常,当有部分或者某一个用户有问题,此时怎么针对性的排查
- 在当前微服务体系下,一般都会有分布式链路追踪系统 ,以及ELK日志系统,我们完全可以通过监控平台去找到问题的点:
- 异常日志的抓取
- 此时我们可以通过日志追踪得到当前用户的请求信息:
- 利用Arths的watch命令监控对应异常接口,通过日志得到对应的参数,通过Dubbo的invoke 命令模拟线上用户的请求,从而复现问题,解决问题
非业务问题
- Arthas工具是一个很好的在线定位问题的工具,安装简单
- 在非业务问题上的排查流程,必然先检查CPU, 内存, 线程等计算机核心资源
- 我们通过dashboard命令可以得到本服务中对应的信息,并且每隔几秒会获取最新数据。
- 可以在线程监控区域看到:线程id, 名称,状态,CPU占用情况,是否守护线程等
- 内存嘻嘻:堆内存,Eden区,Survivor区,老年代,方法区
- 机器情况
-
如上我们可以得到对应的线程信息关键的线程id
-
接着可以通过Thread thread_id 查询某个线程的执行堆栈,甚至都不用dump
-
还有反编译jad,在线查询对应类的源码信息,方便问题排查
-
但是大多线上事故都不会有时间去临时查找,对应生成系统,能在线定位时间不多,
-
我会按如下步骤进行:
- 按顺序重启有问题的机器,看是否能解决问题,
- 在此同时,在最后重启的哪台机器上先执行jmap -dump指令将java堆的线程情况保存下来
- 机器重启后如果不能恢复,会回退到之前版本,保证线上业务正常
- 将保存下的dump文件导入到本地
- 用jdk自带的 java visualVM工具将dump文件导入
- visualVM可以通过可视化界面查看 dump 文件中记录所使用的类,每个类中对象以及各种当前环境下具体内容线下分析具体原因后在去解决。