本篇介绍线上故障,排除思路。
参考自一次公司内部分享《要你命3000》,是我们公司很牛逼的搬砖老师分享的,小弟学到的只是皮毛,总结分享给大家
线上故障排除分四个层次的问题
Java服务层
一般初级程序员,很多都是从Java服务层面去解决问题。
一、debug
如果是代码,来到工作中我用到最多的功能就debug,idea的debug功能也挺好用的,如果那还不会,或者你正要进入实习,查“IDEA debug”学习一下。
有两句话我很赞成
1、连debug都不会的,不能叫程序员,顶多是个Java学徒。
2、会写代码的人一点也不牛逼,更深的层次是能定位问题与解决问题。
二、线上日志+JVM指令
那么问题来了,有些项目,他不是我们debug就能解决的。
比如公司的推送项目,他都有很长的一个链路,有些项目你连代码权限都没有,你怎么在你本地跑起来,况且,要是像有些项目3、4个G,你确定你电脑吃得消吗?
线上日志+JVM指令
1、调试的时候 多打日志!多打日志!
如果没有日志 很多时候出个问题 你在那看多久都用,logger.info /log.warn.
2、不得不说Java语言能够发展这么好肯定是有他的原因的,你可以通过jstack定位出错的线程、通过jmap、jstat去排查内存问题,这些前面都介绍过。
三、业务问题排查利器-Arthas
arthas
是一个Java
开源诊断神器。
这是大牛介绍的,看上去真的挺香的,显示的数据也很详细。有些情况下他比看日志那些管用。
介绍一个命令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、df -h -sh 等
另外 推荐一个特别强大的感觉:Perf
Perf是Linux自带的性能分析工具
eg:使用perf record记录一下在cpu运行的进程和相关的堆栈是什么
甚至可以,加一些辅助工具,生产火焰图,大概张这样
横轴:cpu使用时间
纵轴:方法运行的堆栈
有了他,可以迅速定位哪个方法占用的时间长,分析问题~
网络、操作系统层面的问题
像我这种初级程序员一般没有用到那个层面,况且可能也没有这个场景,可能在IM这些用的比较多。
不过我相信每次招聘会上每次面试官问你操作系统、计算机网络都不是白问的,肯定有他的理由到你真正遇到的时候。能解决问题!!
这里介绍一个:tcpdump
用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。