歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> 學習Linux

應對linux下的閏秒,應對linux閏秒

應對linux下的閏秒,應對linux閏秒

應對linux下的閏秒,應對linux閏秒


 

   文章作者:luxianghao

 

   文章來源:http://www.cnblogs.com/luxianghao/p/6339470.html  轉載請注明,謝謝合作。

 

   免責聲明:文章內容僅代表個人觀點,如有不當,歡迎指正。

 

   ---

 

為什麼會有閏秒?

世界上有幾種計量時間的方式,

世界時(UT1):是一種天文計量的方式,天文學家通過觀測地球的自轉,並將自轉一周的時間(一天)等分為864000份,每份為一秒,

受潮汐等因素的影響,地球自轉一周的時間並不是恆定的,這也是造成閏秒現象的直接原因。

原子時(TAI):由於上面描述的世界時並不穩定,物理學家用更為穩定的量子計量的方式來統計時間,1967年,國際計量大會用铯133

(Cs133)原子基態的兩個超精細能級之間的躍遷所對應輻射的9192631770個周期所持續的時間定義為1秒,這個是目前最精確的時間

計量方式,其誤差為1400000年一秒,基本可忽略不計

協調世界時(UTC):又稱世界標准時間或世界協調時間,UTC以TAI為基礎,又要兼顧UT1,當UTC,和UT1之間的偏差接近1秒時,

國際地球自轉和參考系服務(IERS)會提前6個月公布下一次閏秒的時間。

 

閏秒是否有規律,多長時間閏秒一次?

如下圖所示,看起來並沒有什麼規律,如之前所說,影響地球自轉的因素沒什麼規律,那麼閏秒自然也沒什麼規律。

 

閏秒有什麼影響?

對於普通人來說,正常的上班、下班、工作、學習,生命中偏差的這一秒無關痛癢,這個倒不會像閏年,閏月那樣,影響人的生日

對於對時間要求比較精確的航空、航天、軍工等,影響就會比較大了

對於我所在的互聯網行業,服務器清一色的linux系統,閏秒可能會造成機器cpu突然增高,機器宕機等,對應的服務就會掛掉,

因為互聯網是最近幾年才蓬勃發展起來,所以之前的閏秒對linux的影響就沒被放大,隨著linux的普遍使用,閏秒也被越來越多的被關注。

 

閏秒對linux以及在linux上run的應用的影響

系統打印閏秒插入信息的時候夯住:當NTP通知內核關於閏秒的動作時,這個bug會被觸發,這個bug會發生在閏秒發生的前一天的任何時候,

這個bug提前被觸發的原因是NTP時間服務器會提前一天通知連接它的linux服務器,將來的某個時刻會發生閏秒,linux服務器的ntp收到這個信息

後會在閏秒時刻對linux的時間做一些處理,增加一秒,或者減去一秒

閏秒活鎖導致系統夯住:由於這個bug,NMI看門狗會檢測到系統夯住,系統會不停的crash;閏秒被插入後這個bug就會被觸發,目前還沒確定

哪個版本修復了這個bug

cpu load快速增高:其原因為應用程序不能處理閏秒帶來的系統時間的突然變化,linux系統提供兩種系統時間,wall time和montonic time,其中

wall time記錄的是事實時間,可以向前或者向後調整,montonic time記錄的是系統從啟動以來的秒數,只能向前遞增,因此如果應用程序在獲取時間

時用的wall time則會受到系統時間調整(如閏秒)的影響,而采用後者則不會受到影響,具體到jdk來說明在jdk 7u6開始采用後者。

 

不能處理閏秒的內核在處理閏秒發生故障時會有什麼樣的系統日志

eg: Kernel panic - not syncing: Watchdog detected hard LOCK UP on cpu 21

 

閏秒後系統日志會有什麼記錄?

eg: kernel[81951.244556] Clock: inserting leap second 23:59:60 UTC

 

內核bug修復情況

以上提到的bug在linux各個版本陸陸續續有修復,這裡提供一個安全的版本,內核是2.6.39-200.3或者更高版本的可以認為是安全的

 

ntp && 閏秒

主機使用了ntp

此時主機在閏秒時的表現將取決於使用的ntp的版本 

1 版本高於等於4.2.2p1-9 或者更高版本(除了ntp-4.2.6p5-19.el7, ntp-4.2.6p5-1.el6 and ntp-4.2.6p5-2.el6_6)

a 帶-x參數運行:閏秒不是直接在內核中添加,而是把這一秒分散到大約2000秒中,1秒比之前長一些,緩慢的更改時間,

這樣做的優點:

1)避免時間倒退造成的應用邏輯問題

2)比較奇怪的時間點23:59:60不會出現

3)由於實際上沒有增加閏秒,所以上面描述的內核bug也不會出現

這樣做的缺點:

1)由於調整的時間段內,一秒的長短實際上是不准確的,所以對時間精度要求高的場景就不適用了

2)由於ntp的更新機制,這個辦法同樣也不適用於那些要求所有節點時間一致的集群

b 不帶-x參數運行,ntp會通知內核直接增加一秒(是突增的,非連續的)

2 版本低於4.2.2p1-9

  ntp會通知內核直接增加一秒,或者在停止一秒

注意:如果主機上運行了ntp,那麼運行“file /etc/localtime”,確保輸出結果中有“no leap seconds”(這表明不會添加閏秒)

主機沒有使用ntp

1 沒有使用tzdata

  那麼主機的時間完全由自己調整,建議使用ntp加上-x參數

2 使用了tzdata

  a 版本低於2015a,不會添加閏秒

  b 大於等於2015a,並且運行“file /etc/localtime”,輸出結果中有“X leap seconds”(X是個數字)

   那麼閏秒會以“23:59:60”這樣的形式出現,這會導致DATE/TIMESTAMP數據類型出現問題,

   你需要復制適當的/usr/share/zoneinfo文件覆蓋/etc/localtime(這個操作是動態調整的,不需要重啟)

 

應對閏秒的總結

1 升級內核使版本大於等於2.6.39-200.3,內核能夠處理閏秒,但是依然要提防應用程序對時間的敏感度,具體情況可參考這個,

針對這樣的應用程序,你需要

a 重構代碼

b 升級對應的軟件如jdk

2 在主機是任何版本內核的情況下,升級ntp是版本大於等於4.2.2p1-9,來應對那些對時間精度要求不高的場景

3 對於那些既不關心時間精度,也不想升級任何東西的,那就重啟ntp

  a 在上級時間服務器發閏秒通知開始之前停止ntp(需提前一天 /etc/init.d/ntpd stop),

  b date -s "`date`" (重置系統時間,個人認為這樣做可能是為了解開閏秒造成的死鎖)

  c 啟動ntp/etc/init.d/ntpd start

4 copy時間文件應對tzdata添加的閏秒

 

後記

以上內容是本人查看資料的總結,目前還沒有做實際的驗證,如果需要在生產環境中應用,請提前檢驗方法的合理性

http://xxxxxx/Linuxjc/1190537.html TechArticle

Copyright © Linux教程網 All Rights Reserved