订阅

多平台阅读

微信订阅

杂志

申请纸刊赠阅

订阅每日电邮

移动应用

博客

多一秒也不行

章劢闻 2012-07-03

一度让发达国家陷入恐慌的“千年虫”归咎于上个世纪末一些懒惰的程序员,他们甚至没有想到自己的程序会运行到下一个世纪。记得2000年时曾经约李学凌写过一篇专栏,李当时就聪明地指出如果不加注意,懒惰的程序员们还会忘了四位数字纪年的约束性,从而继续导致“万年虫”。

 

在我们生活的星球上,有一些人在不断地计算着否需要调整标准时间,以保证不会让太阳在某天晚上6点时上山。这种分秒之间的变化对于我们的作息几乎没有影响,但是对于互联网企业和公司IT部门的人来说却有可能是场灾难。上周六,由于地球不准确自转,位于巴黎的国际地球自转事务中央局负责决定在6月的最后一秒之后再加入一秒,是为“闰秒”。这虽然是一个严谨的决定,并且有广泛的预告,但是到了那一刻,仍然有很多网站和服务器因此停止了工作。

回顾近10年,从千年虫到闰秒,类似的时间变化已经多次让甲骨文和微软等著名公司的优秀程序员落入了陷阱。到了今天,我们也许应该来看看究竟是什么在背后影响着这些人的发挥,以至于他们一次又一次地犯同样的错误。

本周六的事件发生后,美国著名杂志《连线》做了迅速有效的调查,为我们揭示了真相。在这混乱的最后一秒,《连线》的兄弟公司¬——著名新闻聚合网站Reddit碰巧是重要的受害者之一。他们网站使用的Linux服务器突然同时出现了繁忙状态,在半个多小时的时间内停止了工作。经过分析,他们发现了一个名为“hrtimer”的程序出了问题。这程序本是开源系统Linux的一部分,负责唤醒一些等待系统资源的应用程序。结果它被这意外的时间变化扰乱了运行逻辑,开始同时唤醒大量“睡眠中”的程序,并迅速导致服务器负载达到了极限,最终停止了响应。

Reddit网站的问题还追溯到一个由Facebook最早开发的开源数据库Cassandra;同时另一家小道消息网站Gawker则发现著名的Tomcat服务器也出了同样的问题。而略微有些讽刺意味的是,他们最终挽救这些Linux服务器的方法,也正是Linux嘲讽微软Windows的最大软肋,“重启”。

Linux之父李纳斯•托沃兹(Linus Torvalds)的一句话揭示了背后程序员的软肋:“每次出现闰秒都会出现些问题。让人恼火的问题是这些是典型的、从不需要运行的程序段落没有在正常的用户环境下接受过测试。”

做过程序员的人都知道,能够像求伯君那样一次写完所有程序,并且一次运行成功的人是极为罕见的。据说Facebook的扎克伯格最近想编一段程序热热身,结果由于疏于练习,错误百出,试运行了很多次才成功。大多数普通程序员都需要在严格的用户环境下不断接受检测,发现问题,消除错误,继续接受检测。Linux作为开源系统,之所以能够比Windows更为健壮,也是由于他的检测环境几乎是最广泛的,而更新也是最快的。但是,人们想不到的是,从 1999 到2005尚未提出“闰秒”一事,这意味着当云服务和多处理器的概念诞生时,相关的软硬件创造者甚至不知道会需要在这样的“时差”环境中去测试自己的程序。

而说到这些不能忘记一度让发达国家陷入恐慌的“千年虫”。这个问题归咎于一些更为懒惰的程序员,他们在上个世纪末编写代码的时候甚至没有想到这些玩意儿会运行到下一个世纪。记得2000年时曾经约过《财富》(中文版)《中国40位40岁以下的商界精英》李学凌写过一篇专栏(当时李还是中青报的记者),他当时就聪明地指出如果不加注意,懒惰的程序员们还会忘了四位数字纪年的约束性,从而继续导致“万年虫”。

不过无论在态度上如何一丝不苟,软件创作者的知识结构最终是有极限的,他们即便可以想到所有人类计时的变化,也不会预测到地球自转会慢还是会快,潮汐会怎么变化,气候和地核液态部分会如何运动…等等。所以最终的解决办法是在商业应用中做好一切准备应对由此带来的影响。一个正面榜样:Google在本次闰秒到来前的一天,在每一秒中计入了微弱的变化,从到了最后一秒是正好和闰秒之后的新时间完全合拍,从而完美地渡过了“危险期”。

微软不幸再一次成为了负面榜样。早在2008年,微软的Zune播放器就被闰秒折磨过一次。你也许对Zune这个名字有点熟悉,没错,这就是那个失败的播放器,被顽皮的乔布斯在iPhone的发布会上烧成灰烬的那个播放器。微软的相关开发者或许到现在都在嫉恨乔布斯的傲慢行为。但是事实上,有不少人认为正是他们自己的“闰秒漏洞”让本来就奄奄一息的Zune最终彻底“绝种”了。

当时是2008年的最后一天的最后一秒,有用户把圣诞节刚买的30GB 的Zune播放器插在充电器上,忽然在新年到来的那一刻,Zune闷哼了一声从USB口断开,开始自动重启,却再也无法进入系统,死在了100%载入的状态。微软官方随后证实:“…我们的技术团队立刻开始处理这个问题,并且认为是内部时钟驱动在处理闰年时出现了漏洞…”(注意这里写的是“闰年”不是“闰秒”,为什么是这样笔者写此文时没有深究,有兴趣的朋友可以继续去研究,有了答案请告之,我会做出修正。)

同时,甲骨文公司以稳定性著称的Oracle数据库也在2008年12月31日最后增加的这一秒出现了问题,导致很多用户的服务器在新年的欢呼声中不幸地重启了。可以想象,由于是Oracle服务器,所以当天很多公司IT主管和工程师肯定在妻子敌意的目光中离开了家门,在轰鸣的机房中彻夜未眠…

 

最新文章:

500强情报中心

财富专栏