閏秒為什么會導(dǎo)致Linux出現(xiàn)問題
由于Linux kernel 2.6.29之前版本存在bug,在進行閏秒調(diào)整時可能會引起系統(tǒng)時鐘服務(wù)ntpd進程死鎖。Debian Lenny、RHEL/CentOS 5等舊發(fā)行版今天仍被廣泛使用,部分供應(yīng)商早已經(jīng)發(fā)布了補丁。
閏秒導(dǎo)致部分Linux服務(wù)器高CPU使用率
國際地球自轉(zhuǎn)和參考坐標(biāo)系統(tǒng)服務(wù)(IERS)在2012年6月30日午夜(北京時間7月1號7點59分59秒)增加一閏秒(即出現(xiàn) 7:59:60)。由于Linux kernel 2.6.29之前版本存在bug,在進行閏秒調(diào)整時可能會引起系統(tǒng)時鐘服務(wù)ntpd進程死鎖。Debian Lenny、RHEL/CentOS 5等舊發(fā)行版今天仍被廣泛使用,部分供應(yīng)商早已經(jīng)發(fā)布了補丁。
但除了Linux服務(wù)器外,一些服務(wù)器程序也因為閏秒出現(xiàn)了問題,如Reddit、Mozilla、FourSquare、Yelp、 LinkedIn和Gawker等網(wǎng)站都短暫遭遇了技術(shù)問題,國內(nèi)的一家云儲存供應(yīng)商發(fā)現(xiàn)運行在CentOS 6.2上的Java和MySQL因閏秒出現(xiàn)了不同程度的CPU利用率增長,猜測是JVM和MySQL試圖通過CPU硬件晶振的數(shù)據(jù)獲得當(dāng)前精確的時間,由 于閏秒的關(guān)系,這個時間和操作系統(tǒng)維持的墻上時間(Wall Time,也就是顯示給用戶看的時間)不一致,導(dǎo)致了這個問題。簡單的修正方法是強制重置系統(tǒng)時間,讓系統(tǒng)中所有時間回到同步的狀態(tài)
近日,國際地球自轉(zhuǎn)和參考系統(tǒng)服務(wù)地球定向中心(IERS)通過推特重申,國際標(biāo)準(zhǔn)時間UTC將在格林尼治時間2016年12月31日23時59分59秒(北京時間2017年1月1日7時59分59秒)之后,在原子時鐘實施一個正閏秒,即增加1秒,然后才會跨入新的一年。
每隔一段時間,目前世界范圍內(nèi)通用的協(xié)調(diào)世界時(UTC)會與依據(jù)地球圍繞太陽運動計算的平太陽日和世界時(UT1)出現(xiàn)很小的偏差,需要對UTC增加或者減少一秒來消除。
簡要解決方法:在發(fā)生閏秒前停掉ntpd服務(wù),閏秒發(fā)生后再開啟ntpd
根解:放棄使用ntpd,使用簡化的sntp協(xié)議,同時在實現(xiàn)直接調(diào)用settimeofday來完成,不會觸發(fā)內(nèi)核的事件調(diào)整異常
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