閏秒為什麼會導致linux出現問題

bigdark發表於2017-01-03

由於Linux kernel 2.6.29之前版本存在bug,在進行閏秒調整時可能會引起系統時鐘服務ntpd程式死鎖。Debian Lenny、RHEL/CentOS 5等舊發行版今天仍被廣泛使用,部分供應商早已經發布了補丁。

閏秒導致部分Linux伺服器高CPU使用率

國際地球自轉和參考座標系統服務(IERS)在2012年6月30日午夜(北京時間7月1號7點59分59秒)增加一閏秒(即出現7:59:60)。由於Linux kernel 2.6.29之前版本存在bug,在進行閏秒調整時可能會引起系統時鐘服務ntpd程式死鎖。Debian Lenny、RHEL/CentOS 5等舊發行版今天仍被廣泛使用,部分供應商早已經發布了補丁。

但除了Linux伺服器外,一些伺服器程式也因為閏秒出現了問題,如Reddit、Mozilla、FourSquare、Yelp、LinkedIn和Gawker等網站都短暫遭遇了技術問題,國內的一家雲儲存供應商發現執行在CentOS 6.2上的Java和MySQL因閏秒出現了不同程度的CPU利用率增長,猜測是JVM和MySQL試圖通過CPU硬體晶振的資料獲得當前精確的時間,由於閏秒的關係,這個時間和作業系統維持的牆上時間(Wall Time,也就是顯示給使用者看的時間)不一致,導致了這個問題。簡單的修正方法是強制重置系統時間,讓系統中所有時間回到同步的狀態

近日,國際地球自轉和參考系統服務地球定向中心(IERS)通過推特重申,國際標準時間UTC將在格林尼治時間2016年12月31日23時59分59秒(北京時間2017年1月1日7時59分59秒)之後,在原子時鐘實施一個正閏秒,即增加1秒,然後才會跨入新的一年。

每隔一段時間,目前世界範圍內通用的協調世界時(UTC)會與依據地球圍繞太陽運動計算的平太陽日和世界時(UT1)出現很小的偏差,需要對UTC增加或者減少一秒來消除。

簡要解決方法:在發生閏秒前停掉ntpd服務,閏秒發生後再開啟ntpd

根解:放棄使用ntpd,使用簡化的sntp協議,同時在實現直接呼叫settimeofday來完成,不會觸發核心的事件調整異常

Java Fortunately the fix is straightforward:

/etc/init.d/ntp stop
date -s "$(date)"

Mysql

The fix is quite simple – simply set the date. Alternatively, you can restart the machine, which also works. Restarting MySQL (or Java, or whatever) does NOT fix the problem. We put the following into puppet to run on all our machines:

$ cat files/bin/leap-second.sh 
#!/bin/bash
# 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 -s "`date`" && /bin/touch /tmp/leapsecond_2012_06_30
fi


相關文章