概述
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
- -b
- -d
- -f
driftfile
- -k
keyfile
- -L
- -n
- -p
pidfile
- -q
- -s
statsdir
- -v, -V

