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
如今的計算機都帶有硬體時鐘晶片(time-of-year (TOY) chip),用於在計算機掉電過程中仍然保持正確時間,當計算機上電,作業系統從時鐘晶片中獲取時間。當作業系統啟動完成並連線到時鐘源之後,作業系統會依據時鐘源定時調整晶片時間。在伺服器沒有硬體時鐘晶片或硬體時鐘晶片故障(CMOS電池沒電)或其他原因導致作業系統本地時間與時鐘源時間差別超過1000秒,nptd
認為此時發生了嚴重問題,唯一可靠的處理方法是人為介入。這種情況下nptd
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
– -c conffile
- -d
– -D level
- -f
driftfile
– -g
- -k
keyfile
– -l logfile
- -L
– -m
- -n
– -N priority
- -p
pidfile
– -P
- -q
– -r broadcastdelay
- -s
statsdir
– -t key
- -v, -V
– -x