21 精确时间协议 #
对于网络环境而言,让计算机和其他设备的时钟保持同步和准确至关重要。有多种解决方案可实现同步性和准确性,例如,使用第 38 章 “使用 NTP 同步时间”中所述的广泛应用的网络时间协议 (NTP)。
精确时间协议 (PTP) 支持亚微秒级准确性,较 NTP 更优。PTP 支持分为内核和用户空间。SUSE Linux Enterprise Server 中的内核包含对网络驱动程序提供的 PTP 时钟的支持。
21.1 PTP 简介 #
PTP 管理的时钟遵循主从层次结构。从属时钟将同步到其主时钟。层次结构由每个时钟上运行的最佳主时钟 (BMC) 算法更新。只有一个端口的时钟可以是主时钟也可以是从属时钟。此类时钟称为普通时钟 (OC)。具有多个端口的时钟可以在一个端口上为主时钟,在另一个端口上为从属时钟。此类时钟称为边界时钟 (BC)。顶层主时钟称为超级主时钟。超级主时钟可与全球定位系统 (GPS) 同步。这样,不同的网络便能够以高准确度实现同步。
硬件支持是 PTP 的主要优势。多种网络交换机和网络接口控制器 (NIC) 都支持 PTP。虽然可以在网络内部使用启用非 PTP 的硬件,但为所有 PTP 时钟之间的网络组件启用 PTP 硬件可实现最大的准确性。
21.1.1 PTP Linux 实施 #
在 SUSE Linux Enterprise Server 上,由 linuxptp
软件包提供 PTP 实施。使用 zypper
install linuxptp
安装该软件包:其中包含用于时钟同步的 ptp4l
和 phc2sys
程序。ptp4l
实施了 PTP 边界时钟和普通时钟。如果启用硬件时戳,ptp4l
会将 PTP 硬件时钟同步到主时钟。如果使用软件时戳,它会将系统时钟同步到主时钟。仅当使用硬件时戳将系统时钟同步到网络接口卡 (NIC) 上的 PTP 硬件时钟时,才需要 phc2sys
。
21.2 使用 PTP #
21.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
21.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
接口。
比如,发生 INITIALIZE
、RS_SLAVE
和 MASTER_CLOCK_SELECTED
事件时,端口状态就会变成 INITIALIZING
、LISTENING
、UNCALIBRATED
和 SLAVE
。当端口状态从 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
21.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
。
21.2.4 延迟测量 #
ptp4l
通过两种方法测量时间延迟:对等式 (P2P) 或端到端 (E2E)。
- P2P
此方法使用
-P
指定。它可以更快地对网络环境中的更改做出反应,并可更准确地测量延迟。仅在每个端口都会与另一个端口交换 PTP 消息的网络中才会使用此方法。P2P 需受到通讯路径中所有硬件的支持。
- E2E
此方法使用
-E
指定。此为默认设置。- 自动选择方法
此方法使用
-A
指定。自动选项以 E2E 模式启动ptp4l
,如果收到了对等延迟请求,则会切换为 P2P 模式。
单个 PTP 通讯路径上的所有时钟必须使用相同的方法来测量时间延迟。如果在使用 E2E 机制的端口上收到了对等延迟请求,或者在使用 P2P 机制的端口上收到了 E2E 延迟请求,则会列显警告。
21.2.5 PTP 管理客户端:pmc
#
可以使用 pmc
客户端获取有关 ptp41
的更详细信息。pmc 从标准输入或命令行读取按名称和管理 ID 指定的操作。然后通过选定的传输方式发送操作,并列显收到的任何答复。pmc 支持以下三个操作: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 MANAGEMENT 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
。
21.3 使用 phc2sys
同步时钟 #
使用 phc2sys
可将系统时钟同步到网卡上的 PTP 硬件时钟 (PHC)。系统时钟被视为从属时钟,而网卡上的时钟则为主时钟。PHC 本身将与 ptp4l
同步(请参见第 21.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
21.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
命令的更新频率。
21.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
21.5 PTP 和 NTP #
NTP 和 PTP 时间同步工具可以共存,可实现双向时间同步。
21.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
21.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
文件中)。