器:內(nèi)網(wǎng)時(shí)間同步部署與排坑指南)
簡(jiǎn)介一份基于C語(yǔ)言的SNTP服務(wù)器程序源碼包面向需要理解NTP/SNTP協(xié)議原理、希望搭建輕量級(jí)時(shí)間同步服務(wù)的開(kāi)發(fā)人員與網(wǎng)絡(luò)運(yùn)維者。程序?qū)崿F(xiàn)了SNTP服務(wù)器核心流程包括時(shí)間戳報(bào)文解析、本地時(shí)鐘偏差計(jì)算、UDP端口123監(jiān)聽(tīng)以及基礎(chǔ)配置邏輯可運(yùn)行于小型網(wǎng)絡(luò)環(huán)境為其他設(shè)備提供時(shí)間同步參考。壓縮包共6個(gè)文件包含3個(gè)C源文件、2個(gè)頭文件和1個(gè)Makefile整包僅4KB結(jié)構(gòu)精簡(jiǎn)適合作為協(xié)議學(xué)習(xí)和二次開(kāi)發(fā)的入門(mén)樣板。目前已有189人學(xué)習(xí)下載。通過(guò)閱讀源碼讀者可以掌握SNTP服務(wù)器的主要模塊劃分了解時(shí)間同步算法如何與網(wǎng)絡(luò)接口協(xié)作同時(shí)學(xué)習(xí)Makefile組織的輕量工程寫(xiě)法頭文件中的定義與全局變量管理方式也便于移植和擴(kuò)展。對(duì)于剛接觸網(wǎng)絡(luò)時(shí)間協(xié)議或想快速搭建自用時(shí)間服務(wù)器的讀者這份代碼能提供直觀的參考。1. 先別急著找“ntp.rar”解壓先搞清楚 NTP 和 SNTP 的距離你可能是在某臺(tái)工控機(jī)、某個(gè)機(jī)房服務(wù)器或者某套內(nèi)網(wǎng)設(shè)備上發(fā)現(xiàn)時(shí)間越走越偏然后搜到“ntp.rar_SNTP服務(wù)器程序_ntp”這個(gè)包以為解壓出來(lái)就是一套能用的時(shí)間服務(wù)器。但我在一線(xiàn)機(jī)房待了幾年想先提醒一句解開(kāi)這個(gè)包容易把時(shí)間同步體系搭穩(wěn)才是真活。這個(gè)包通常是一個(gè) SNTP 服務(wù)端程序或腳本解決的是內(nèi)網(wǎng)沒(méi)有公網(wǎng) GPS 時(shí)鐘源時(shí)局域網(wǎng)設(shè)備之間時(shí)間對(duì)齊的問(wèn)題。它適合的讀者不是普通辦公電腦用戶(hù)而是需要管服務(wù)器、攝像頭、門(mén)禁主機(jī)、工控終端的人目標(biāo)是讓網(wǎng)絡(luò)里所有設(shè)備的時(shí)間誤差控制在幾十毫秒以?xún)?nèi)。先明確一個(gè)認(rèn)知NTP 是完整協(xié)議族SNTP 是簡(jiǎn)化版兩者報(bào)文格式互通但精度、過(guò)濾算法、服務(wù)器行為不一樣。很多 rar 包里的程序其實(shí)是 SNTP 實(shí)現(xiàn)如果你拿它當(dāng)全套 NTP 用后面會(huì)踩不少坑。2. 從“ntp.rar”里挑版本該選 SNTP 服務(wù)端還是完整 NTP 服務(wù)端2.1 SNTP 和 NTP 的準(zhǔn)確區(qū)別報(bào)文相似腦子差很多如果你把 SNTP 程序裝好發(fā)現(xiàn)它只能做“基礎(chǔ)校時(shí)”無(wú)法處理網(wǎng)絡(luò)延遲抖動(dòng)、無(wú)法選擇最優(yōu)上游時(shí)鐘源、也不做時(shí)鐘狀態(tài)機(jī)的復(fù)雜管理那并不奇怪——SNTP 全稱(chēng)是 Simple Network Time Protocol它的定位就是“夠用就好”。它的報(bào)文格式和 NTP 兼容能響應(yīng)客戶(hù)端的 NTP 請(qǐng)求也能向上一層 NTP 服務(wù)器發(fā)起同步。但關(guān)鍵在于SNTP 服務(wù)器不保留歷史樣本不計(jì)算抖動(dòng)不篩選上游源。它一般是單次請(qǐng)求-響應(yīng)或者說(shuō)“收一個(gè)報(bào)文回一個(gè)報(bào)文”適合小型局域網(wǎng)、嵌入式設(shè)備、單機(jī)校時(shí)。完整 NTP 則維護(hù)多個(gè)上游源通過(guò) Marzullo 算法選出最優(yōu)源并且有復(fù)雜的時(shí)鐘濾波和馴服邏輯。所以你在選包的時(shí)候先問(wèn)一個(gè)問(wèn)題你的網(wǎng)絡(luò)里有多少臺(tái)設(shè)備要被校時(shí)設(shè)備的時(shí)鐘精度要求是多少如果只是幾十臺(tái)以?xún)?nèi)、誤差 50 毫秒可接受、網(wǎng)絡(luò)拓?fù)浜?jiǎn)單一臺(tái)服務(wù)器下面全是終端SNTP 服務(wù)器程序完全夠用。如果超過(guò)上百臺(tái)、有交換機(jī)層級(jí)、要求毫秒級(jí)一致性、還要考慮時(shí)鐘回跳和保持那直接上完整 NTP比如 chrony 或 ntpd別折騰 rar 包里的簡(jiǎn)易程序。2.2 解壓后的典型結(jié)構(gòu)可執(zhí)行文件、配置、服務(wù)腳本我見(jiàn)到過(guò)一個(gè)典型的 ntp.rar 包內(nèi)容里面通常包含一個(gè)主程序比如 sntp_server.exe 或 sntpd 的二進(jìn)制、一個(gè)示例配置文件、一個(gè)安裝腳本甚至可能有一個(gè)自述文檔。先說(shuō)常見(jiàn)做法解壓后不要直接雙擊運(yùn)行先把配置文件的參數(shù)過(guò)一遍。正常的 SNTP 服務(wù)器程序需要你設(shè)置幾個(gè)核心參數(shù)本地時(shí)鐘的優(yōu)先級(jí)、上游時(shí)間源的地址如果運(yùn)行在純內(nèi)網(wǎng)沒(méi)有上游就把服務(wù)器設(shè)成“本地時(shí)鐘源模式”、監(jiān)聽(tīng)端口默認(rèn) 123、日志輸出位置。很多打包程序默認(rèn)監(jiān)聽(tīng)在 127.0.0.1你要把它改成 0.0.0.0否則局域網(wǎng)其他設(shè)備根本訪問(wèn)不到。這個(gè)坑我至少見(jiàn)過(guò)三次全部是“程序沒(méi)報(bào)錯(cuò)但客戶(hù)端一直同步失敗”最后發(fā)現(xiàn)程序只綁定了回環(huán)地址。安裝為系統(tǒng)服務(wù)也值得一提。壓縮包里的服務(wù)腳本如果是 Windows 版通常是讓你用sc create或instsrv注冊(cè)服務(wù)。建議你不要在解壓目錄里臨時(shí)掛著跑因?yàn)榉?wù)器一旦重啟程序不會(huì)自動(dòng)拉起。我之前幫人排過(guò)一個(gè)問(wèn)題時(shí)間服務(wù)器程序跑得好好的機(jī)房一次意外斷電重啟后時(shí)間同步就斷了——斷在“程序沒(méi)有注冊(cè)為開(kāi)機(jī)自啟”。如果你拿到的是一個(gè)沒(méi)有任何自啟機(jī)制的裸可執(zhí)行文件我一般會(huì)手動(dòng)注冊(cè)成 Windows 服務(wù)或 systemd 服務(wù)保證斷電恢復(fù)后還能起來(lái)。3. 把 SNTP 服務(wù)器程序部署到 Windows 雙機(jī)同步最小可跑配置3.1 Windows 側(cè)注冊(cè)服務(wù)、開(kāi)放防火墻、修改本地策略如果你的網(wǎng)絡(luò)里主要都是 Windows 機(jī)器比如 Windows Server 2008 或 2019并且你打算用 rar 包里的 SNTP 程序做主時(shí)鐘源那么部署流程一般是這樣先確認(rèn)服務(wù)器要當(dāng)“權(quán)威時(shí)間源”本地時(shí)間本身要盡量準(zhǔn)。沒(méi)有公網(wǎng)的時(shí)候最常見(jiàn)做法是先把服務(wù)器本機(jī)時(shí)間手動(dòng)調(diào)準(zhǔn)再讓整個(gè)網(wǎng)絡(luò)認(rèn)它。以下是基于 Windows 環(huán)境的步驟# 1. 解壓后把程序放固定目錄假設(shè)是 C:\NtpServer # 2. 修改配置監(jiān)聽(tīng)所有網(wǎng)絡(luò)接口不要只監(jiān)聽(tīng) 127.0.0.1 bind 0.0.0.0 server stratum 1 # 3. 注冊(cè)為 Windows 服務(wù)以管理員身份運(yùn)行 PowerShell sc create NtpSrv binPath C:\NtpServer\sntp_server.exe --config C:\NtpServer\sntp.conf start auto sc start NtpSrv這段命令干的活有三個(gè)指定服務(wù)程序的啟動(dòng)路徑和配置文件將啟動(dòng)類(lèi)型設(shè)為 auto開(kāi)機(jī)自啟然后把服務(wù)拉起來(lái)。注意sc create里的等號(hào)后面必須有一個(gè)空格binPath引號(hào)不能亂嵌套這是 Windows 服務(wù)注冊(cè)的經(jīng)典坑——等號(hào)沒(méi)空格會(huì)直接報(bào)參數(shù)錯(cuò)誤而且錯(cuò)誤提示不直觀容易讓你懷疑是不是程序本身有問(wèn)題。注冊(cè)完服務(wù)后記得去防火墻放行 UDP 123 端口。下面這條命令開(kāi)放入站規(guī)則# 放行 UDP 123 端口避免客戶(hù)端請(qǐng)求被防火墻攔截 netsh advfirewall firewall add rule nameNTP_SNTP_UDP123 dirin actionallow protocolUDP localport123如果不放行你會(huì)看到客戶(hù)端能 ping 通服務(wù)器但w32tm /resync一直報(bào)“時(shí)間樣本被拒絕”。這種問(wèn)題最好先查防火墻再查服務(wù)狀態(tài)。3.2 Linux 客戶(hù)端同步到這臺(tái) SNTP 服務(wù)器用 ntpdate 驗(yàn)證Windows 服務(wù)器搭好了接下來(lái)用一臺(tái) Linux 機(jī)器驗(yàn)證這臺(tái) SNTP 服務(wù)器是不是真的在干活。最粗魯也最有效的驗(yàn)證方法不是w32tm而是ntpdate。注意ntpdate 是傳統(tǒng)工具現(xiàn)網(wǎng)很多系統(tǒng)推薦用 chrony但在驗(yàn)證 SNTP 服務(wù)器時(shí)ntpdate一次式查詢(xún)能最快看到結(jié)果。# 停止本地時(shí)間服務(wù)避免和 ntpdate 打架 systemctl stop chronyd || true # 強(qiáng)制與內(nèi)網(wǎng) SNTP 服務(wù)器同步注意 -u 參數(shù)會(huì)使用非特權(quán)端口 /usr/sbin/ntpdate -u 192.168.1.10 date這里-u參數(shù)很關(guān)鍵很多網(wǎng)關(guān)、路由器的 NAT 環(huán)境會(huì)限制源端口為 123 的 UDP 報(bào)文用非特權(quán)端口1024 以上能夠繞開(kāi)這種限制。執(zhí)行后如果能看到類(lèi)似adjust time server 192.168.1.10 offset -0.020153 sec的輸出說(shuō)明時(shí)間同步鏈路是通的如果報(bào)no server suitable for synchronization found優(yōu)先懷疑服務(wù)器沒(méi)有監(jiān)聽(tīng) 0.0.0.0、防火墻策略、配置里三層以上設(shè)備是否禁止了 123 端口。我用 ntpdate 做驗(yàn)證的目的很簡(jiǎn)單把“服務(wù)器是否正?!焙汀翱蛻?hù)端配置是否正確”兩個(gè)變量分開(kāi)先確認(rèn)前者。3.3 參數(shù)怎么調(diào)stratum 層級(jí)、同步間隔、本地時(shí)鐘源的取舍部署 SNTP 服務(wù)器時(shí)stratum參數(shù)是必須理解的。stratum 表示時(shí)間源的層級(jí)stratum 0 一般是原子鐘或 GPS 時(shí)鐘源stratum 1 是直接連到 stratum 0 的服務(wù)器stratum 2 是同步自 stratum 1 的服務(wù)器依次類(lèi)推。在純內(nèi)網(wǎng)環(huán)境里你手動(dòng)設(shè)為一臺(tái)即沒(méi)有任何上游的時(shí)間源那就把自己設(shè)為stratum 1如果這臺(tái)服務(wù)器本身還要去同步公網(wǎng)服務(wù)器那它的層級(jí)應(yīng)該是所同步公網(wǎng)源的層級(jí)加 1不要亂設(shè)否則客戶(hù)端會(huì)認(rèn)為時(shí)間源層級(jí)過(guò)高或過(guò)低而拒絕使用。還有一個(gè)參數(shù)值得提同步間隔。很多 SNTP 程序默認(rèn)同步周期是 60 秒或 64 秒但如果你在局域網(wǎng)內(nèi)有幾百臺(tái)設(shè)備每臺(tái)設(shè)備默認(rèn)同時(shí)發(fā)起請(qǐng)求服務(wù)器會(huì)瞬間收到大量突發(fā)流量導(dǎo)致響應(yīng)延遲反而讓客戶(hù)端測(cè)出的網(wǎng)絡(luò)往返時(shí)間變大、精度降低。建議把客戶(hù)端的同步間隔拉長(zhǎng)到 300 秒以上這樣既保證漂移修正又不會(huì)打爆服務(wù)器的并發(fā)隊(duì)列。4. 公網(wǎng) NTP 服務(wù)器測(cè)試內(nèi)網(wǎng) SNTP 服務(wù)器如何向公網(wǎng)對(duì)齊4.1 當(dāng)內(nèi)網(wǎng)服務(wù)器需要公網(wǎng)對(duì)時(shí)推薦用 ntpdate 做一次性拉齊很多公司內(nèi)部局域網(wǎng)里條件沒(méi)那么好沒(méi)有 GPS也沒(méi)有專(zhuān)門(mén)硬件時(shí)鐘但服務(wù)器又承擔(dān)著給全公司設(shè)備校時(shí)的任務(wù)。這時(shí)常見(jiàn)做法是讓這臺(tái)內(nèi)網(wǎng) SNTP 服務(wù)器定時(shí)向公網(wǎng) NTP 池拉取標(biāo)準(zhǔn)時(shí)間然后再向局域網(wǎng)提供服務(wù)。公網(wǎng) NTP 池的域名一般是方便記憶的公共池地址例如特定國(guó)家的池但國(guó)內(nèi)網(wǎng)絡(luò)環(huán)境下不同運(yùn)營(yíng)商的訪問(wèn)質(zhì)量千差萬(wàn)別。建議你先用下面的命令測(cè)一下從本機(jī)到公網(wǎng) NTP 源的網(wǎng)絡(luò)延遲ntpdate -q -u cn.pool.ntp.org-q表示只查詢(xún)不修改時(shí)間-u照舊是避開(kāi) NAT 源端口限制。輸出里會(huì)有類(lèi)似server 100.100.100.1, stratum 2, offset 0.012534, delay 0.038的字段。重點(diǎn)關(guān)注 delay網(wǎng)絡(luò)往返時(shí)延和 offset本地時(shí)間與標(biāo)準(zhǔn)時(shí)間偏差。如果 delay 超過(guò) 100 毫秒說(shuō)明網(wǎng)絡(luò)鏈路質(zhì)量不好不建議該服務(wù)器直接作為內(nèi)網(wǎng)可信時(shí)間源要么換一個(gè)更近的公網(wǎng)源要么考慮多層同步——比如用一臺(tái)專(zhuān)機(jī)同步公網(wǎng)其他 SNTP 服務(wù)器再同步這臺(tái)專(zhuān)機(jī)。4.2 Windows 2008 和 Windows 客戶(hù)端如何配置外部時(shí)間源這里把 Windows 系統(tǒng)的 NTP 配置單獨(dú)拿出來(lái)說(shuō)。搜熱詞的讀者很多是在 Windows Server 2008 或 2019 上做 NTP下面這段命令就是 Windows 下設(shè)置公網(wǎng)時(shí)間源并立即同步的標(biāo)準(zhǔn)做法:: 修改本機(jī)時(shí)間源為公網(wǎng) NTP 服務(wù)器并啟用 NTP 客戶(hù)端 w32tm /config /manualpeerlist:ntp.aliyun.com /syncfromflags:manual /reliable:YES /update :: 立即重新同步一次 w32tm /resync /nowait需要解釋的是manualpeerlist后面的值是外部 NTP 服務(wù)器的域名。Windows 的時(shí)間服務(wù)不是直接發(fā) NTP 請(qǐng)求的它背后有自己的時(shí)鐘采樣機(jī)制并且默認(rèn)要求時(shí)間源是可驗(yàn)證的。如果你在配置時(shí)順手把reliable:YES設(shè)成了正確值那么本機(jī)就能被局域網(wǎng)內(nèi)其他機(jī)器當(dāng)作可靠時(shí)間源。注意 Windows 時(shí)間服務(wù)的“可靠時(shí)間源”概念它不是一個(gè)絕對(duì)測(cè)量指標(biāo)而是你在注冊(cè)表/命令里手動(dòng)標(biāo)記的。但是實(shí)際經(jīng)驗(yàn)是Windows 2008 上如果開(kāi)著域控功能組策略會(huì)自動(dòng)強(qiáng)制域內(nèi)機(jī)器與域控同步這時(shí)你手動(dòng)設(shè)的公網(wǎng)源可能不生效需要檢查默認(rèn)域策略。一般遇到這種情況我會(huì)先用w32tm /query /source查看當(dāng)前同步源再判斷是策略覆蓋還是配置寫(xiě)錯(cuò)。5. 避坑手冊(cè)搭 SNTP 服務(wù)器常見(jiàn)的 5 個(gè)翻車(chē)現(xiàn)場(chǎng)5.1 現(xiàn)象客戶(hù)端與服務(wù)器時(shí)間始終有 8 秒偏差查不出原因原因很隱蔽一些 SNTP 程序包在 Windows 上默認(rèn)使用當(dāng)?shù)貢r(shí)間格式另一些默認(rèn)使用 UTC 格式。如果服務(wù)器程序把當(dāng)前時(shí)間以本地制式發(fā)送而客戶(hù)端按 UTC 解析會(huì)出現(xiàn)整小時(shí)級(jí)別的偏差8 秒偏差則往往不是時(shí)區(qū)而是程序在讀取系統(tǒng)時(shí)鐘時(shí)沒(méi)有考慮 Windows 的“啟動(dòng)后時(shí)間補(bǔ)償”。解決方法是檢查配置文件里time format或utc offset相關(guān)項(xiàng)統(tǒng)一設(shè)為 UTC并在服務(wù)器上確認(rèn) Windows 時(shí)區(qū)設(shè)置正確。我遇到過(guò)一位老哥查了半天發(fā)現(xiàn)是服務(wù)器系統(tǒng)時(shí)區(qū)被設(shè)成了太平洋時(shí)區(qū)所有客戶(hù)端把回包的時(shí)間戳換成北京時(shí)間之后產(chǎn)生幾十小時(shí)誤差真就是“時(shí)間服務(wù)器自己時(shí)間先錯(cuò)了”。5.2 現(xiàn)象程序明明在跑但所有客戶(hù)端都報(bào)同步超時(shí)原因通常是服務(wù)綁定的地址不對(duì)或防火墻攔截了 UDP 123。先說(shuō)綁定配置文件里bind 127.0.0.1是默認(rèn)值只服務(wù)本機(jī)。尤其在一些從英文論壇下的小工具 rar 包里默認(rèn)配置面向“本機(jī)調(diào)試”根本沒(méi)打算開(kāi)放局域網(wǎng)服務(wù)。解決辦法是把 bind 改為0.0.0.0或局域網(wǎng)網(wǎng)卡實(shí)際 IP。防火墻方面Windows 防火墻默認(rèn)阻斷了 NTP 入站請(qǐng)求就算服務(wù)監(jiān)聽(tīng)正確外部設(shè)備也沒(méi)法訪問(wèn)必須顯式放行。建議排查順序先在本機(jī)服務(wù)器上執(zhí)行netstat -an | findstr :123看監(jiān)聽(tīng)地址是否是 0.0.0.0再到另一臺(tái)機(jī)器telnet不行UDP 要看端口是否開(kāi)放用tcping之類(lèi)工具也測(cè)不了 UDP最穩(wěn)妥的還是抓包。5.3 現(xiàn)象斷網(wǎng)重啟后服務(wù)器時(shí)間回退一小時(shí)整網(wǎng)設(shè)備跟著跳變?cè)蚍?wù)器硬件時(shí)鐘本身沒(méi)有電池/電容后備或虛擬機(jī)的時(shí)鐘同步被關(guān)閉。SNTP 服務(wù)器啟動(dòng)時(shí)默認(rèn)從系統(tǒng)時(shí)鐘獲取時(shí)間如果系統(tǒng)時(shí)鐘在關(guān)機(jī)期間停走、跳變、甚至被 BIOS 重置服務(wù)器就會(huì)“自信地”廣播一個(gè)錯(cuò)誤時(shí)間整網(wǎng)設(shè)備跟著重新同步造成日志時(shí)間錯(cuò)亂。解決辦法是部署前先校準(zhǔn)硬件時(shí)鐘Linux 下用hwclock --systohc把系統(tǒng)時(shí)間寫(xiě)入硬件時(shí)鐘Windows 下在 BIOS 里確認(rèn) RTC 時(shí)間設(shè)置正常。另外建議在 SNTP 服務(wù)器程序配置里開(kāi)啟“啟動(dòng)時(shí)上限偏差檢測(cè)”如果本機(jī)時(shí)間與上游假如有偏差超過(guò) 5 秒就拒絕啟動(dòng)服務(wù)或先向上游強(qiáng)制校準(zhǔn)再對(duì)外提供服務(wù)。很多程序沒(méi)有這個(gè)選項(xiàng)那就只能在啟動(dòng)腳本里手動(dòng)加上一次 ntpdate 操作。5.4 現(xiàn)象局域網(wǎng)內(nèi)時(shí)間同步能成功但精度一直卡在 100 毫秒級(jí)別無(wú)法再往下壓原因網(wǎng)絡(luò)里有交換機(jī)開(kāi)啟的組播泛洪、鏈路擁塞或者客戶(hù)端主機(jī)的網(wǎng)卡節(jié)能模式導(dǎo)致中斷延遲。SNTP 本身沒(méi)有復(fù)雜的時(shí)延補(bǔ)償算法如果網(wǎng)絡(luò)交換機(jī)的 IGMP snooping 配置不當(dāng)或網(wǎng)卡開(kāi)啟了節(jié)能以太網(wǎng)Energy Efficient Ethernet就會(huì)引入 10 到 50 毫秒的隨機(jī)抖動(dòng)。解決方法是盡量讓時(shí)間服務(wù)器和重要終端處在同一個(gè)二層廣播域里減少三層設(shè)備路由跳數(shù)在客戶(hù)端網(wǎng)卡驅(qū)動(dòng)里關(guān)閉節(jié)能模式比如 Windows 的“Green Ethernet”在 Linux 下用ethtool -s eth0 wol d或關(guān)閉 tx/rx 的校驗(yàn)和卸載效果不會(huì)特別大主要看 RTT 穩(wěn)定度。說(shuō)穿了就是SNTP 想要毫秒級(jí)精確網(wǎng)絡(luò)質(zhì)量必須控得非常好其中減少中間節(jié)點(diǎn)和關(guān)閉網(wǎng)卡省電模式是最快見(jiàn)效的兩招。5.5 現(xiàn)象rar 解壓后的程序被殺毒軟件隔離服務(wù)找不到啟動(dòng)文件原因壓縮包里包含未簽名且?guī)撤N底層端口監(jiān)聽(tīng)功能的執(zhí)行文件殺毒軟件經(jīng)常誤報(bào)為風(fēng)險(xiǎn)程序。解決方法是不要臨時(shí)解壓后直接運(yùn)行而是先設(shè)置整個(gè)目錄為殺毒軟件白名單再注冊(cè)服務(wù)。如果程序真的被刪了就重新解壓一次這次養(yǎng)成了習(xí)慣先把配置文件和服務(wù)腳本檢查一遍。說(shuō)個(gè)扎心的經(jīng)驗(yàn)我曾經(jīng)見(jiàn)過(guò)一個(gè)人把 SNTP 服務(wù)器程序放在臨時(shí)目錄里系統(tǒng)一清理臨時(shí)文件就刪了服務(wù)就崩潰了。這種“程序丟失、服務(wù)還在、起不來(lái)”的詭異問(wèn)題不算少見(jiàn)。6. 用 ntpq 做同步質(zhì)量體檢驗(yàn)證你的 SNTP 服務(wù)器不是黑匣子部署完 SNTP 服務(wù)器不能只看“能同步”就當(dāng)作完事。我會(huì)建議你最后做一次體檢用 NTP 自帶的工具確認(rèn)服務(wù)器響應(yīng)質(zhì)量。尤其當(dāng)你用的不是完整 ntpd、而是簡(jiǎn)易 SNTP 程序時(shí)更需要知道它每個(gè)時(shí)間樣本的可信度。ntpq -p 192.168.1.10輸出結(jié)果大概長(zhǎng)這樣remote refid st t when poll reach delay offset jitter *192.168.1.10 LOCAL(0) 1 u 27 64 377 0.623 0.042 1.512關(guān)注reach這一列它是 8 位左移寄存器377 表示最近 8 次輪詢(xún)?nèi)砍晒θ绻@個(gè)數(shù)字很低比如 1 或 17說(shuō)明網(wǎng)絡(luò)丟包很?chē)?yán)重服務(wù)器響應(yīng)不穩(wěn)定。offset是當(dāng)前客戶(hù)端與服務(wù)器的時(shí)間偏差越小越好幾十毫秒內(nèi)算合格jitter是時(shí)延抖動(dòng)如果超過(guò) 10 毫秒說(shuō)明網(wǎng)絡(luò)路徑或者服務(wù)器負(fù)載有問(wèn)題。搭配連續(xù)多測(cè)幾次也能看出問(wèn)題。還有個(gè)細(xì)節(jié)當(dāng)你用的 SNTP 程序返回的 stratum 是 1而程序本身其實(shí)是從本地時(shí)鐘取的源時(shí)refid那一列會(huì)顯示LOCAL(0)。如果顯示的是某個(gè) IP說(shuō)明這個(gè)“本地權(quán)威”來(lái)源另有上游。我在日常維護(hù)里最看重reach 377和offset兩個(gè)指標(biāo)只要它們穩(wěn)定那這套系統(tǒng)基本能放心跑。而我的一個(gè)習(xí)慣是每季度找一臺(tái)終端做一次w32tm /stripchart連續(xù)采樣 10 分鐘看時(shí)差曲線(xiàn)是否漂移。如果曲線(xiàn)一直在直線(xiàn)上升或下降大概率是服務(wù)器本地時(shí)鐘有頻偏需要更換硬件時(shí)鐘芯片或手動(dòng)做溫度補(bǔ)償。最后說(shuō)一句個(gè)人教訓(xùn)SNTP 這種簡(jiǎn)單方案部署只是開(kāi)始真正花時(shí)間的是建立“誰(shuí)向誰(shuí)同步、偏差多少、何時(shí)需要干預(yù)”的維護(hù)習(xí)慣。我如今接手任何一套時(shí)間同步系統(tǒng)都會(huì)先把拓?fù)洚?huà)出來(lái)寫(xiě)清客戶(hù)端指向誰(shuí)、每一級(jí)的源是誰(shuí)、層級(jí)是多少這樣至少不會(huì)被某臺(tái)安靜壞掉的服務(wù)器暗算。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取