《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的級別,當前的大多數工作站都無法滿足.
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秒時候不能正常工作;同時廣播與多播模式也是使用的默認值,除非顯示覆蓋.
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
– -c?conffile
– -D?level
driftfile
– -g
keyfile
– -l?logfile
– -m
– -N?priority
pidfile
– -P
– -r?broadcastdelay
statsdir
– -t?key
– -x