跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 系统分析和微调指南 / 使用精确时间协议同步时钟 / 精确时间协议
适用范围 SUSE Linux Enterprise Server 15 SP4

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 安装该软件包。该软件包中包含用于时钟同步的 ptp4lphc2sys 程序。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 值表示测得的与主时钟之间的偏差(以纳秒为单位)。

s0s1s2 指示器显示时钟伺服的不同状态:s0 表示已解锁,s1 表示时钟步进,s2 表示已锁定。如果伺服处于已锁定状态 (s2),并且 pi_offset_const 选项在配置文件中设置为负值,则时钟不会步进,而只会缓慢调整(有关详细信息,请参见 man 8 ptp4l)。

freq 值表示时钟的频率调整(以十亿分率 (ppb) 为单位)。

path delay 值表示从主时钟发送的同步消息的预计延迟(以纳秒为单位)。

端口 0 是用于本地 PTP 管理的 Unix 域套接字。端口 1 是 eth0 接口。

INITIALIZINGLISTENINGUNCALIBRATEDSLAVE 是发生 INITIALIZERS_SLAVEMASTER_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 时间同步正常工作并且使用了硬件时戳时,ptp4lphc2sys 会定期向系统日志输出包含时间偏差和频率调节的消息。

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 代表设置中的实际网络接口名称。

例 20.1︰ 使用软件时戳的从属时钟

/etc/sysconfig/ptp4l

OPTIONS=”-f /etc/ptp4l.conf -i ethX”

未对分发 /etc/ptp4l.conf 进行更改。

例 20.2︰ 使用硬件时戳的从属时钟

/etc/sysconfig/ptp4l

OPTIONS=”-f /etc/ptp4l.conf -i ethX”

/etc/sysconfig/phc2sys

OPTIONS=”-s ethX -w”

未对分发 /etc/ptp4l.conf 进行更改。

例 20.3︰ 使用硬件时戳的主时钟

/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
例 20.4︰ 使用软件时戳的主时钟(一般不建议使用)

/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 服务器运行。此类计算机需有两个或更多网络接口,并且靠近或者能够直接连接到超级主时钟。这可以确保在网络中实现高度精确的同步。

ptp4lphc2sys 程序配置为使用一个网络接口来通过 PTP 同步系统时钟。然后将 chronyd 配置为使用另一接口提供系统时间:

bindaddress 192.0.131.47
hwtimestamp eth1
local stratum 1
注意
注意:NTP 和 DHCP

默认情况下,当 DHCP 客户端命令 dhclient 收到 NTP 服务器列表时,会将这些服务器添加到 NTP 配置。为防止出现此行为,请设置

NETCONFIG_NTP_POLICY=""

(在 /etc/sysconfig/network/config 文件中)。