服务不可用排查思路
前言
上周四,服务器突然挂了。ssh都连接不上,日常的小程序后台直接down掉,小程序每日大概3k左右访问量。于是乎就开启了,排查之后。
排查阶段
什么先别说,先把服务恢复再说。重启阿里云服务器,ssh连接。开启nginx,redis,mysql,java服务。一系列操作,先把服务先启动了。
服务器安装了cloudmonitor(云监控),非常建议安装,对排查问题,查看cpu,内存非常的有帮助。
查看cpu,内存如下:
我们先从最后一幅图看起,可以明显的看到9.30左右的时候,网络的流入流出速率立马飙升了。因此初步可以断定,cpu,内存飙升,可能跟网络有关。
9.30分左右的时候,服务器大概运行了以下几个跟网络有关的应用:
- mysql
- redis
- ngxin
- java服务(osc,sign等等)
- docker
很明显前三个是日常的应用,基本上不会有什么问题,首先排除。剩下的就是java相关的服务和docker了。
第一个想法是不是java的访问量突然增大,然后服务器资源不够,然后把服务给打死了。然后去看了java服务的相关日志,发觉9.30分并无异常,跟平常的访问流量无多大变化。故排除。
那么就是docker服务了。
docker我每天会有一个定时任务,用来刷题的。基本上每天九点多就会start,然后11点stop掉。遂查看docker日志:
可以明显的看到9.23分的时候。docker开启,开始刷题。可以断定就是docker的锅了。此时把docker kill掉,定时任务关掉,至此没在出现过问题了。
问题在现
为确定是否是docker的问题,于是过了几天,我又开启了docker的定时任务。查看服务器资源如下:
问题重新复现出来了,很明显,这就是docker的锅。至于为什么开启docker的这个服务,内存就飙升,cpu飙升,导致服务器直接down掉。这个原因就要问这个image的作者了。
个人初步猜想,内存泄露了。
我们可以仔细观察下内存的图片。约9.30的时候docker服务启动,内存上升至70%左右,这都是非常的合理的。
在大概10点左右的时候,任务跑完了(通过查看日志)。但服务并没有stop。
从10点开始,内存一路飙升,飙升至95%,最终我kill掉了docker,内存回归正常。
这是很明显的内存泄露,因为此镜像为私人镜像,并且不开源,具体代码无从查起,也是没有办法的了。
不过已向改仓库提了issue。
总结
从这次服务器挂掉,有以下几点感想。
- 日志很重要,无论是什么服务,一定要记得把日志排在首位
- 服务器一定要有监控,并且要有监控预警,超过多少,发短信,电话通知。
- 问题思路排查要有理有据,一步一步来,不能瞎子抓阄似的。
- 服务挂掉,首先要恢复服务,比如重启等操作
这次服务器宕机并没有任何影响,毕竟没啥用户,不过感觉对问题的排查更加深刻了。业务推动技术,这点是毋庸置疑的了。
而且业务上线后,慢慢也会出现很多问题,一个一个解决,也能学习到很多东西。