20 精确时间协议 #
对于网络环境而言,让计算机和其他设备的时钟保持同步和准确至关重要。有多种解决方案可实现此目的,例如,使用第 38 章 “使用 NTP 同步时间”中所述的广泛使用的网络时间协议 (NTP)。
精确时间协议 (PTP) 支持亚微秒级准确性,较 NTP 更优。PTP 支持分为内核和用户空间。SUSE Linux Enterprise Server 中的内核包含对网络驱动程序提供的 PTP 时钟的支持。
20.1 PTP 简介 #
PTP 管理的时钟遵循主从层次结构。从属时钟将同步到其主时钟。层次结构由每个时钟上运行的最佳主时钟 (BMC) 算法更新。只有一个端口的时钟可以是主时钟也可以是从属时钟。此类时钟称为普通时钟 (OC)。具有多个端口的时钟可以是一个端口上的主时钟以及另一个端口上的从属时钟。此类时钟称为边界时钟 (BC)。顶层主时钟称为超级主时钟。超级主时钟可与全球定位系统 (GPS) 同步。这样,不同的网络便能够以高准确度实现同步。
硬件支持是 PTP 的主要优势。各种网络交换机和网络接口控制器 (NIC) 都支持 PTP。虽然可以在网络内部使用启用非 PTP 的硬件,但为所有 PTP 时钟之间的网络组件启用 PTP 硬件可实现最大的准确性。
20.1.1 PTP Linux 实施 #
在 SUSE Linux Enterprise Server 上,由 linuxptp
软件包提供 PTP 实施。请使用 zypper install linuxptp
安装该软件包。该软件包中包含用于时钟同步的 ptp4l
和 phc2sys
程序。ptp4l
实施 PTP 边界时钟和普通时钟。如果启用硬件时戳,ptp4l
会将 PTP 硬件时钟同步到主时钟。如果使用软件时戳,它会将系统时钟同步到主时钟。仅当使用硬件时戳将系统时钟同步到网络接口卡 (NIC) 上的 PTP 硬件时钟时,才需要 phc2sys
。
20.2 使用 PTP #
20.2.1 网络驱动程序和硬件支持 #
PTP 要求使用的内核网络驱动程序支持软件时戳或硬件时戳。此外,NIC 还必须支持物理硬件中的时戳。您可以使用 ethtool
校验驱动程序和 NIC 时戳功能:
>
sudo
ethtool -T eth0 Time stamping parameters for eth0: Capabilities: hardware-transmit (SOF_TIMESTAMPING_TX_HARDWARE) software-transmit (SOF_TIMESTAMPING_TX_SOFTWARE) hardware-receive (SOF_TIMESTAMPING_RX_HARDWARE) software-receive (SOF_TIMESTAMPING_RX_SOFTWARE) software-system-clock (SOF_TIMESTAMPING_SOFTWARE) hardware-raw-clock (SOF_TIMESTAMPING_RAW_HARDWARE) PTP Hardware Clock: 0 Hardware Transmit Timestamp Modes: off (HWTSTAMP_TX_OFF) on (HWTSTAMP_TX_ON) Hardware Receive Filter Modes: none (HWTSTAMP_FILTER_NONE) all (HWTSTAMP_FILTER_ALL)
软件时戳需要以下参数:
SOF_TIMESTAMPING_SOFTWARE SOF_TIMESTAMPING_TX_SOFTWARE SOF_TIMESTAMPING_RX_SOFTWARE
硬件时戳需要以下参数:
SOF_TIMESTAMPING_RAW_HARDWARE SOF_TIMESTAMPING_TX_HARDWARE SOF_TIMESTAMPING_RX_HARDWARE
20.2.2 使用 ptp4l
#
ptp4l
默认使用硬件时戳。您需要以 root
身份使用 -i
选项指定支持硬件时戳的网络接口。-m
指示 ptp4l
将其输出列显到标准输出,而不是列显到系统的日志记录工具:
>
sudo
ptp4l -m -i eth0 selected eth0 as PTP clock port 1: INITIALIZING to LISTENING on INITIALIZE port 0: INITIALIZING to LISTENING on INITIALIZE port 1: new foreign master 00a152.fffe.0b334d-1 selected best master clock 00a152.fffe.0b334d port 1: LISTENING to UNCALIBRATED on RS_SLAVE master offset -25937 s0 freq +0 path delay 12340 master offset -27887 s0 freq +0 path delay 14232 master offset -38802 s0 freq +0 path delay 13847 master offset -36205 s1 freq +0 path delay 10623 master offset -6975 s2 freq -30575 path delay 10286 port 1: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED master offset -4284 s2 freq -30135 path delay 9892
master offset
值表示测得的与主时钟之间的偏差(以纳秒为单位)。
s0
、s1
、s2
指示器显示时钟伺服的不同状态:s0
表示已解锁,s1
表示时钟步进,s2
表示已锁定。如果伺服处于已锁定状态 (s2
),并且 pi_offset_const
选项在配置文件中设置为负值,则时钟不会步进,而只会缓慢调整(有关详细信息,请参见 man 8 ptp4l
)。
freq
值表示时钟的频率调整(以十亿分率 (ppb) 为单位)。
path delay
值表示从主时钟发送的同步消息的预计延迟(以纳秒为单位)。
端口 0 是用于本地 PTP 管理的 Unix 域套接字。端口 1 是 eth0
接口。
INITIALIZING
、LISTENING
、UNCALIBRATED
和 SLAVE
是发生 INITIALIZE
、RS_SLAVE
和 MASTER_CLOCK_SELECTED
事件时更改的端口状态示例。当端口状态从 UNCALIBRATED
更改为 SLAVE
时,表示计算机已与 PTP 主时钟成功同步。
您可以使用 -S
选项启用软件时戳。
>
sudo
ptp4l -m -S -i eth3
还可以将 ptp4l
作为服务运行:
>
sudo
systemctl start ptp4l
在此情况下,ptp4l
将从 /etc/sysconfig/ptp4l
文件读取其选项。默认情况下,此文件会指示 ptp4l
从 /etc/ptp4l.conf
读取配置选项。有关 ptp4l
选项和配置文件设置的详细信息,请参见 man 8 ptp4l
。
要永久启用 ptp4l
服务,请运行以下命令:
>
sudo
systemctl enable ptp4l
要禁用该服务,请运行
>
sudo
systemctl disable ptp4l
20.2.3 ptp4l
配置文件 #
ptp4l
可以从可选的配置文件读取其配置。由于默认未使用任何配置文件,您需要通过 -f
指定配置文件。
>
sudo
ptp4l -f /etc/ptp4l.conf
配置文件分为若干部分。全局部分(以 [global]
指示)用于设置程序选项、时钟选项和默认端口选项。其他部分与特定的端口相关,会覆盖默认端口选项。部分的名称是配置的端口的名称 — 例如 [eth0]
。空白端口部分可用于替换命令行选项。
[global] verbose 1 time_stamping software [eth0]
示例配置文件等效于以下命令选项:
>
sudo
ptp4l -i eth0 -m -S
有关 ptp4l
配置选项的完整列表,请参见 man 8 ptp4l
。
20.2.4 延迟测量 #
ptp4l
通过两种方法测量时间延迟:对等式 (P2P) 或端到端 (E2E)。
- P2P
此方法使用
-P
指定。它可以更快地对网络环境中的更改做出反应,并更准确地测量延迟。仅在每个端口都会与另一个端口交换 PTP 消息的网络中才会使用此方法。P2P 需受到通讯路径中所有硬件的支持。
- E2E
此方法使用
-E
指定。此为默认设置。- 自动选择方法
此方法使用
-A
指定。自动选项以 E2E 模式启动ptp4l
,如果收到了对等延迟请求,则更改为 P2P 模式。
单个 PTP 通讯路径上的所有时钟必须使用相同的方法来测量时间延迟。如果在使用 E2E 机制的端口上收到了对等延迟请求,或者在使用 P2P 机制的端口上收到了 E2E 延迟请求,将会列显警告。
20.2.5 PTP 管理客户端:pmc
#
您可以使用 pmc
客户端获取有关 ptp41
的更详细信息。pmc 从标准输入或命令行读取按名称和管理 ID 指定的操作。然后通过选定的传输发送操作,并列显收到的任何答复。支持三种操作:GET
检索指定的信息,SET
更新指定的信息,CMD
(或 COMMAND
)发起指定的事件。
默认情况下,管理命令会在所有端口上寻址。您可以使用 TARGET
命令为后续消息选择特定的时钟和端口。如需管理 ID 的完整列表,请运行 pmc help
。
>
sudo
pmc -u -b 0 'GET TIME_STATUS_NP' sending: GET TIME_STATUS_NP 90f2ca.fffe.20d7e9-0 seq 0 RESPONSE MANAGMENT TIME_STATUS_NP master_offset 283 ingress_time 1361569379345936841 cumulativeScaledRateOffset +1.000000000 scaledLastGmPhaseChange 0 gmTimeBaseIndicator 0 lastGmPhaseChange 0x0000'0000000000000000.0000 gmPresent true gmIdentity 00b058.feef.0b448a
-b
选项指定所发送消息中的边界跃点值。将此选项设置为 0 会将边界限制为本地 ptp4l
实例。增加该值还将检索距离本地实例更远的 PTP 节点发出的消息。返回的信息可能包括:
- stepsRemoved
超级主时钟的通讯节点数。
- offsetFromMaster、master_offset
该时钟与主时钟之间上次测得的偏差(纳秒)。
- meanPathDelay
从主时钟发送的同步消息的预计延迟(纳秒)。
- gmPresent
如果为
true
,则表示 PTP 时钟已同步到主时钟;本地时钟不是超级主时钟。- gmIdentity
此为超级主时钟身份。
有关 pmc
命令行选项的完整列表,请参见 man 8 pmc
。
20.3 使用 phc2sys
同步时钟 #
使用 phc2sys
可将系统时钟同步到网卡上的 PTP 硬件时钟 (PHC)。系统时钟被视为从属时钟,而网卡上的时钟则为主时钟。PHC 本身已使用 ptp4l
同步(请参见第 20.2 节 “使用 PTP”)。使用 -s
可按设备或网络接口指定主时钟。使用 -w
可等待直到 ptp4l
进入已同步状态。
>
sudo
phc2sys -s eth0 -w
PTP 按国际原子时 (TAI) 运行,而系统时钟使用的是协调世界时 (UTC)。如果您不指定 -w
来等待 ptp4l
同步,可以使用 -O
来指定 TAI 与 UTC 之间的偏差(以秒为单位):
>
sudo
phc2sys -s eth0 -O -35
也可以将 phc2sys
作为服务运行:
>
sudo
systemctl start phc2sys
在此情况下,phc2sys
将从 /etc/sysconfig/phc2sys
文件读取其选项。有关 phc2sys
选项的详细信息,请参见 man 8 phc2sys
。
要永久启用 phc2sys
服务,请运行以下命令:
>
sudo
systemctl enable phc2sys
要禁用该服务,请运行
>
sudo
systemctl disable phc2sys
20.3.1 校验时间同步 #
当 PTP 时间同步正常工作并且使用了硬件时戳时,ptp4l
和 phc2sys
会定期向系统日志输出包含时间偏差和频率调节的消息。
ptp4l
输出示例:
ptp4l[351.358]: selected /dev/ptp0 as PTP clock ptp4l[352.361]: port 1: INITIALIZING to LISTENING on INITIALIZE ptp4l[352.361]: port 0: INITIALIZING to LISTENING on INITIALIZE ptp4l[353.210]: port 1: new foreign master 00a069.eefe.0b442d-1 ptp4l[357.214]: selected best master clock 00a069.eefe.0b662d ptp4l[357.214]: port 1: LISTENING to UNCALIBRATED on RS_SLAVE ptp4l[359.224]: master offset 3304 s0 freq +0 path delay 9202 ptp4l[360.224]: master offset 3708 s1 freq -28492 path delay 9202 ptp4l[361.224]: master offset -3145 s2 freq -32637 path delay 9202 ptp4l[361.224]: port 1: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED ptp4l[362.223]: master offset -145 s2 freq -30580 path delay 9202 ptp4l[363.223]: master offset 1043 s2 freq -28436 path delay 8972 [...] ptp4l[371.235]: master offset 285 s2 freq -28511 path delay 9199 ptp4l[372.235]: master offset -78 s2 freq -28788 path delay 9204
phc2sys
输出示例:
phc2sys[616.617]: Waiting for ptp4l... phc2sys[628.628]: phc offset 66341 s0 freq +0 delay 2729 phc2sys[629.628]: phc offset 64668 s1 freq -37690 delay 2726 [...] phc2sys[646.630]: phc offset -333 s2 freq -37426 delay 2747 phc2sys[646.630]: phc offset 194 s2 freq -36999 delay 2749
通常,ptp4l
会非常频繁地写入消息。您可以使用 summary_interval
指令降低该频率。其值的表达式为 2 的 N 次幂。例如,要将输出频率降低为每隔 1024(等于 2^10)秒,请将下面一行添加到 /etc/ptp4l.conf
文件。
summary_interval 10
您还可以使用 -u SUMMARY-UPDATES
选项降低 phc2sys
命令的更新频率。
20.4 配置示例 #
本节包含几个 ptp4l
配置示例。这些示例不是完整的配置文件,而是要对特定文件所做更改的精简列表。字符串 ethX 代表设置中的实际网络接口名称。
/etc/sysconfig/ptp4l
:
OPTIONS=”-f /etc/ptp4l.conf -i ethX”
未对分发 /etc/ptp4l.conf
进行更改。
/etc/sysconfig/ptp4l
:
OPTIONS=”-f /etc/ptp4l.conf -i ethX”
/etc/sysconfig/phc2sys
:
OPTIONS=”-s ethX -w”
未对分发 /etc/ptp4l.conf
进行更改。
/etc/sysconfig/ptp4l
:
OPTIONS=”-f /etc/ptp4l.conf -i ethX”
/etc/sysconfig/phc2sys
:
OPTIONS=”-s CLOCK_REALTIME -c ethX -w”
/etc/ptp4l.conf
:
priority1 127
/etc/sysconfig/ptp4l
:
OPTIONS=”-f /etc/ptp4l.conf -i ethX”
/etc/ptp4l.conf
:
priority1 127
20.5 PTP 和 NTP #
NTP 和 PTP 时间同步工具可以共存,可实现双向时间同步。
20.5.1 NTP 到 PTP 的同步 #
使用 chronyd
同步本地系统时钟时,可将 ptp4l
配置为超级主时钟,以便通过 PTP 从本地系统时钟分发时间。在 /etc/ptp4l.conf
中添加 priority1
选项:
[global] priority1 127 [eth0]
然后运行 ptp4l
:
>
sudo
ptp4l -f /etc/ptp4l.conf
使用硬件时戳时,需要通过 phc2sys
将 PTP 硬件时钟同步到系统时钟:
>
sudo
phc2sys -c eth0 -s CLOCK_REALTIME -w
20.5.2 配置 PTP-NTP 网桥 #
在未配备支持 PTP 的交换机或路由器的网络中,如果可以使用高度精确的 PTP 超级主时钟,则计算机可以作为 PTP 从属和第 1 层 NTP 服务器运行。此类计算机需有两个或更多网络接口,并且靠近或者能够直接连接到超级主时钟。这可以确保在网络中实现高度精确的同步。
将 ptp4l
和 phc2sys
程序配置为使用一个网络接口来通过 PTP 同步系统时钟。然后将 chronyd
配置为使用另一接口提供系统时间:
bindaddress 192.0.131.47 hwtimestamp eth1 local stratum 1
默认情况下,当 DHCP 客户端命令 dhclient
收到 NTP 服务器列表时,会将这些服务器添加到 NTP 配置。为防止出现此行为,请设置
NETCONFIG_NTP_POLICY=""
(在 /etc/sysconfig/network/config
文件中)。