线上故障排除思路

本篇介绍线上故障,排除思路。

参考自一次公司内部分享《要你命3000》,是我们公司很牛逼的搬砖老师分享的,小弟学到的只是皮毛,总结分享给大家

 

线上故障排除分四个层次的问题

Java服务层

这是一个很基础的层面,很多都是从Java服务层面去解决问题。

一、debug

到实习中,我用到最多的功能就debug,idea的debug功能也挺好用的,如果那还不会,或者你正要去某家公司做Java公司实习,查“IDEA debug”学习一下。

这里简单介绍一下

1、点debug启动、打断点、调用sever

左下角是项目调用的 堆栈信息

下面的Variables是变量信息

 

2、点击step over/ step into /step out

step over ,我的理解就是在当前方法上,进行下一步,执行当前行代码,如果当前行是一个方法调用,会直接得到方法的返回值,而不会进入到这个方法。

 

step into(蓝色)和force step into(红色) 

进入当前代码行的底层,查看他的具体实现,不同是如果当前行是一个方法调用,会进入这个方法的实现。

蓝色与红色的区别:

Force Step Into(红色) 会进入到JDK实现的方法中。

 

step out

跳出当前方法,举例子,如果你执行了step into觉得这方法没啥问题,就点击step out,返回上一层

 

 

 

这个是跳过断点

 

有两句话我很赞成

1、连debug都不会的,不能叫程序员,顶多是个Java学徒。

2、单单会写代码的人其实很普通,更深的层次是能定位问题与解决问题。

二、线上日志

有些项目,他不是我们debug就能解决的。

比如公司的线上项目,他都有很长的一个链路,有些项目你连代码权限都没有,你怎么在你本地跑起来,况且,要是像有些项目3、4个G,你确定你电脑吃得消吗?

 

因此一般情况我们只能在项目里面导入log4j等日志(java代码是:logger.error(“catch a exception”,e) /log.warn/log.info)

 

然后在dockers机器里面看线上日志。

这就考察我们面试过程中被问到的“你熟悉哪写linux命令啊?”

cat、more、less、grep、tail等等 都是看日志可以用的

此外dockers也提供了很多其他的命令,如:

$ docker logs [OPTIONS] CONTAINER
  Options:
        --details        显示更多的信息
    -f, --follow         跟踪实时日志
        --since string   显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
        --tail string    从日志末尾显示多少行日志, 默认是all
    -t, --timestamps     显示时间戳
        --until string   显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)

 

强调:

调试的时候 多打日志!多打日志!

 

如果没有日志,很多时候出个bug,你都不知道从哪弄起。

 

此外,推荐一款日志工具idea 的grep-console 插件 日志变色

idea setting - > plugins 查grep-console 就有,

在自己调试的时候,看的日志可以根据日志等级,区分颜色

 

要不然平时看到的日志一大片都是黑白,有了这个可以快速定位问题

 

三、JVM指令

不得不说Java真的博大精深,单一个虚拟机就可以衍生出很庞大的知识体系。

你可以通过jstack定位出错的线程、通过jmap、jstat去排查内存问题,等等。

说起来这又是一个面试题:你都用哪写linux命令?怎么查的问题?

jps

(JVM Process Status tool,虚拟机进程状况工具)它的功能和 Linux 中的 ps 命令比较类似。

我自己再测试环境经常就jps查看进程然后就kill -9 <进程号>干掉进程号,你们千万别学我。

建议用 kill -2或者kill -15 

Kill-2:功能类似于Ctrl+C是程序在结束之前,能够保存相关数据,然后再退出。


Kill -15 默认的kill方式,相对于给一个信号。

系统会发送一个SIGTERM的信号给对应的程序。当程序接收到该signal后,将会发生以下的事情。

 大部分程序接收到SIGTERM信号后,会先释放自己的资源,然后在停止。但是也有程序可以在接受到信号量后,做一些其他的事情,并且这些事情是可以。如果程序正在等待IO,可能就不会立马做出相应。也就是说,SIGTERM多半是会被阻塞的、忽略。

jinfo

查看参数的,看到info就记得和参数有关系,我是这么记的。

jinfo -flags 45129

这个命令可以查看进程号45129的参数配置。

 

jmap

用于查询堆的快照信息。

jmap -heap 45129:这个命令直接就显示堆的信息信息。在当前出口

但是一般会和下面的jhat结合执行

 

jhat

启动一个 web 站点来分析 jmap 生成的快照文件。

jmap -dump :file = <路径>   进程号

jhap ***.dump

 

 

jstat

监控信息工具,jstat 常用的查询参数有:

-class,查询类加载器信息;
-compiler,JIT 相关信息;
-gc,GC 堆状态;
-gcnew,新生代统计信息;
-gcutil,GC 堆统计汇总信息。

 

jstack

容易和上面记混,应该是stack就是和栈有关。

所以该命令是:查看当前虚拟机的线程快照,用它可以排查线程的执行状况,例如排查死锁、死循环等问题。

打印一下当前线程的快照信息。

 

你是如何做的?

1、除了分析日志,找出问题

2、在容器里面使用linux内存使用情况查看:top、free等

3、使用jvm自带的命令,jmap +jhat 做dump文件分析

4、定位问题 可能是某个连接长时间没有释放、某个代码不合理进行重构、内存大小设置不合理

(mysql慢查询排查也有这样的类似流程,一步步排查出来的)

 

四、业务问题排查利器-Arthas

arthas是一个Java开源诊断神器。

自测了一下~这个安装也不会很麻烦。就跑一个java程序,用jps查看一下进程号,就能跑起来了

功能是真的多,命令也很多

  • 可以提供看性能看板,包括线程、cpu、内存等信息 (下图演示为 dashboard——当前系统的实时数据面板)
  • 输出jvm的各种信息,如gc算法、jdk版本、ClassPath等(下图演示为 jvm——查看当前 JVM 的信息)

真的挺香的,显示的数据也很详细。有些情况下他比看日志那些管用。

再介绍一个命令arthas trace——方法内部调用路径,并输出方法路径上的每个节点上耗时

显示的日志大概这样:

中间件层面

你总不能数据库出点问题,马上就去问DBA,怎么回事吧?

出问题 还是要靠自己排问题先

常用的linux命令

1、查看内存(指的是物理运行内存,不是硬盘内存)

free 可选参数 -m(以mb为单位) -g(以G为单位)

2、查看网络是否连通

ping www.baidu.com

3、查看端口是否开启

ping www.baidu.com -p 80

(面试题:ping命令底层——ICMP协议)

还有好多好多个 top、netstat(netstat -nat  查看TCP各个状态的数量)、df -h -sh 等

 

另外 推荐一个特别强大的感觉:Perf

Perf是Linux自带的性能分析工具

eg:使用perf record记录一下在cpu运行的进程和相关的堆栈是什么

甚至可以,加一些辅助工具,生产火焰图,大概张这样

横轴:cpu使用时间

纵轴:方法运行的堆栈

有了他,可以迅速定位哪个方法占用的时间长,分析问题~

网络、操作系统层面的问题

像我这种初级程序员一般没有用到那个层面,况且可能也没有这个场景,可能在IM这些用的比较多。

不过我相信每次招聘会上每次面试官问你操作系统、计算机网络都不是白问的,肯定有他的理由到你真正遇到的时候。能解决问题!!

 

这里介绍一个:tcpdump

用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 

tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。

它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值