Network Time Protocol(NTP)是一種在數據中心被廣泛部署的時間同步協議,它能提供毫秒級別的同步。但是對于電信,金融,流媒體,科學計算,或者一些互聯網分布式業務,如分布式數據庫,分布式渲染等,一個高精度,并且可靠的時間是很關鍵的。
IEEE 1588 Precision Time Protocol (PTP) 是另一種時間同步標準,它的目標是達到納秒甚至皮秒級別的時間同步精度。
DOCA Firefly是一個基于PTP時間同步的DOCA服務,使用PTP來校準DPU(網卡本身)的時鐘,然后同步到宿主機。依靠網卡的高精度時鐘,客戶可以重新設計實現自己的各種應用。
同時,使用硬件來得到更高的時間精度成為趨勢。本文將從IEEE 1588 Precision Time Protocol (PTP)開始,描述PTP基本原理,及其軟件協議棧,它與DOCA Firefly的關系,部署時間網絡的基本硬件要求,如何部署DOCA Firefly,最后分享了幾個從PTP中得到收益的業務示例。
IEEE 1588 Precision Time Protocol (PTP)原理簡析
IEEE 1588全稱是網絡測量和控制系統的精密時鐘同步協議標準,基本功能是網絡中所有時鐘都與最精確的時鐘保持同步。每個從時鐘通過與主時鐘交換同步報文而與主時鐘達到同步,最終整個網絡同步到同一個時鐘源。
它使用端到端的UDP報文交互來確認彼此狀態,計算環路時延然后進行同步。1588的時間同步過程如下圖所示:

對于端到端的雙方Master和Slave,首先需要計算兩個路徑延遲,Master-to-Slave和Slave-to-Master。
首先計算Master-to-Slave:
- t1時刻,Master發送Sync Message
- t2時刻,Slave接收到Sync Message
- tms,Master到Slave的時間差為t2 – t1
計算Slave-to-Master:
- t3時刻,Slave發送Delay Request Message
- t4時刻,Master接收到Delay Request Message
- tsm,Slave到Master的時間差為t2 – t1
假設雙向延遲是對稱的,那么單向延遲(RTT/2)為:

那么最終的時間偏移offset可以如下計算,這個offset可用來糾正Slave的時鐘:

Linux PTP
Linux社區通過Linux PTP項目PTP4L提供了一套軟件來支持IEEE 1588,該軟件是根據IEEE 1588的Linux精確時間協議(PTP)實現的。Linux PTP實現了IEEE 1588中定義的Boundary Clock (BC), Ordinary Clock (OC) 和Transparent Clock (TC)。
Linux PTP傳輸層基于UDP/IPv4, UDP/IPv6, 或者raw Ethernet (Layer 2),其分層模型如下圖所示:

PTP通過Linux SO_TIMESTAMPING選項支持基于硬件和軟件的時間戳,如果PTP消息由操作系統網絡協議棧處理,則會增加很多的延遲與抖動,從而導致系統時鐘精度不高。
支持PTP硬件的DPU則可以bypass內核軟件處理流程,在發送出PTP交互消息的時刻,由硬件打上實時的時間戳,從而達到納秒級別的精度。
系統時鐘如果要同步到Master,DPU的PTP硬件時鐘必須通過PTP4L鎖定到PTP網絡,并且通過PHC2SYS把硬件時鐘同步到系統。使用BlueField-2部署Linux PTP時,PTP4L和PHC2SYS都屬于DOCA Firefly時間服務,并且都打包進Firefly容器,部署到DPU的ARM系統上。
DOCA Firefly的原理和架構分析
DOCA Firefly是一個時間服務解決方案,通過一個服務支持所有關于時間的需求。它對Linux PTP做了很多的增強,對其做了很多的功能和性能的增強,并且可以支持Linux和Windows,無論是裸金屬還是虛擬化云環境。
在DPU、NIC和交換機上都可以輕松的使用容器部署Firefly,各行業和應用都可以使用同一個服務,本質上,Firefly提供了所有需要的時間服務功能功能,如配置、監視,備份,編排。
DOCA Firefly為數據中心提供了端到端的硬件加軟件的解決方案,使高精度的時鐘網絡不在復雜和昂貴,其結構框圖如下圖所示:

DOCA Firefly可以運行在DPU或者ConnectX系列網卡上。當運行在DPU上時,有額外的優勢:
- PTP4L運行在DPU ARM cores上,將時間進程與其它服務器軟件隔離開來
- 可以持續的驗證該服務器時間的準確性,并不斷的計算跨數據中心的最大時間誤差
- 可以支持Windows系統
典型時間網絡拓撲
一個典型的時間網絡拓撲如下圖所示:

它由以下三種元素構成:
- Grandmaster(GM):在PTP網絡中,只有一個節點可以被選擇做為參考時鐘(Grandmaster),其余所有節點做為PTP Follower。GM應該是整個網絡中最精確的時鐘。
- Boundary Clock (BC):交換機中的所有端口共享一個本地時鐘,而不是維護各自的時間基礎。在BC上,只有一個端口會切換到PTP從隨者狀態,收集外部GM提供的時間信息,以便相應地調整BC的本地時鐘。
所有其他端口承擔PTP領導者的角色,訪問時間信息,并將其傳輸到連接到它們端口上的追隨者。
- PTP Followers:系統中所有非GM或BC的服務器實體都充當PTP追隨者。服務器連接到交換機,運行PTP守護進程客戶端,監聽PTP消息并同步本地時鐘。
DOCA Firefly在DPU上的部署過程
登錄到DPU的Linux shell,執行下面的步驟在DPU上部署時間服務。
- 創建配置文件/etc/ptp4l/ptp4l.conf,并添加以下內容:
[global]
domainNumber 127
priority1 128
priority2 127
use_syslog 1
logging_level 6
tx_timestamp_timeout 30
hybrid_e2e 1
dscp_event 46
dscp_general 46
[p0]
logAnnounceInterval -2
announceReceiptTimeout 3
logSyncInterval -3
logMinDelayReqInterval -3
delay_mechanism E2E
network_transport UDPv4
創建并啟動Firefly時間服務的容器:
#Logout to NGC
docker logout nvcr.io
#Login to NGC
docker login nvcr.io
# Create container
docker create \
–privileged \
–network host \
–name ptp-service-container \
–restart unless-stopped \
–restart unless-stopped \
-v /var/log/:/var/log/ \
-v /etc/ptp4l/:/etc/ptp4l/ \
nvcr.io/ea-rivermax/dpu-ptp-service/dpu-ptp-service:21.03-v1
# Start container
docker start ptp-service-container
- 使用docker ps確認容器正常啟動
- 查看日志文件/var/log/ptp4l.log,檢查時鐘的狀態
# tail -f /var/log/ptp4l.log

DOCA Firefly的時間精度結果
不同的硬件支持不同的時間服務功能,并且精度也有差別,如下表所示:

使用IEEE 1588時間同步后,對分布式數據庫的具有明顯的加速,比如Google Spanner, CockroachDB,最終性能提升3-4倍。因為在分布式數據庫應用中,所有的節點和事務需要對時間達成一致,時間不確定性限制了分布式、同步復制的數據庫性能。使用PTP之后,降低了時間不確定性,提高了計時精度。詳細參考https://www.cockroachlabs.com/blog/living-without-atomic-clocks,和論文Sundial: Fault-tolerant Clock Synchronization for Datacenters。
在專業的流媒體處理中,所有的媒體節點需要鎖定同一個時鐘,精度要求us級別。SMPTE ST 2059/2110要求設備支持硬件時間戳。并且大多數的媒體處理使用基于Windows的工作站,目前并沒有PTP能夠支持Windows。通過在DPU上部署DOCA Firefly,則Windows系統也可以享受PTP帶來的優勢。
在更多的對時間精度有要求的場景中,越來越多的應用能從PTP收益。比如分布式事件檢測,擁塞控制等。在電信設備中,IEEE 1588也是必須的功能。
終上所述,在使用Firefly之后,因為所有節點間以納秒級別同步時鐘,數據中心可以重新考慮如何設計自己的應用程序。