分享一个服务器重启问题发现的过程
最近突然机房的机器开始频繁出现重启的状况,以前也出现过机器重启的情况,但是重启之后未发现任何异常情况,于是当时判定是电压不稳引起的个别情况,但是最近这个情况越来越频繁,于是就需要重新思考这个问题出现的原因了。1、这个情况是在给机房搬入一批机器后开始出现的,因此初步怀疑是不是一个机柜机器太多电压不稳造成的,跟运维确认发现这些机器之前就是在那个机房的,又搬回来原来的位置,所以电压不稳的可能性不大,最后事实证明也确实不是这个原因,这个时间点出问题纯属巧合2、由于出问题的机器多了,于是就找这些机器的共同点,系统崩溃或者重启后唯一能给的线索就是系统日志/var/log/messages,看了一下出问题的机器,发现就是在某个点突然重启了,没任何预兆,这一点跟之前那些机器重启时的特征一样。3、第二个猜想,这些机器是不是运行时间过长了,就是需要重启呢?(这个猜想有点扯,因为服务器没这一说,但是隐约记得原来公司的运维确实会过段时间,大概是半年对机器做一次维护,为什么做这个事情,现在记得不是很清楚了),于是用last命令查看这些机器的倒数第二次启动的时间,确认运行时间后发现这些机器基本上都运行了209天左右,当时认为这个迷信了,但是最终发现这就是事实。4、于是去检查所有机器的启动时间(uptime可以告诉你启动了多长时间),发现还有三台机器运行了209到210天了,于是上这三台机器去看dmesg信息,发现有一个从来没见过的错误信息如下Dec 14 15:23:02 localhost kernel: BUG: soft lockup - CPU#6 stuck for 17163091968s! [php-fpm:27962]并且在所有之前重启过的机器日志都发现了这一条记录,但是神奇的是,这些日志一般产生的比重启的时间早1到2天,这就是为什么在之前的机器上没发现问题的原因,因为当时只检查了重启前后的日志,没再往前检查5、有了这个错误信息,直接上网google,很快就发现了这个问题的原因,这是一个系统内核bug,服务器在运行209天左右的时候会触发这个bug,在2.6.32-33内核上都存在,但是可能跟cpu有关,并非所有的机器上都会出这个问题,因为有些机器运行了240天都没重启过,因为cpu型号不一样。解决的办法有两个,一个是更新内核,一个是定期重启,目前直接的办法就是在出问题之前就直接重启了,好在特征很明显,所有检查一下所有机器,看看谁输出过这条日志。 总结:1、解决问题如抽丝剥茧,需要一点点分析,当时一件事情发生的频繁变大时,一定有问题的,需要做的是发现规律2、系统down机解决问题的唯一办法是messages日志,有时候需要往前查很久的日志,不能只看发生问题的时间点上的日志3、没事儿就去看看每个机器的dmesg日志,如果发现没有见过的输出信息,一定要去google,确定这是一个无害的日志 总之,凡是多细心一些,也许很多问题就能提前解决掉,比如这个问题,如果早发现这个stuck的日志,可能早就定位问题了,而从问题的表现看这条日志到服务器重启有一到两天的时间,足够停服解决问题了。