互聯(lián)網(wǎng)系統(tǒng)重啟日皆因閏秒
北京時間7月1日早上7:59:59,堅果云的所有Linux 操作系統(tǒng) (CentOS 6.2)都出現(xiàn)CPU利用率暴漲的現(xiàn)象,主要影響的進程包括Java,MySQL等。直接重啟Java和MySQL不能解決問題。后得知,該現(xiàn)象不僅發(fā)生在堅果云的服務(wù)器,很多互聯(lián)網(wǎng)公司的服務(wù)器都在這一刻出現(xiàn)了不同程度的CPU利用率增長!
經(jīng)過我們緊急的分析和調(diào)試,發(fā)現(xiàn)是因為操作系統(tǒng)內(nèi)核在處理閏秒的時候,導(dǎo)致部分試圖獲取當前系統(tǒng)時間的進程出現(xiàn)Live Lock,也就是說,某個進程/線程在查詢系統(tǒng)時間的時候,進入了一種類似死循環(huán)的狀態(tài),CPU利用率很高,同時不能完成時間查詢。
我們猜測JVM和MySQL試圖通過CPU硬件晶振的數(shù)據(jù)獲得當前精確的時間,由于閏秒的關(guān)系,這個時間和操作系統(tǒng)維持的墻上時間(Wall Time,也就是顯示給用戶看的時間)不一致,導(dǎo)致了這個問題。
系統(tǒng)時間對于各種服務(wù)器程序尤為重要,例如在堅果云的系統(tǒng)中,很多節(jié)點都定期收集和報告系統(tǒng)狀態(tài),如果系統(tǒng)時間無法獲取,可能導(dǎo)致部分節(jié)點被誤判為故障,自動引起一系列不必要的故障恢復(fù)動作。
通過twitter, 郵件列表,論壇等其他媒體,我們發(fā)現(xiàn)很多互聯(lián)網(wǎng)服務(wù)商都碰到類似問題,并且給出的方法多是重啟服務(wù)器。堅果云團隊戲稱這是互聯(lián)網(wǎng)全網(wǎng)統(tǒng)一重啟服務(wù)器的日子。
與大家一樣,我們首先選擇的方式是按照順序重啟所有服務(wù)器,重新啟動服務(wù)器確實能夠解決這個問題。不過這個過程耗時長,而且容易出錯。
幸運的是,謝謝Mozilla的一篇blog, 也謝謝Google快速靈活的實時索引,我們在重啟服務(wù)器的過程中,發(fā)現(xiàn)了如下更簡單的解決辦法:
$ 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
這個腳本只是簡單的強制重置系統(tǒng)時間,從而讓系統(tǒng)中所有時間回到同步的狀態(tài)。完成后,你可以確認所有服務(wù)的狀態(tài)回到正常,然后手動重啟ntp服務(wù)。類似mozilla, 我們也使用puppet將該腳本在所有服務(wù)器上執(zhí)行。
或許碰到問題的管理員都可以用這個辦法解決。這是使用這個方法后的CPU利用率變化。
***,希望航空航天,醫(yī)療等等重要系統(tǒng)不會受到這個問題的影響。在這些領(lǐng)域,重啟系統(tǒng)很可能會造成巨大的傷害。