互联网系统重启日

北京时间今天早上7:59:59,坚果云的所有Linux 操作系统 (CentOS 6.2)都出现CPU利用率暴涨的现象,主要影响的进程包括Java,MySQL等。直接重启Java和MySQL不能解决问题。后得知,该现象不仅发生在坚果云的服务器,很多互联网公司的服务器都在这一刻出现了不同程度的CPU利用率增长!

经过我们紧急的分析和调试,发现是因为操作系统内核在处理闰秒的时候,导致部分试图获取当前系统时间的进程出现Live Lock,也就是说,某个进程/线程在查询系统时间的时候,进入了一种类似死循环的状态,CPU利用率很高,同时不能完成时间查询。

我们猜测JVM和MySQL试图通过CPU硬件晶振的数据获得当前精确的时间,由于闰秒的关系,这个时间和操作系统维持的墙上时间(Wall Time,也就是显示给用户看的时间)不一致,导致了这个问题。

系统时间对于各种服务器程序尤为重要,例如在坚果云的系统中,很多节点都定期收集和报告系统状态,如果系统时间无法获取,可能导致部分节点被误判为故障,自动引起一系列不必要的故障恢复动作。

通过twitter, 邮件列表,论坛等其他媒体,我们发现很多互联网服务商都碰到类似问题,并且给出的方法多是重启服务器。坚果云团队戏称这是互联网全网统一重启服务器的日子。

与大家一样,我们首先选择的方式是按照顺序重启所有服务器,重新启动服务器确实能够解决这个问题。不过这个过程耗时长,而且容易出错。

幸运的是,谢谢Mozilla的一篇blog, 也谢谢Google快速灵活的实时索引,我们在重启服务器的过程中,发现了如下更简单的解决办法:

$ cat files/bin/leap-second.sh
# this is a quick-fix to the 6/30/12 leap second bug

if [ ! -f /tmp/leapsecond_2012_06_30 ]
then
/etc/init.d/ntpd stop; date `date +"%m%d%H%M%C%y.%S"` && /bin/touch /tmp/leapsecond_2012_06_30
fi

这个脚本只是简单的强制重置系统时间,从而让系统中所有时间回到同步的状态。完成后,你可以确认所有服务的状态回到正常,然后手动重启ntp服务。类似mozilla, 我们也使用puppet将该脚本在所有服务器上执行。

或许碰到问题的管理员都可以用这个办法解决。这是使用这个方法后的CPU利用率变化。

最后,希望航空航天,医疗等等重要系统不会受到这个问题的影响。在这些领域,重启系统很可能会造成巨大的伤害。

 

    分享到:
此条目发表在 技术分享 分类目录。将固定链接加入收藏夹。

互联网系统重启日》有 12 条评论

  1. 匿名 说:

    医疗都是内网很落后

  2. 就是哈哈 说:

    只有更新速度够快,俺们这些粉丝才能更忠实!

  3. 感觉学了蛮多东西,收藏您的博客了。希望您经常更新一些好的文章!

  4. CzBiX 说:

    在此时间之前有很多媒体都通告公告了这个问题.
    下次要注意啊,如果能等到下次的话…

  5. 就是哈哈 说:

    有对我有用的,转到QQ空间了,嘿嘿

  6. euii 说:

    不错的,已经成为了坚果云的付费用户,加油。希望你们在细分市场成为一个典范。

  7. 小雨 说:

    重启什么的最讨厌了 =W=

  8. likuku 说:

    这个嘛…6月28日我自己就收到了IDC商家发来的相关闰秒通知,里面说是 linux kenrel-2.6.18 和 更早版本会受到影响。不过我自己手里几十台 gentoo linux (内核最低版本的机器是一台2.6.34,其余都 3.x) 都一直有跑 ntpd,没有受到调整闰秒的任何影响。

  9. [...] CentOS 6.2 上的 Java 和 MySQL 因闰秒出现了不同程度的 CPU 利用率增长,猜测是 JVM 和 MySQL 试图通过 CPU [...]

  10. [...] 6.2上的Java和MySQL因闰秒出现了不同程度的CPU利用率增长, [...]