互聯網系統重啟日皆因閏秒
北京時間7月1日早上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利用率變化。
***,希望航空航天,醫療等等重要系統不會受到這個問題的影響。在這些領域,重啟系統很可能會造成巨大的傷害。