1. 程式人生 > >NTPD工作原理介紹

NTPD工作原理介紹

概述

ntpd 是一個作業系統Daemon程序,用於校正本地系統與Internet標準時鍾源之間的時間。ntpd 完整的實現了 NTP 協議版本v4,但是同時相容版本v3(RFC-1305)、版本v1與v2(分別由RFC-1059, RFC-1119定義)。ntpd 絕大多數情況下使用64位浮點數計算,僅在需要極高時間精度的情況下使用笨拙的64位固定長度數計算,這個極高的精度是 232*1/1,000,000,000,000 秒;要達到這個精度對CPU與網路頻寬的要求已超過GHZ與GMbps的級別,當前的大多數工作站都無法滿足。

NTP 工作原理

ntpd 程序通過定期與NTP時鐘源伺服器傳送訊息來獲取時間資訊。在程序初始啟動時候,不論是第一次boot還是隨後啟動,nptd

 會給伺服器傳送訊息以獲取時間本設定到本地系統。為了防止網路風暴,程序啟動後會在定義好的間隔64秒之上再加一個隨機延遲值,這個隨機值的範圍是0~16秒;因此程序啟動後需要數分鐘才會開始同步時間。

如今的計算機都帶有硬體時鐘晶片(time-of-year (TOY) chip),用於在計算機掉電過程中仍然保持正確時間,當計算機上電,作業系統從時鐘晶片中獲取時間。當作業系統啟動完成並連線到時鐘源之後,作業系統會依據時鐘源定時調整晶片時間。在伺服器沒有硬體時鐘晶片或硬體時鐘晶片故障(CMOS電池沒電)或其他原因導致作業系統本地時間與時鐘源時間差別超過1000秒,nptd認為此時發生了嚴重問題,唯一可靠的處理方法是人為介入。這種情況下nptd

 Daemon程序會退出並在作業系統的syslog中記錄一條日誌。nptd 的啟動選項 -g 選項可以忽略1000秒的檢查並強制將時鐘源時間設定為硬體時間,不過考慮到硬體時鐘晶片故障的場景(CMOS電池沒電、或時鐘計時器故障),一旦再次出現晶片時間與時鐘源超過1000秒,nptd還是會退出。

通常情況下,ntpd 以很小的步長調整時間使得時間儘量是連續的、不出現跳躍。在網路極度擁塞的條件下,nptd 與時鐘源之間傳送一個訊息包來回的時延有可能達到3秒,因此會導致同步距離(半個來回時延,1.5秒)變的很大。ntpd 同步演算法會丟棄時差大於128ms的包,除非在900秒內沒有時差小於128ms的包,還有就是首次啟動時候不會檢查這個時差直接同步。這種設計是為了減少誤報時鐘同步異常的告警。

上述行為的結果是每次成功設定本地時間,一般不會超過128ms,即使在網路時延很高的情況下。有時候,特別是在ntpd首次啟動的時候,時差可能超過128ms,這種罕見場景一般是本地時間比時鐘源的時間快(未來)超過128秒,這種情況本地時間將會被往過去方向調回。這種情況下某些應用程式會有問題。如果啟動nptd時候加上了 -x 選項,那麼 nptd 不會以步長方式(stepped)同步,只會以微調校正方式(slew correction)同步。

使用 -x 選項之前需要仔細考量影響。 ntpd 微調校準的最大頻率是 500 個 PPM (parts-per-million)每秒,也就是每秒校準 5/10,000 秒。因此會導致本地時間與時鐘源之間需要很長時間才能將時差同步到一個可接受的範圍,大概是2000秒同步一秒,對於依賴網路時鐘源的應用來說這種情況不可接受。

頻度規則

nptd 啟動時的行為依賴頻度檔案是否存在,通常是 npt.drift 。這個檔案包含了最近估算出的時鐘頻度誤差值。如果檔案不存在,此時 ntpd 進入一種特殊模式會快速調整時間與頻度誤差值,這個快速大概好事15分鐘,隨後在時間與頻度誤差值正常後nptd進入正常模式,時間與頻度持續與時鐘源同步。並在一個小時之後,將當前的頻度誤差值寫入 npt.drift 檔案。如果檔案存在,nptd從此檔案讀取頻度誤差值直接進入正常模式,並沒隔一個小時將計算好的頻度誤差值寫入檔案。

執行模式

nptd 可以執行在多種模式下,包括對稱的 主動、被動(active/passive),客戶端、服務端(client/server),廣播、多播(broadcast/multicase/manycase),詳細參考Association Management。通常執行模式是以Daemon方式持續跟蹤同步時鐘源時間;當然也可以只執行一次,從外部時鐘源同步時間(從上次紀錄的頻度誤差檔案中讀取頻度誤差值)。廣播與多播模式下客戶端能夠自動發現時鐘源伺服器,並計算各個伺服器的時延然後自動完成配置,這種模式使得工作站叢集自動配置變為現實。

預設情況下nptd以Daemon方式持續跟蹤多個時鐘源,同步的間隔由一個複雜的狀態機決定。狀態機使用啟發式演算法,根據訊息包來回時延、頻度誤差來計算最優的同步間隔。通常情況下,狀態機初始以64秒為間隔並最終達到1024秒,少量的隨機數值會被增加到間隔上為了均衡伺服器壓力。額外的,如果一個伺服器不可達的情況下,為了減少網路訊息排隊阻塞,間隔會逐步增加到1024秒。

在某些情況下nptd不能正常持續執行,通常的規避手段時使用cron定時任務執行ntpdate命令。但是ntpdate並沒有像nptd一樣有考慮各種訊號處理、錯誤檢查、連續同步演算法。nptd -q 可以達到與 ntpdate同樣的效果,-q 引數使得 npt同步一次後就退出;同步的過程與Daemon模式的nptd是相同的。

如果作業系統核心支援調整時鐘頻度(Solaris,Linux,FreeBSD都已經支援),那麼時鐘同步還有一種不以Daemon方式執行的可選用法。首先,nptd以Daemon方式執行,配置好時鐘源,大約一個或幾個小時後,獲取到頻度誤差npt.drift 檔案;然後退出nptd程序,並以一次性模式執行(nptd -q),此時每次nptd執行都基於當前獲取到的頻度誤差與時鐘源同步時間。

同步間隔控制

當前版本的NTP包含了一個複雜的狀態機,用於減少同步時的網路負載;同時也包含很多種提升精度的方法。使用者在修改同步間隔(64秒~1024秒)的時候需要仔細考慮影響。預設的最小同步間隔可以使用 tinker minpool 命令修改為不小於16秒,這個值會被用作所有相關的使用到同步間隔的地方,除非顯示使用minpoll 選項覆蓋。需要注意的是不少裝置驅動在同步間隔小於64秒時候不能正常工作;同時廣播與多播模式也是使用的預設值,除非顯示覆蓋。

NPTD語法

ntpd [ -aAbdgLmNPqx ] [ -c conffile ] [ -f driftfile ] [ -g ] [ -k keyfile ] [ -l logfile ] [ -N high ] [ -p pidfile ] [ -r broadcastdelay ] [ -s statsdir ] [ -t key ] [ -v variable ] [ -V variable ] [ -x ]

命令列引數

  • -a

啟動認證(預設啟用)– -A禁用認證

  • -b

使用NTP廣播訊息同步– -c conffile指定配置檔名稱

  • -d

啟用除錯模式– -D level指定除錯級別

  • -f driftfile

指定頻度誤差檔案的路徑– -g正常情況下,ntpd 與時鐘源的時間差超過1000秒的閾值會退出,如果閾值設定為0,則ntpd 不會檢查,任何時差都會強制同步。-g 選項就是用於設定閾值為0;但是隻是一次生效,如果ntpd 執行過程中發現時差超過1000秒,還是會退出。

  • -k keyfile

指定NTP認證key檔案的路徑– -l logfile指定日誌檔案路徑,預設是作業系統日誌

  • -L

listen在虛擬IP上– -m使用NTP多播訊息在多播地址224.0.1.1上同步(需要核心支援)

  • -n

不fork程序– -N priority指定優先順序執行ntpd程序

  • -p pidfile

指定ntpd的pid檔案– -P覆蓋作業系統的優先順序限制

  • -q

僅同步一次後退出– -r broadcastdelay指定預設的廣播、多播延遲時間

  • -s statsdir

指定統計工具生成的檔案所在目錄– -t key增加key到信任的key列表

  • -v, -V

增加系統變數– -x預設情況下,ntpd在時差小於128ms時候使用微調模式,在大於128ms時候使用步長模式。-x 選項強制nptd僅使用微調模式同步。如果步長閾值(128ms)設定為0,則強制使用步長模式,-x也不生效。不是很推薦使用此選項,會導致時間同步變的非常緩慢,對強依賴網路時鐘的應用有影響。微調模式的同步速率是0.5ms/s,需要2000s才同步1秒。

參考