《连线》杂志:走近闰秒故障及其解决方案

2012-07-05 07:56


  《连线》杂志近日刊载文章称,当上周六出现“闰秒”时,包括社交新闻聚合网站Reddit在内的多家网站都遭遇了故障。文章对这种所谓的“闰秒故障”进行了剖析,并列出了一些解决方案,其中包括将计算机系统的网络时间协议暂停一秒钟,以及谷歌所采取的“leap smear”(闰秒弥补)的方法等。

  以下是这篇文章的全文:

  上周六晚上,当“闰秒故障”(leap second glitch)导致社交新闻聚合网站Reddit受创时,詹森·哈维(Jason Harvey)并未认识到这是“闰秒故障”。他原本以为那是与亚马逊云服务大规模中断相关的某种类型的互联网减速,从而导致网络上一些最流行的服务在不到24个小时以前均遭遇了技术故障。

  “那看起来就像是网络运行表现很差的样子。”哈维说道,他是管理Reddit运作的系统管理员之一。“在亚马逊宕机的情况下,出现一个网络问题是说得通的。”

  但在大约半个小时以后,哈维和他的团队在对故障进行追踪以后发现,Reddit自身运行开源Linux操作系统的机器出现了问题。由于未能进行正确调试以适 应“闰秒”变动的缘故,这些服务器几乎陷入了停止状态。闰秒是对“协调世界时”(UTC)所做出的基本调整,目的是使其与太阳时间保持同步,但这多出来的 一秒钟给网络服务器带来了很大的问题。

  根据地球的自转速度,国际计量局会定期在年底或 年中(也可能在季末)对协调世界时增加一秒钟,使其能与地球自转同步。这不会让我们渐渐走向日落在早晨时发生,但可能会在计算机系统中带来问题,原因是计 算机系统需要在时钟里多加一秒,但系统本身不够灵活,因此无法处理这多出来的一秒钟。

  在Reddit的例子中,这个问题可被追踪至Linux内核中的一个故障,这是开源Linux操作系统的核心。一个被称为“hrtimer”——即高精度定 时器的缩写——的Linux子系统由于这种时间上的变动而变得混乱,因此突然引发了服务器上的过度活动,最终导致服务器中央处理器被锁定。

  Reddit 只是在上周六受到“闰秒故障”影响的多家网站之一,美国博客媒体Gawker Media和Mozill等网站也都遭遇了同样的故障;而且,这种问题倾向于在每次出现“闰秒”调整时都会发生。举例来说,在2009年1月份,有报道称 闰秒导致Sun Microsystems的Solaris操作系统和甲骨文的软件包都出现了问题。

  “几乎每一次出现闰秒时,我们都会发现点什么。”有“Linux之父”之称的利纳斯·托瓦尔德斯(Linus Torvalds)向《连线》杂志表示。“这真的是很烦人,因为这是代码基本上无法运行的一个经典例子,因而在正常情况下用户无法对其进行测试。”

  在今年3月份,黑客约翰·斯图尔茨(John Stultz)为Linux核心中的高精度定时器故障提供了一个补丁,但某些版本的Linux尚未进行更新来加入这个补丁。斯图尔茨周一并未对此置评,但 据他在一个在线邮件列表中发布的内容显示,他曾讨论过导致Reddit出现服务故障的问题。

  故障剖析

  那么,这些服务器到底发生了什么事情呢?这是一件很复杂的事情。甚至就连利纳斯·托瓦尔德斯也表示,如果想要真正理解到底发生了些什么,那么我们应该与斯图尔茨谈谈。但在对多名熟知这个问题的人进行访谈以后,我们对到底发生了什么有了一种很好的认知。

  高精度定时器是在一个应用“睡眠”时被使用的子系统,它会等待操作系统完成某些其他的任务。在某些情况下,高精度定时器会为这些睡眠中的应用设定一种闹钟, 会在操作系统花费太多时间来处理其他工作时敲响。从斯图尔茨在邮件列表中发布的内容来判断,当闰秒发生时,这些高精度定时器会突然变得比核心操作系统提前 一秒,因此就会开始敲响那些闹钟,从而同时唤醒无数睡眠中的应用,导致服务器的中央处理器超载。

  不过,Reddit的情况则略有不同,这个网站的服务器运行着一个名为Cassandra的开源数据库,该数据库是由Java编程语言构建而成的,在 Linux上运行。就詹森·哈维所说,在闰秒发生时,Cassandra无法暂停Java进程,导致这些进程陷入不断旋转的循环中,从而耗尽Reddit 服务器的中央处理器功率。

  到最后,Reddit通过重启服务器的方式解决了这个问题。这个网站在大约30到49分钟的时间里几乎完全不能使用,在大约一个半小时里处于完全脱机的状态。

  在Reddit竭尽全力试图解决Cassandra服务器问题的同时,美国八卦网站Gawker的Tomcat服务器也遭遇了故障,Mozilla则面临着 与Hadoop服务器有关的问题.hadoop和Tomcat也都依赖于Linux平台和Java技术,看起来这些服务器也都遭遇了同一个故障的侵袭。

  与此同时,其他系统则在闰秒来临的前一天遭遇了问题.linux等系统使用网络时间协议(Network Time Protocol)来与全球原子钟进行对接,从而对时间作出调整。在上周五,网络时间协议开始向服务器发起警报称,今年的闰秒即将来临。据Opera Software系统管理员Marco Marongiu称,至少有一部分Opera服务器在收到这一通知时就已经开始被锁定。这个问题在一个Linux邮件列表中被讨论过,目前还不清楚这个问 题与Reddit经历的高精度定时器问题有多么密切的联系。

###NextPage###
  下一次闰秒

  我们不知道下一次闰秒将在何时发生,这要视地球的自转速度有多快而定——这一速度既有可能减慢也有可能加快,具体要视潮汐、天气和熔态金属在地球核心的流动而定。但是,当下一次闰秒发生时,可能会带来更多的问题。

  托瓦尔德斯指出,无论是在什么时候,如果时间被弄混,那么情况就很有可能会变得糟糕。开发者可能会提前进行测试,但很难预计现实世界中将会发生怎样的事情。 “闰秒和夏令时间都是特别令人痛苦的事情,原因是它们会带来更多的复杂性,在没有严格规则约束的情况下变得随机化。而在这两种时间变动中,闰秒更令人感到 痛苦。”

  正如托瓦尔德斯所指出的那样,将地球的实际自转时间与原子钟所衡量的时间同步 起来是一件棘手的事情。但从整体上来说,过去15年时间里科技行业并未很多次地经历过闰秒。事实上,加利福尼亚州圣何塞的利克天文台(Lick Observatory)的程序员史蒂夫·艾伦(Steve Allen)指出,这可能也是导致“闰秒故障”问题的原因之一。“在1999年到2005年之间并未出现过闰秒,因此所有的云服务和多处理器等产品和服务 都是在闰秒并未发生过的阶段中形成的。”他说道。

  自2005年以来则一共有三次闰秒发生,分别是在2005年、2008年底和现在的2012年。“因此,当人们创造所有新东西时,(闰秒的来临)有很长的一段间隔时间,人们不一定会考虑到这个问题。”他说道。“然后地球就停止加速了。”

  有些人已经在呼吁取消闰秒——这样一来这些问题就能被避免了。但与此同时,其他一些人则提议作出专业的修复,从而在Linux等系统中隐藏这种突然的时间变 化.opera的Marongiu建议将计算机系统的网络时间协议暂停一秒钟,而不是回拨计算机系统的时钟。“从根本上来说,如果你哄骗一下网络时间协 议,那么就不需要突然回拨系统时间,但仍可增加这额外的一秒钟时间。”他说道。

  但他同 时指出,这只是一个“可怜人的变通方案”,而更好的解决措施则是谷歌所采取的一项措施。在去年秋天,谷歌在一篇博客文章中描述了一种被其称为“leap smear”(闰秒弥补)的方法。谷歌没有突然加入额外的一秒钟,而是对网络时间协议进行了修改,这样一来就可在相对较长的时间里向计算机系统的时钟中多 次加入毫秒。

  这是一种聪明的修复方法,但不要指望这种方法能成为常规的标准作法。当下一次闰秒来袭时,某些地方的某些网站仍旧将会出现故障。