【面试干货】故障问题排查思路
第一次写,如果有写的不好的地方,欢迎指出
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真的博大精深,单一个虚拟机就可以衍生出很庞大的知识体系。
说起来这又是一个面试题:你都用哪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 -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可以将网络中传送的数据包的“头”完全截获下来提供分析。