首页 > 【面试干货】故障问题排查思路
头像
LvanWong
编辑于 2020-11-22 06:22
+ 关注

【面试干货】故障问题排查思路

第一次写,如果有写的不好的地方,欢迎指出


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

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是程序员的基本功之一

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         跟踪实时日志
--s***ring   显示自某个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去排查内存问题,等等。

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

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使用时间

纵轴:方法运行的堆栈

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


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

这里介绍一个:tcpdump

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

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

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


再这个层面我可能没有那么多场景,
不过我相信,校招每次面试官问操作系统、计算机网络都不是白问的,
在你到工作中真的遇到的时候,你能够根据你学到知识解决问题。能解决问题!!


这里举例我遇到过的两个问题吧:
1、jdk1.7、1.8对TLS的支持是不一样的,导致https请求调不通

我们知道https = http+ssl/tls
某次我换了jdk版本,发现一个https请求一直调用不通(使用的是CloseableHttpAsyncClient工具类),一直显示“connect close”
后面再dockers里面查看,发现是DK1.7与JDK1.8的SSL协议兼容问题

虽然JDK1.7也支持TLSv1.2 但默认是不启用的,使用后面调整了代码



2、TCP连接异常断开
我上次出现问题的原因是服务器压根扛不高峰的压力,后面用消息队列做了削峰,当然也请教过很多同事大佬
总体分析过来,就是需要基础扎实,还要就是带着脑子耐心分析吧
可以参考下面两个文章:

全部评论

(6) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

热门推荐