
由于地球自轉速度變慢,導致世界時(民用時)每年比原子時(世界的科學計時器)慢大約半秒鐘。為保持與地球自轉時間一致,1972年英國格林尼治天文臺引入閏秒概念,即在世界時與原子時差異累積至一秒時,加上或減去一秒。在今年1月國際地球自轉服務組織和國際地球時間局宣布,全世界在英國格林尼治時間6月30日23:59:59將增加一秒,記為23:59:60,也就是北京時間7月1日的7:59:60。就這一秒,弄得整個世界很沸騰。
早在2009年新年前夜,全球有數千部微軟Zune播放器因為閏秒問題出現時間顯示混亂,情況與2000年“千年蟲”問題類似。一秒鐘在普通生活中幾乎影響不到什么,然而在程序機械的IT領域,閏秒就可以實現“秒殺”。
一秒鐘的影響
博客媒體Gawker證實,該公司遭遇了與閏秒有關的故障。Gawker首席技術官湯姆?普朗科特說,“我們的網站并未完全下線,但在大約30分鐘的時間里,服務變得非常不穩定。”
社交新聞網站Reddit通過Twitter也發表聲明稱,“閏秒造成利用Java開發的開放源代碼數據庫Apache Cassandra出現故障,我們在盡力解決與此相關的故障。”
據新聞聚合網站BuzzFeed報道,StumbleUpon、Yelp、FourSquare和LinkedIn也在閏秒發生時遭遇到故障。Mozilla基金會表示,閏秒是導致Hadoop遭遇故障的罪魁禍首。
此外,閏秒還導致部分Linux服務器產生高CPU使用率。因為Java和MySQL試圖通過CPU硬件晶振的數據獲得當前精確的時間,由于閏秒的關系導致較高的CPU占用。同時,Linux kernel 2.6.29之前版本存在bug,在進行閏秒調整時很可能會引起系統時鐘服務ntpd進程死鎖。據Opera Software系統管理員Marco Marongiu稱,在今年閏秒即將來臨之前,至少有一部分Opera服務器在收到時鐘服務時就已經開始被鎖定。
這么麻煩的話,為什么不取消閏秒呢?今年一月在日內瓦召開的國際電信聯盟會議上,是否取消閏秒這一議題引發了全球科學家的大討論。美國認為應該取消閏秒,原因是不定時的調整時間,會導致一些對時間精度依賴較高的電子系統產生混亂。美國海軍天文臺的主要計時員杰夫?切斯特說:“取消閏秒可以消除計算機網絡災難性故障的一個潛在來源。”
如果閏秒被取消,天文學的時間定義將由原子時決定,對我們現在是沒什么影響,但每天相差千分之幾秒,數千年后,我們日常所熟悉的計時將被打亂,原本中午的情景卻展現在早晨,所以以英國為代表的國家反對取消閏秒。英國國家物理實驗室表示,取消閏秒意味著失去與太陽的關聯,但技術的問題是可以解決的。
我國也是反對者之一,中國科學院國家授時中心時頻基準實驗室主任董紹武表示,“中國的相關機構已經適應了閏秒的存在,即便是北斗導航系統,都已經做了調整。如果取消閏秒,對于中國來說成本損失估計達到幾百億元。”
閏秒的解決之策
在今年3月份,黑客約翰?斯圖爾茨為Linux核心中的高精度定時器故障提供了一個補丁。據了解,高精度定時器是在一個應用“睡眠”時被使用的子系統,它會等待操作系統完成某些其他的任務。例如,當閏秒發生時,這些高精度定時器的提前操作會同時喚醒無數睡眠中的應用,導致服務器的CPU超載。這一補丁就是想緩解這個問題。此外,Linux等系統可使用網絡時間協議來與全球原子鐘進行對接,從而對時間做出調整。
對于閏秒引發的動蕩,國內的IT領域似乎并未產生太多的波瀾。騰訊網產品專家鄭堅在接受本報記者采訪時表示,“目前沒有聽說國內哪家網站有受到影響,騰訊沒有發生任何故障,因為騰訊早在兩周前就集合技術人員對閏秒的問題展開應對措施,雖然在技術層面上能解決,但卻增加了企業運營的成本。”
谷歌也在博客中稱:“我們采取“leap smear”解決方案,通過調整內部的網絡時間協議(NTP)服務器,達到閏秒發生時增加 1 秒鐘,所以我們沒有受到影響。”
因此,如何優化數據設計,是解決閏秒問題的關鍵所在。
綜合業內人士的觀點來看,首先,時間數據的等價類劃分應該更加細致,除了一個有效時間和一個無效時間,還應該有閏年、閏月、閏秒數據。因為時間是廣泛相關數據,縱使被測軟件可以正確處理,但與其相關的其他軟件(操作系統、數據庫、Java虛擬機等)也有可能會出問題(例如Linux內核的那個Bug)。
其次,時間的廣義邊界值測試應該擴大。大部分測試者都知道測試輸入框的顯性邊界值,但是很少有人去測試時間這個隱形邊界值。所以,測試不單單是常規的時間數據,更要挖掘潛在知識,從設計和分析等方面全面深入。
雖然我們不知道下一次閏秒將在何時發生,也不知國際組織對閏秒的存在會有怎樣的取舍,但一定要吸取Reddit的教訓,必須提前做好防御應對措施。可能當下一次閏秒發生時還是會帶來更多的問題,正如托瓦爾德斯所說,“無論什么時候,如果時間被弄混,情況就很有可能變得糟糕。”
背景知識
什么是“千年蟲”?
“千年蟲”包括兩方面的問題:一個是在一 些計算機系統中,對于閏年的計算和識別出現問題,不能把2000年識別為閏年,即在該計算機系統的日歷中沒有2000年2月29日這一天,而是直接由2000年2月28日過渡到了2000年3月1 日;另一個是在一些比較老的計算機系統中,在程序中使用了數字串99(或99/99等)來表示文件結束、永久性過期、刪除等一些特殊意義的自動操作,這樣當1999年9月9日(或1999年4 月9日即1999年的第99天)來臨時,計算機系統在處理到內容中有日期的文件時,就會遇到99或99/99等數字串,從而將文件誤認為已經過期或者將文件刪除等錯誤操作,引發系統混亂甚至崩潰等故障。