應對linux下的閏秒

来源:http://www.cnblogs.com/luxianghao/archive/2017/02/04/6339470.html
-Advertisement-
Play Games

文章作者:luxianghao 文章來源:http://www.cnblogs.com/luxianghao/p/6339470.html 轉載請註明,謝謝合作。 免責聲明:文章內容僅代表個人觀點,如有不當,歡迎指正。 為什麼會有閏秒? 世界上有幾種計量時間的方式, 世界時(UT1):是一種天文計量 ...


 

   文章作者: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添加的閏秒

 

後記

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 作者:Antonio Leiva 時間:Jan 25, 2017 原文鏈接:https://antonioleiva.com/data-classes-kotlin/ 在前面的文章中,我們已經見到了類,而數據類還可以進一步幫助我們簡化代碼。 數據類是什麼? 數據類是僅僅包含狀態而沒有任何可執行的操作 ...
  • Android 第三方類庫之EventBus 1 PS 工欲善其事必先利其器. Eventbus也是一款在開發中常用的利器 這篇也對EventBus的簡單介紹和使用,與之前個xutils介紹的級別一樣.http://www.cnblogs.com/greentomlee/p/6025470.html... ...
  • 題記:在開發的路途上,有的人走的很深很遠,而對於停留在初級階段的我來說,還要學的、經歷的還有很多... ...
  • 在 "Linux設備樹語法詳解" 和 "Linux Platform驅動模型(一) _設備信息" 中我們討論了設備信息的寫法,本文主要討論平臺匯流排中另外一部分 驅動方法,將試圖回答下麵幾個問題: 1. 如何填充platform_driver對象? 2. 如何將驅動方法對象註冊到平臺匯流排中? 正文前的 ...
  • 第十一節 linux定時任務 標簽(空格分隔): Linux實戰教學筆記 [更多資料點我查看][1] 1.1 定時任務Crond介紹 Crond是linux系統中用來定期執行命令/腳本或指定程式任務的一種服務或軟體,一般情況下,我們安裝完Centos5/6 linux操作系統之後,預設便會啟動Cro ...
  • 當你出現ifconfig與網卡配置文件的名稱不同時,如圖所示情況 ifconfig顯示的網卡名為eth1,而配置文件名字為ifcfg-eth0,所以會導致失敗。 解決方案: 1、刪除/etc/udev/rules.d/70-persistent-net.rules文件,重啟系統。 2、ifconfi ...
  • 我在 "Linux字元設備驅動框架" 一文中簡單介紹了Linux字元設備編程模型,在那個模型中,只要應用程式 open() 了相應的設備文件,就可以使用ioctl通過驅動程式來控制我們的硬體,這種模型直觀,但是從軟體設計的角度看,卻是一種十分糟糕的方式,它有一個致命的問題,就是設備信息和驅動代碼冗餘 ...
  • NFS重要問題 1、有關NFS客戶端普通用戶寫NFS的問題。 1)為什麼要普通用戶寫NFS。 2)exports加all_squash。 Rsync介紹 什麼是Rsync? Rsync是一款開源的、快速的、多功能的、可實現全量即增量的本地或遠程數據同步備份的優秀工具。Rsync軟體適用於unix、l... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...