精确时间协议 - PTP

Cumulus Linux 支持 IEEE 1588-2008 精确时间协议 (PTPv2),该协议定义了跨基于数据包的网络(包括以太网交换机和 IP 路由器)同步各种设备时钟的算法和方法。

PTP 能够实现亚微秒级的精度。时钟采用主从层级结构,从时钟与它们的主时钟同步,而它们的主时钟又可以是它们自身主时钟的从时钟。最佳主时钟 (BMC) 算法在每个时钟上运行,自动创建和更新层级结构。Grand Master 时钟是顶层主时钟。为了提供高精度,全球定位系统 (GPS) 时间源通常同步 Grand Master 时钟。

在以下示例中

  • 边界时钟 2 从 PTP 从端口上的 Master 1(Grand Master)接收时间,设置其时钟,并将时间从 PTP 主端口向下传递到边界时钟 1。
  • 边界时钟 1 在 PTP 从端口上接收时间,设置其时钟,并通过 PTP 主端口将时间向下传递到接收时间的主机。

Cumulus Linux 和 PTP

Cumulus Linux 中的 PTP 使用 linuxptp 软件包,该软件包包含以下程序

  • ptp4l 提供 PTP 协议和状态机
  • phc2sys 提供 PTP 硬件时钟和系统时钟同步
  • timemaster 提供系统时钟和 PTP 同步

Cumulus Linux 支持

  • 仅 PTP 边界时钟模式(交换机向下游服务器提供时间;它是更高级别时钟的从时钟,也是下游时钟的主时钟)。
  • UDPv4、UDPv6 和 802.3 封装。
  • 每个网络仅单个 PTP 域。
  • 第 3 层接口、第 3 层绑定、trunk 端口和属于 VLAN 的交换机端口上的 PTP。
  • 多播、单播和混合消息模式。
  • 仅端到端延迟机制。Cumulus Linux 不支持点对点。
  • 单步和双步时钟时间戳模式。
  • PTP 数据包的硬件时间戳。这允许 PTP 避免消息传输延迟引起的不准确性,并提高时间同步的准确性。

  • 您不能在交换机上同时运行 PTP 和 NTP。
  • PTP 仅支持默认 VRF。
  • NVIDIA SN5400 交换机上的 PTP 处于 BETA 阶段
  • 由于硬件限制,1G 链路的 PTP 精度可能较低。如果您的应用程序需要 PTP 的高精度,请使用更高的链路速度。

基本配置

基本 PTP 配置需要您

  • 禁用 NTP 并删除默认 NTP 配置。
  • 在交换机上启用 PTP。
  • 在至少一个接口上配置 PTP;这可以是第 3 层路由端口、交换机端口或 trunk 端口。您无需指定哪个是主接口,哪个是从接口;PTP 最佳主时钟算法 (BMCA) 确定主时钟和从时钟。

如果您使用 Linux 命令配置 PTP,您还必须启用 PTP 时间戳;请参阅下面的 Linux 步骤 1。当您在交换机上启用 PTP 时,NVUE 会启用时间戳。

下面显示的基本配置使用默认 PTP 设置

要配置其他设置(例如 PTP 配置文件、域、优先级和 DSCP、PTP 接口传输模式和计时器以及 PTP 监控),请参阅下面的可选配置部分。

禁用 NTP

删除交换机上的默认 NTP 配置

cumulus@switch:~$ nv unset service ntp mgmt server 0.cumulusnetworks.pool.ntp.org
cumulus@switch:~$ nv unset service ntp mgmt server 1.cumulusnetworks.pool.ntp.org
cumulus@switch:~$ nv unset service ntp mgmt server 2.cumulusnetworks.pool.ntp.org
cumulus@switch:~$ nv unset service ntp mgmt server 3.cumulusnetworks.pool.ntp.org
cumulus@switch:~$ nv config apply

停止并禁用管理 VRF 中的 NTP 服务

cumulus@switch:~$ sudo systemctl stop ntpsec@mgmt.service
cumulus@switch:~$ sudo systemctl disable ntpsec@mgmt.service
  1. 编辑 /etc/ntpsec/ntp.conf 文件以注释掉默认 NTP 配置

    cumulus@switch:~$ sudo nano /etc/ntpsec/ntp.conf
    # server 0.cumulusnetworks.pool.ntp.org iburst
    # server 1.cumulusnetworks.pool.ntp.org iburst
    # server 2.cumulusnetworks.pool.ntp.org iburst
    # server 3.cumulusnetworks.pool.ntp.org iburst
    
    1. 停止并禁用管理 VRF 中的 NTP 服务
    cumulus@switch:~$ sudo systemctl stop ntpsec@mgmt.service
    cumulus@switch:~$ sudo systemctl disable ntpsec@mgmt.service
    

配置 PTP

NVUE nv set service ptp 命令需要实例编号(以下示例命令中为 1)以进行管理。

当您使用 nv set service ptp <instance> enable on 命令启用 PTP 服务时,NVUE 会重启 switchd 服务,这会导致所有网络端口重置,并重置交换机硬件配置。

cumulus@switch:~$ nv set service ptp 1 enable on
cumulus@switch:~$ nv set interface swp1 ip address 10.0.0.9/32
cumulus@switch:~$ nv set interface swp2 ip address 10.0.0.10/32
cumulus@switch:~$ nv set interface swp1 ptp enable on
cumulus@switch:~$ nv set interface swp2 ptp enable on
cumulus@switch:~$ nv config apply

该配置写入 /etc/ptp4l.conf 文件。

第 2 层传输

cumulus@switch:~$ nv set service ptp 1 enable on
cumulus@switch:~$ nv set bridge domain br_default
cumulus@switch:~$ nv set bridge domain br_default type vlan-aware
cumulus@switch:~$ nv set bridge domain br_default vlan 10-30
cumulus@switch:~$ nv set bridge domain br_default vlan 10 ptp enable on
cumulus@switch:~$ nv set interface swp1 bridge domain br_default
cumulus@switch:~$ nv set interface swp1 bridge domain br_default vlan 10
cumulus@switch:~$ nv set interface swp1 bridge domain br_default vlan 20
cumulus@switch:~$ nv set interface swp1 ptp transport 802.3
cumulus@switch:~$ nv set interface swp1 ptp enable on
cumulus@switch:~$ nv config apply

第 3 层传输

cumulus@switch:~$ nv set service ptp 1 enable on
cumulus@switch:~$ nv set bridge domain br_default
cumulus@switch:~$ nv set bridge domain br_default type vlan-aware
cumulus@switch:~$ nv set bridge domain br_default vlan 10-30
cumulus@switch:~$ nv set bridge domain br_default vlan 10 ptp enable on
cumulus@switch:~$ nv set interface vlan10 type svi
cumulus@switch:~$ nv set interface vlan10 ip address 10.1.10.2/24
cumulus@switch:~$ nv set interface vlan10 base-interface br_default
cumulus@switch:~$ nv set interface vlan10 ptp enable on
cumulus@switch:~$ nv set interface swp1 bridge domain br_default
cumulus@switch:~$ nv set interface swp1 bridge domain br_default vlan 10
cumulus@switch:~$ nv set interface swp1 bridge domain br_default vlan 20
cumulus@switch:~$ nv set interface swp1 ptp enable on
cumulus@switch:~$ nv config apply

  • 您只能配置一个地址;IPv4 或 IPv6。
  • 对于 IPv6,将 trunk 端口传输模式设置为 IPv6。
  • 第 2 层和第 3 层 PTP 传输不能共存。
  • 当您配置 PTP 第 3 层传输时,您必须配置
    • 用于基于 VLAN 路由的 SVI。
    • 基本接口配置,以确保数据包正确转发。

该配置写入 /etc/ptp4l.conf 文件。

第 2 层传输

cumulus@switch:~$ nv set service ptp 1 enable on
cumulus@switch:~$ nv set bridge domain br_default
cumulus@switch:~$ nv set bridge domain br_default type vlan-aware
cumulus@switch:~$ nv set bridge domain br_default vlan 10-30
cumulus@switch:~$ nv set bridge domain br_default vlan 10 ptp enable on
cumulus@switch:~$ nv set interface swp2 bridge domain br_default
cumulus@switch:~$ nv set interface swp2 bridge domain br_default access 10
cumulus@switch:~$ nv set interface swp2 ptp transport 802.3
cumulus@switch:~$ nv set interface swp2 ptp enable on
cumulus@switch:~$ nv config apply

第 3 层传输

cumulus@switch:~$ nv set service ptp 1 enable on
cumulus@switch:~$ nv set bridge domain br_default
cumulus@switch:~$ nv set bridge domain br_default type vlan-aware
cumulus@switch:~$ nv set bridge domain br_default vlan 10-30
cumulus@switch:~$ nv set bridge domain br_default vlan 10 ptp enable on
cumulus@switch:~$ nv set interface vlan10 type svi
cumulus@switch:~$ nv set interface vlan10 ip address 10.1.10.2/24
cumulus@switch:~$ nv set interface vlan10 base-interface br_default
cumulus@switch:~$ nv set interface swp2 bridge domain br_default
cumulus@switch:~$ nv set interface swp2 bridge domain br_default access 10
cumulus@switch:~$ nv set interface swp2 ptp enable on
cumulus@switch:~$ nv config apply

  • 您只能配置一个地址;IPv4 或 IPv6。
  • 对于 IPv6,将 trunk 端口传输模式设置为 IPv6。
  • 当您在网桥端口上启用 PTP 时,您还必须使用 nv set bridge domain <domain> vlan <vlan-id> ptp enable on 命令在为端口配置的 VLAN 上启用 PTP。
  • 第 2 层和第 3 层 PTP 传输不能共存。
  • 当您配置 PTP 第 3 层传输时,您必须配置
    • 用于基于 VLAN 路由的 SVI。
    • 基本接口配置,以确保数据包正确转发。

该配置写入 /etc/ptp4l.conf 文件。

  1. 配置 NVUE 以停止管理 PTP 配置文件
cumulus@switch:~$ nv set system config apply ignore /etc/linuxptp/phc2sys.conf
cumulus@switch:~$ nv set system config apply ignore /etc/ptp4l.conf
cumulus@switch:~$ nv set system config apply ignore /etc/cumulus/switchd.d/ptp.conf
cumulus@switch:~$ nv config apply
  1. 编辑 /etc/cumulus/switchd.d/ptp.conf 文件,将 ptp.timestamping 参数设置为 TRUE

    cumulus@switch:~$ sudo nano /etc/cumulus/switchd.d/ptp.conf
    ...
    ptp.timestamping     TRUE
    ...
    
  2. 重启 switchd 服务

    cumulus@switch:~$ sudo systemctl restart switchd.service
    

重启 switchd 服务会导致所有网络端口重置,并重置交换机硬件配置。

  1. 编辑 /etc/ptp4l.conf 文件的 Default interface options 部分,以配置您要用于 PTP 的交换机上的接口。
cumulus@switch:~$ sudo nano /etc/ptp4l.conf
...
#
# Default interface options
#
time_stamping                  hardware
# Interfaces in which ptp should be enabled
# these interfaces should be routed ports
# if an interface does not have an ip address
# the ptp4l will not work as expected.
[swp1]
udp_ttl                 1
masterOnly              0
delay_mechanism         E2E
[swp2]
udp_ttl                 1
masterOnly              0
delay_mechanism         E2E

对于 trunk VLAN,将 VLAN 配置添加到交换机端口节:将 l2_mode 设置为 trunk,将 vlan_intf 设置为 VLAN 接口,并将 src_ip 设置为 VLAN 接口的 IP 地址

[swp1]
l2_mode                 trunk
vlan_intf               vlan10
src_ip                  10.1.10.2
udp_ttl                 1
masterOnly              0
delay_mechanism         E2E
network_transport       RAWUDPv4

对于交换机端口 VLAN,将 VLAN 配置添加到交换机端口节:将 l2_mode 设置为 access,将 vlan_intf 设置为 VLAN 接口,并将 src_ip 设置为 VLAN 接口的 IP 地址

[swp2]
l2_mode                 access
vlan_intf               vlan10
src_ip                  10.1.10.2
udp_ttl                 1
masterOnly              0
delay_mechanism         E2E
network_transport       RAWUDPv4
  1. 编辑 /etc/linuxptp/phc2sys.conf 文件以添加以下参数

    cumulus@switch:~$ sudo nano /etc/linuxptp/phc2sys.conf
    # phc2sys is enabled
    [global]
    logging_level         6
    path_trace_enabled    0
    use_syslog            1
    verbose               0
    domainNumber          0
    
  2. 启用并启动 ptp4lphc2sys 服务

    cumulus@switch:~$ sudo systemctl enable ptp4l.service phc2sys.service
    cumulus@switch:~$ sudo systemctl start ptp4l.service phc2sys.service
    

全局配置

Cumulus Linux 提供了多种方法来修改默认的基本全局配置。您可以

  • 使用配置文件。
  • 使用 NVUE 命令直接修改参数。
  • 修改 Linux /etc/ptp4l.conf 文件。

当设置了预定义配置文件时,NVUE 不允许您配置全局参数。当正在使用预定义配置文件时,请勿编辑 Linux /etc/ptp4l.conf 文件来修改全局参数。有关配置文件的信息,请参阅 PTP 配置文件

时钟域

PTP 域允许不同的独立计时系统存在于同一网络中,而不会相互混淆。PTP 域是网络或网络的一部分,其中所有时钟都同步。每个 PTP 消息都包含一个域号。PTP 实例仅在一个域中工作,并忽略包含不同域号的消息。Cumulus Linux 在系统中仅支持一个域。

您可以指定多个 PTP 时钟域。PTP 将每个域与其他域隔离,以便每个域都是不同的 PTP 网络。您可以指定介于 0 和 127 之间的数字。

以下示例命令在未设置配置文件时配置域 3

cumulus@switch:~$ nv set service ptp 1 domain 3
cumulus@switch:~$ nv config apply

编辑 /etc/ptp4l.conf 文件的 Default Data Set 部分以更改 domainNumber 设置,然后重启 ptp4l 服务。

cumulus@switch:~$ sudo nano /etc/ptp4l.conf
[global]
#
# Default Data Set
#
slaveOnly               0
priority1               128
priority2               128
domainNumber            3
...
cumulus@switch:~$ sudo systemctl restart ptp4l.service

时钟时间戳模式

Cumulus Linux 交换机提供以下时钟时间戳模式

  • 单步,其中 PTP 将 Sync 数据包出端口的精确时间添加到数据包。无需后续数据包。
  • 双步,其中 PTP 记录 Sync 数据包出端口的精确时间,并在单独的后续消息中发送它。

单步模式显著减少了 PTP 消息的数量。双步模式是默认配置。

Cumulus Linux 在 Spectrum-2 及更高版本上支持单步模式。

以下示例命令在未设置配置文件时配置单步模式

cumulus@switch:~$ nv set service ptp 1 two-step off
cumulus@switch:~$ nv config apply

要将时钟时间戳模式恢复为默认设置(双步模式),请运行 nv set service ptp 1 two-step on 命令。

要为基于 IEEE1588、ITU 8275-1 或 ITU 8275-2 的自定义配置文件设置时钟时间戳模式,请运行 nv set service ptp <instance-id> profile <profile-id> two-step 命令。例如,要为名为 CUSTOM1 的自定义配置文件设置单步模式,请运行 nv set service ptp 1 profile CUSTOM1 two-step off 命令。

编辑 /etc/ptp4l.conf 文件的 Default Data Set 部分,将 twoStepFlag 设置更改为 0,然后重启 ptp4l 服务。

cumulus@switch:~$ sudo nano /etc/ptp4l.conf
[global]
#
# Default Data Set
#
slaveOnly               0
priority1               254
priority2               254
domainNumber            3

twoStepFlag             0
dscp_event              43
dscp_general            43
udp6_scope              0x0E
...
cumulus@switch:~$ sudo systemctl restart ptp4l.service

要将时钟时间戳模式恢复为默认设置(双步模式),请将 twoStepFlag 设置更改为 1。

PTP 优先级

BMC 根据以下顺序的标准选择 PTP 主时钟

  1. 优先级 1
  2. 时钟等级
  3. 时钟精度
  4. 时钟方差
  5. 优先级 2
  6. 端口 ID

使用 PTP 优先级选择最佳主时钟。您可以设置优先级 1 和 2

  • 优先级 1 覆盖时钟等级和质量选择标准,以选择最佳主时钟。
  • 优先级 2 在相同的冗余 Grand Master 中识别主时钟和备份时钟。

优先级 1 和优先级 2 的范围都在 0 到 255 之间。默认优先级为 128。对于边界时钟,请使用大于 128 的数字。较低的优先级优先应用。

以下示例命令在未设置配置文件时将优先级 1 和优先级 2 设置为 200

cumulus@switch:~$ nv set service ptp 1 priority1 200
cumulus@switch:~$ nv set service ptp 1 priority2 200
cumulus@switch:~$ nv config apply

编辑 /etc/ptp4l.conf 文件的 Default Data Set 部分以更改 priority1 和/或 priority2 设置,然后重启 ptp4l 服务。

cumulus@switch:~$ sudo nano /etc/ptp4l.conf
[global]
#
# Default Data Set
#
slaveOnly               0
priority1               200
priority2               200
domainNumber            3
...
cumulus@switch:~$ sudo systemctl restart ptp4l.service

噪声传递伺服

ITU-T 噪声传递规定了以下关键要素来测量、测试和分类时钟的精度

  • 噪声生成—时钟输出中相对于 PRTC 的抖动和漂移噪声。
  • 噪声容限—时钟在切换到另一个稳定源之前可以容忍多少噪声。
  • 噪声传递—平滑输入噪声,以便噪声不会在时钟网络中累积和增加。
  • 瞬态响应—时钟对瞬态的响应。
  • 保持—时钟在失去输入参考信号后保持其输出的时间间隔。

Cumulus Linux PTP 有一个选项可以使用专门设计用于处理 ITU-T 噪声传递规范的伺服。当您使用此选项时,PHC 噪声传递伺服会解决来自主时钟的抖动和漂移噪声。

  • 要使用噪声传递伺服,您需要在交换机和 PTP 接口上启用 SyncE。
  • Cumulus Linux 在支持 SyncE 的 Spectrum ASIC 上支持噪声传递伺服。
  • NVIDIA 建议您将噪声传递伺服与 PTP 电信配置文件一起使用。如果您使用其他配置文件或选择不使用配置文件,请确保将同步间隔设置为 -3 或更佳。
  • 当您启用噪声传递伺服时,PTP 日志报告偏移量为每两秒一次,而不是每秒一次。

要启用噪声传递伺服

以下示例启用 PTP,将配置文件设置为 default-itu-8275-1,启用 SyncE,在 swp3 上启用 PTP,并启用噪声传递伺服。

cumulus@switch:~$ nv set service ptp 1 enable on
cumulus@switch:~$ nv set service ptp 1 current-profile default-itu-8275-1
cumulus@switch:~$ nv set system synce enable on
cumulus@switch:~$ nv set interface swp3 ptp enable on
cumulus@switch:~$ nv set service ptp 1 servo noise-transfer
cumulus@switch:~$ nv config apply

编辑 /etc/ptp4l.conf/etc/firefly_servo/servo.conf 文件;请参阅以下示例。

cumulus@switch:~$ sudo nano /etc/ptp4l.conf
[global]
#
# Default Data Set
#
slaveOnly                      0
free_running                   1
slave_event_monitor            /var/run/servo_slave_event_monitor
priority1                      128
priority2                      128
domainNumber                   24

twoStepFlag                    1
dscp_event                     46
dscp_general                   46
network_transport              L2
dataset_comparison             G.8275.x
G.8275.defaultDS.localPriority 128
ptp_dst_mac                    01:80:C2:00:00:0E
#
# Port Data Set
#
logAnnounceInterval            -3
logSyncInterval                -4
logMinDelayReqInterval         -4
announceReceiptTimeout         3
delay_mechanism                E2E
 
offset_from_master_min_threshold   -50
offset_from_master_max_threshold   50
mean_path_delay_threshold          200
tsmonitor_num_ts                   100
tsmonitor_num_log_sets             2
tsmonitor_num_log_entries          4
tsmonitor_log_wait_seconds         1
#
# Run time options
#
logging_level                  6
path_trace_enabled             0
use_syslog                     1
verbose                        0
summary_interval               0
#
# servo parameters
#
pi_proportional_const          0.000000
pi_integral_const              0.000000
pi_proportional_scale          0.700000
pi_proportional_exponent       -0.300000
pi_proportional_norm_max       0.700000
pi_integral_scale              0.300000
pi_integral_exponent           0.400000
pi_integral_norm_max           0.300000
first_step_threshold           0.000020
step_threshold                 0.000000025
servo_offset_threshold         20
servo_num_offset_values        10
write_phase_mode               1
max_frequency                  50000000
sanity_freq_limit              0
#
# Default interface options
#
time_stamping                  hardware

[swp3]
udp_ttl                      1
masterOnly                   0
delay_mechanism              E2E
cumulus@switch:~$ sudo nano /etc/firefly_servo/servo.conf
[global]
free_running                        0
domainNumber                        24

offset_from_master_min_threshold    -50
offset_from_master_max_threshold    50

# Debugging & Logging
doca_logging_level                  50

init_max_time_adjustment            0
max_time_adjustment                 1500
hold_over_timer                     0
# Sampling Window & servo logic
servo_window_timer                  3000
servo_window_min_samples            10
servo_num_offset_values             5

要显示噪声传递伺服配置设置,请运行 nv show service ptp <instance-id> servo 命令

cumulus@switch:~$ nv show service ptp 1 servo
       operational  applied
-----  -----------  --------------
servo               noise-transfer

忽略源端口 ID

如果主时钟禁用了 Announce,您可以禁用 SYNC、Follow Up 和 Delay Response PTP 消息中的源端口 ID 检查。在 PTP 的罕见实现中,禁用源端口 ID 检查也很有用,在这些实现中,主时钟会更改上述消息中源端口 ID,使其与 Announce 上发送的端口 ID 不同。

要禁用源端口 ID 检查,请运行 nv set service ptp 1 ignore-source-id on 命令

cumulus@switch:~$ nv set service ptp 1 ignore-source-id on
cumulus@switch:~$ nv config apply

要重新启用源端口 ID 检查,请运行 nv set service ptp 1 ignore-source-id off 命令。

要禁用源端口 ID 检查,请编辑 /etc/ptp4l.conf 文件以添加 ignore_source_id 1 参数,然后重启 ptp4l 服务。

cumulus@switch:~$ sudo nano /etc/ptp4l.conf
[global]
#
# Default Data Set
#
slaveOnly                      0
priority1                      128
priority2                      128
domainNumber                   0
ignore_source_id               1
...
cumulus@switch:~$ sudo systemctl restart ptp4l.service

多播 MAC 地址

以太网上的 PTP 使用以下类型的多播 MAC 地址

  • 转发,这是一个标准的 MAC 地址,交换机和网桥会对其进行洪泛。处理这些多播消息的节点可能是不支持 PTP 的中间节点。这是默认的多播 MAC 地址类型,使用 01-1B-19-00-00-00 MAC。
  • 非转发,这是保留的 802.1 Q 地址 01-80-C2-00-00-0E。Cumulus Linux 不会在网桥上转发此地址。

对于电信配置文件 ITU 8275-1,将多播 MAC 地址设置为非转发。

要将多播 MAC 地址设置为非转发

cumulus@switch:~$ nv set service ptp 1 multicast-mac non-forwarding
cumulus@switch:~$ nv config apply

要将多播 MAC 地址设置为转发,请运行 nv unset service ptp 1 multicast-mac non-forwarding 命令。

要将多播 MAC 地址设置为非转发,请编辑 /etc/ptp4l.conf 文件以添加 ptp_dst_mac 参数,然后重启 ptp4l 服务。

cumulus@switch:~$ sudo nano /etc/ptp4l.conf
...
#
# Run time options
#
logging_level                  6
path_trace_enabled             0
use_syslog                     1
verbose                        0
summary_interval               0
ptp_dst_mac                    01:80:C2:00:00:0E
cumulus@switch:~$ sudo systemctl restart ptp4l.service

可选全局配置

可选的全局 PTP 配置包括配置差分服务代码点 (DSCP)。您可以为本地发起的所有 PTP IPv4 数据包配置 DSCP 值。您可以设置介于 0 和 63 之间的值。

cumulus@switch:~$ nv set service ptp 1 ip-dscp 22
cumulus@switch:~$ nv config apply

编辑 /etc/ptp4l.conf 文件的 Default Data Set 部分,以更改触发从时钟读取时间戳的 PTP 消息的 dscp_event 设置,以及携带命令、响应、信息或时间戳的 PTP 消息的 dscp_general 设置。

保存 /etc/ptp4l.conf 文件后,重启 ptp4l 服务。

cumulus@switch:~$ sudo nano /etc/ptp4l.conf
[global]
#
# Default Data Set
#
slaveOnly               0
priority1               200
priority2               200
domainNumber            3

twoStepFlag             1
dscp_event              22
dscp_general            22
udp6_scope              0x0E
...
cumulus@switch:~$ sudo systemctl restart ptp4l.service

PTP 接口配置

Cumulus Linux 提供了多种方法来修改默认的基本接口配置。您可以

  • 使用配置文件
  • 使用 NVUE 命令直接修改参数
  • 修改 Linux /etc/ptp4l.conf 配置文件。

当正在使用配置文件时,请避免使用 NVUE 或在 Linux 配置文件中配置以下接口配置参数,以使接口保留其配置文件设置。

传输模式

默认情况下,Cumulus Linux 将 PTP 消息封装在 UDP IPv4 帧中。要在 UDP IPv6 帧中封装接口上的 PTP 消息

cumulus@switch:~$ nv set interface swp1 ptp transport ipv6
cumulus@switch:~$ nv config apply

编辑 /etc/ptp4l.conf 文件的 Default interface options 部分,以更改接口的 network_transport 设置,然后重启 ptp4l 服务。

cumulus@switch:~$ sudo nano /etc/ptp4l.conf
...
# Default interface options
#
time_stamping           hardware

# Interfaces in which ptp should be enabled
# these interfaces should be routed ports
# if an interface does not have an ip address
# the ptp4l will not work as expected.

[swp1]
udp_ttl                 1
masterOnly              0
delay_mechanism         E2E
network_transport       RAWUDPv6

[swp2]
udp_ttl                 1
masterOnly              0
delay_mechanism         E2E
network_transport       RAWUDPv6
...
cumulus@switch:~$ sudo systemctl restart ptp4l.service

消息模式

Cumulus Linux 支持以下 PTP 消息模式

  • 多播,其中端口订阅两个多播地址,一个用于带时间戳的事件消息,另一个用于不带时间戳的通用消息。主时钟发送的 Sync 消息是多播消息;所有从端口都会收到此消息,因为从端口需要来自主时钟的时间。从端口反过来向主时钟生成延迟请求。这是一个多播消息,消息的预期主时钟和其他从端口都会收到。同样,除了预期的从端口外,所有从端口都会收到主时钟的延迟响应。接收到非预期延迟请求和响应的从端口需要丢弃数据包。如果存在数百个从端口,这可能会影响网络带宽。
  • 混合,其中 Sync 和 Announce 消息是多播消息,但 Delay Request 和 Response 消息是单播消息。这避免了在多播消息模式中看到的每个从端口都看到来自每个其他从端口的延迟请求和响应的问题。
  • 单播,其中您将端口配置为单播客户端或服务器。请参阅 单播模式

多播模式是默认设置;当您在接口上启用 PTP 时,消息模式为多播。

要将 swp1 上的消息模式更改为混合

cumulus@switch:~$ nv set interface swp1 ptp mixed-multicast-unicast on
cumulus@switch:~$ nv config apply

要将 swp1 上的消息模式改回默认的多播设置

cumulus@switch:~$ nv set interface swp1 ptp mixed-multicast-unicast off
cumulus@switch:~$ nv config apply

编辑 /etc/ptp4l.conf 文件的 Default interface options 部分,在接口下添加 hybrid_e2e 1 行,然后重启 ptp4l 服务。

cumulus@switch:~$ sudo nano /etc/ptp4l.conf
...
# Default interface options
#
time_stamping           hardware

# Interfaces in which ptp should be enabled
# these interfaces should be routed ports
# if an interface does not have an ip address
# the ptp4l will not work as expected.

[swp1]
hybrid_e2e              1
...
cumulus@switch:~$ sudo systemctl restart ptp4l.service

要将消息模式改回默认的多播设置,请删除接口下的 hybrid_e2e 行,然后重启 ptp4l 服务。

PTP 接口计时器

您可以为 PTP 消息设置以下计时器。

计时器描述
announce-interval连续 Announce 消息之间的平均间隔。以秒为单位指定值的 2 的幂。
announce-timeout在发生超时之前必须发生但未收到 Announce 消息的 announce 间隔数。确保此值长于网络中的 announce-interval。
delay-req-interval连续 Delay Required 消息之间允许的最小平均时间间隔。
sync-interval接口上 PTP 同步消息之间的间隔。以秒为单位指定值的 2 的幂。
  • 要使用 NVUE 设置计时器,请运行 nv set interface <interface> ptp timers <timer> <value> 命令。
  • 要使用 Linux 命令设置计时器,请编辑 /etc/ptp4l.conf 文件并在 Default interface options 部分中设置计时器。

以下示例将 swp1 上连续 Announce 消息之间的 announce 间隔设置为 -1。

cumulus@switch:~$ nv set interface swp1 ptp timers announce-interval -1
cumulus@switch:~$ nv config apply

以下示例将 swp1 上多播消息的平均 sync-interval 设置为 -5。

cumulus@switch:~$ nv set interface swp1 ptp timers sync-interval -5
cumulus@switch:~$ nv config apply

编辑 /etc/ptp4l.conf 文件的 Default interface options 部分

  • 要将 swp1 上连续 Announce 消息之间的 announce 间隔设置为 -1,请在接口节下添加 logAnnounceInterval -1
  • 要将 swp1 上多播消息的平均 sync-interval 设置为 -5,请在接口节下添加 logSyncInterval -5

编辑 /etc/ptp4l.conf 文件后,重启 ptp4l 服务。

cumulus@switch:~$ sudo nano /etc/ptp4l.conf
...
# Default interface options
#
time_stamping           hardware

# Interfaces in which ptp should be enabled
# these interfaces should be routed ports
# if an interface does not have an ip address
# the ptp4l will not work as expected.

[swp1]
logAnnounceInterval     -1
logSyncInterval         -5
udp_ttl                 20
masterOnly              1
delay_mechanism         E2E
...
cumulus@switch:~$ sudo systemctl restart ptp4l.service

可选 PTP 接口配置

强制主模式

默认情况下,PTP 端口处于自动模式,其中 BMC 算法确定端口的状态。

您可以在 PTP 端口上配置强制主模式,使其始终处于主状态,并且 BMC 算法不适用于此端口。此端口将忽略其接收到的任何 Announce 消息。

cumulus@switch:~$ nv set interface swp1 ptp forced-master on
cumulus@switch:~$ nv config apply

编辑 /etc/ptp4l.conf 文件的 Default interface options 部分,以更改接口的 masterOnly 设置,然后重启 ptp4l 服务。

cumulus@switch:~$ sudo nano /etc/ptp4l.conf
...
# Default interface options
#
time_stamping           hardware

# Interfaces in which ptp should be enabled
# these interfaces should be routed ports
# if an interface does not have an ip address
# the ptp4l will not work as expected.

[swp1]
udp_ttl                 1
masterOnly              1
delay_mechanism         E2E
...
cumulus@switch:~$ sudo systemctl restart ptp4l.service

PTP 消息的 TTL

要限制 PTP 消息可以传输的跃点数,请在 PTP 接口上设置 TTL。您可以设置介于 1 和 255 之间的值。

cumulus@switch:~$ nv set interface swp1 ptp ttl 20
cumulus@switch:~$ nv config apply

编辑 /etc/ptp4l.conf 文件的 Default interface options 部分,以更改接口的 udp_ttl 设置,然后重启 ptp4l 服务。

cumulus@switch:~$ sudo nano /etc/ptp4l.conf
...
# Default interface options
#
time_stamping           hardware

# Interfaces in which ptp should be enabled
# these interfaces should be routed ports
# if an interface does not have an ip address
# the ptp4l will not work as expected.

[swp1]
udp_ttl                 20
masterOnly              1
delay_mechanism         E2E
...
cumulus@switch:~$ sudo systemctl restart ptp4l.service

单播模式

Cumulus Linux 支持单播模式,以便单播客户端可以与服务器执行单播发现和协商。与默认的多播模式(服务器(主时钟)和客户端(从时钟)都开始发送 announce 请求并相互发现)不同,在单播模式下,客户端首先发送单播传输请求。客户端将其发送到其单播主表中每个服务器地址。服务器使用接受或拒绝来响应请求。

全局单播配置

单播客户端需要一个单播主时钟表来进行单播协商;您必须在交换机上配置至少一个单播主时钟表。

全局配置单播

  • 设置单播表 ID;这是一个唯一的 ID,用于标识单播主时钟表。
  • 设置单播主时钟地址。您可以设置多个单播主时钟地址,可以是 IPv4、IPv6 或 MAC 地址。
  • 可选:设置单播主时钟查询间隔,即请求 Announce 消息的平均间隔。以 2 的幂次方秒为单位指定此值。您可以指定介于 -3 到 4 之间的值。默认值为 -0(2 的 0 次方)。
    cumulus@switch:~$ nv set service ptp 1 unicast-master 1 address 10.10.10.1
    cumulus@switch:~$ nv set service ptp 1 unicast-master 1 query-interval 4
    cumulus@switch:~$ nv set interface swp1 ptp unicast-master-table-id 1
    cumulus@switch:~$ nv config apply
    
    1. /etc/ptp4l.conf 文件的 # Default interface options 部分末尾添加以下行

      cumulus@switch:~$ sudo nano /etc/ptp4l.conf
      ...
      # Default interface options
      ...
      [unicast_master_table]
      table_id               1
      logQueryInterval       4
      RAWUDPv4                  10.10.10.1
      ...
      
    2. 重启 ptp4l 服务。

      cumulus@switch:~$ sudo systemctl restart ptp4l.service
      

接口单播配置

对于接口单播配置,除了在接口上启用 PTP 之外,您还需要将 PTP 接口配置为单播客户端或单播服务器。

当在交换机上配置多个 PTP 接口作为单播客户端时,您必须在每个设置为单播客户端的接口上配置一个单播表 ID。每个客户端必须具有不同的表 ID。

要将 PTP 接口配置为单播客户端

cumulus@switch:~$ nv set interface swp1 ptp unicast-service-mode client
cumulus@switch:~$ nv config apply
  1. /etc/ptp4l.conf 文件的接口部分末尾添加以下行

    [unicast_master_table]
    table_id               3
    logQueryInterval       0
    RAWUDPv4                  100.100.100.1
    
    [swp1]
    table_id                1
    ...
    
  2. 重启 ptp4l 服务。

    cumulus@switch:~$ sudo systemctl restart ptp4l.service
    

要将 PTP 接口配置为单播服务器

cumulus@switch:~$ nv set interface swp1 ptp unicast-service-mode server
cumulus@switch:~$ nv config apply
  1. /etc/ptp4l.conf 文件的接口部分末尾添加以下行

    [swp1]
    ...
    unicast_listen      1
    ...
    
  2. 重启 ptp4l 服务。

    cumulus@switch:~$ sudo systemctl restart ptp4l.service
    

要配置单播表 ID

cumulus@switch:~$ nv set interface swp1 ptp unicast-master-table-id 1
cumulus@switch:~$ nv config apply
  1. /etc/ptp4l.conf 文件的接口部分末尾添加表 ID

    [swp1]
    ...
    table_id   1
    
    
  2. 重启 ptp4l 服务。

    cumulus@switch:~$ sudo systemctl restart ptp4l.service
    

要在交换机上显示单播主时钟表配置,请运行 nv show service ptp <instance-id> unicast-master <table-id> 命令。

要显示与单播 PTP 相关的计数器,请运行 nv show interface <interface>> counters ptp 命令,并检查输出中的 Signaling 部分。

cumulus@switch:~$ nv show interface swp1 counters ptp
Packet Type                       Received       Transmitted    
---------------------             ------------   ------------   
Announce                                    0            681
Sync                                        0          43530
Follow-up                                   0          43530
Delay Request                           42064              0
Delay Response                              0          42064
Peer Delay Request                          0              0
Peer Delay Response                         0              0
Management                                  0              0
Signaling                                  94            282
  Announce Grant Request                   94              0
  Announce Grant Response                   0             94
  Announce Deny Response                    0              0
  Sync Grant Request                       94              0
  Sync Grant Response                       0             94
  Sync Deny Response                        0              0
  Delay Grant Request                      94              0
  Delay Grant Response                      0             94
  Delay Deny Response                       0              0
  Cancel Announce Request                   0              0
  Cancel Sync Request                       0              0
  Cancel Delay Request                      0              0

  • 客户端在一个信令消息(Announce、Sync、Delay request TLV)中一起发送单播请求,单播服务器看到一个信令消息和三个 TLV。每次收到请求时,计数器都会递增。
  • 服务器为每个响应单独响应一个 grant 信令消息;响应包括三个信令消息,每个消息都带有一个 TLV。计数器单独递增。

可选的单播接口配置

您可以为单播客户端设置单播请求持续时间,这是单播客户端在单播协商期间请求的服务时间(以秒为单位)。默认值为 300 秒。

cumulus@switch:~$ nv set interface swp1 ptp unicast-request-duration 20
cumulus@switch:~$ nv config apply
  1. /etc/ptp4l.conf 文件的接口部分末尾添加 unicast_request_duration 参数

    [swp1]
    ...
    table_id   1
    unicast_request_duration 20
    
  2. 重启 ptp4l 服务。

    cumulus@switch:~$ sudo systemctl restart ptp4l.service
    

PTP 配置文件

PTP 配置文件是一组标准化的配置和规则,旨在满足特定应用程序的需求。配置文件定义了必需、允许和限制的 PTP 选项、网络限制和性能要求。

所有接口都继承 PTP 配置文件参数值。在接口下配置的 PTP 参数值优先于 PTP 配置文件参数值。

Cumulus Linux 支持三种预定义的配置文件:IEEE 1588 和两个电信配置文件 - ITU 8275-1 和 ITU 8275-2。

IEEE 1588ITU 8275-1ITU 8275-2
应用企业移动网络移动网络
传输二层和三层第 2 层第 3 层
封装802.3、UDPv4 或 UDPv6802.3UDPv4 或 UDPv6
传输单播和多播多播单播
支持的时钟类型边界时钟边界时钟边界时钟

  • 您无法修改预定义的配置文件。如果要在预定义的配置文件中将参数设置为不同的值,则需要创建自定义配置文件。您可以在适用于配置文件类型的范围内修改自定义配置文件。
  • 您无法将当前配置文件设置为尚未创建的配置文件。
  • 您无法在使用中的配置文件中设置全局 PTP 参数。
  • PTP 配置文件不支持 bonds。
  • 如果您设置了预定义或自定义配置文件,请勿更改任何全局 PTP 设置,例如 DSCP 或时钟域。
  • 为了在具有多个接口上 PTP 的高规模网络中获得更好的性能,请使用 nv set system control-plane policer lldp-ptp burst <value>nv set system control-plane policer lldp-ptp rate <value> 命令配置更高的系统策略器速率。交换机将 LLDP 策略器用于 PTP 协议数据包。LLDP 策略器的默认值为 2500。当您将 ITU 8275.1 配置文件与更高的同步速率一起使用时,请使用更高的策略器值。

设置预定义的配置文件

要设置预定义的配置文件

  • 要设置 ITU 8275.1 配置文件,请运行 nv set service ptp <instance-id> current-profile default-itu-8275-1 命令。
  • 要设置 ITU 8275.2 配置文件,请运行 nv set service ptp <instance-id> current-profile default-itu-8275-2 命令。

以下示例将配置文件设置为 ITU 8275.1

cumulus@switch:~$ nv set service ptp 1 current-profile default-itu-8275-1
cumulus@switch:~$ nv config apply

要设置 IEEE 1588 配置文件

cumulus@switch:~$ nv set service ptp 1 current-profile default-1588
cumulus@switch:~$ nv config apply

要设置预定义的 ITU 8275.1 配置文件,请编辑 /etc/ptp4l.conf 文件并设置如下所示的参数,然后重启 ptp4l 服务

cumulus@switch:~$ sudo nano /etc/ptp4l.conf
...
...
[global]
#
# Default Data Set
#
slaveOnly                      0
priority1                      128
priority2                      128
domainNumber                   24

twoStepFlag                    1
dscp_event                     46
dscp_general                   46
dataset_comparison             G.8275.x
G.8275.defaultDS.localPriority 128
ptp_dst_mac                    01:80:C2:00:00:0E
...
cumulus@switch:~$ sudo systemctl restart ptp4l.service

要设置预定义的 ITU 8275.2 配置文件,请编辑 /etc/ptp4l.conf 文件并设置如下所示的参数,然后重启 ptp4l 服务

cumulus@switch:~$ sudo nano /etc/ptp4l.conf
...
...
[global]
#
# Default Data Set
#
slaveOnly                      0
priority1                      128
priority2                      128
domainNumber                   24

twoStepFlag                    1 
dscp_event                     46
dscp_general                   46
network_transport              RAWUDPv4
dataset_comparison             G.8275.x
G.8275.defaultDS.localPriority 128
hybrid_e2e                     1
inhibit_multicast_service      1
unicast_listen                 1
unicast_req_duration           60
...
cumulus@switch:~$ sudo systemctl restart ptp4l.service

要使用预定义的 IEEE 1588 配置文件,请编辑 /etc/ptp4l.conf 文件并设置如下所示的参数,然后重启 ptp4l 服务

cumulus@switch:~$ sudo nano /etc/ptp4l.conf
[global]
#
# Default Data Set
#
slaveOnly                      0
priority1                      128
priority2                      128
domainNumber                   0

twoStepFlag                    1
dscp_event                     46
dscp_general                   46
network_transport              RAWUDPv4
dataset_comparison             ieee1588
...
cumulus@switch:~$ sudo systemctl restart ptp4l.service

创建自定义配置文件

要创建自定义配置文件

  • 创建配置文件名称。
  • 设置新配置文件所基于的配置文件类型(itu-g-8275-1 itu-g-8275-2ieee-1588)。
  • 更新您要更改的任何配置文件设置(announce-intervaldelay-req-intervalpriority1sync-intervalannounce-timeoutdomainpriority2transportdelay-mechanismlocal-priority)。
  • 将自定义配置文件设置为当前配置文件。

以下示例命令基于预定义的 ITU 8275-1 配置文件创建名为 CUSTOM1 的自定义配置文件。这些命令将 domain 设置为 28,将 announce-timeout 设置为 3,然后将 CUSTOM1 设置为当前配置文件

cumulus@switch:~$  nv set service ptp 1 profile CUSTOM1 
cumulus@switch:~$  nv set service ptp 1 profile CUSTOM1 profile-type itu-g-8275-1  
cumulus@switch:~$  nv set service ptp 1 profile CUSTOM1 domain 28
cumulus@switch:~$  nv set service ptp 1 profile CUSTOM1 announce-timeout 3
cumulus@switch:~$  nv set service ptp 1 current-profile CUSTOM1
cumulus@switch:~$  nv config apply

以下示例 /etc/ptp4l.conf 文件基于预定义的 ITU 8275-1 配置文件创建一个自定义配置文件,并将 domain 设置为 28,将 announce-timeout 设置为 3。

cumulus@switch:~$ sudo nano /etc/ptp4l.conf
[global]
#
# Default Data Set
#
slaveOnly                      0
priority1                      128
priority2                      128
domainNumber                   28

twoStepFlag                    1
dscp_event                     46
dscp_general                   46
network_transport              L2
dataset_comparison             G.8275.x
G.8275.defaultDS.localPriority 128
ptp_dst_mac                    01:80:C2:00:00:0E

#
# Port Data Set
#
logAnnounceInterval            5
logSyncInterval                -4
logMinDelayReqInterval         -4
announceReceiptTimeout         3
delay_mechanism                E2E

offset_from_master_min_threshold   -50
offset_from_master_max_threshold   50
mean_path_delay_threshold          200
tsmonitor_num_ts                   100
tsmonitor_num_log_sets             3
tsmonitor_num_log_entries          4
tsmonitor_log_wait_seconds         1

#
# Run time options
#
logging_level                  6
path_trace_enabled             0
use_syslog                     1
verbose                        0
summary_interval               0

#
# servo parameters
#
pi_proportional_const          0.000000
pi_integral_const              0.000000
pi_proportional_scale          0.700000
pi_proportional_exponent       -0.300000
pi_proportional_norm_max       0.700000
pi_integral_scale              0.300000
pi_integral_exponent           0.400000
pi_integral_norm_max           0.300000
step_threshold                 0.000002
first_step_threshold           0.000020
max_frequency                  900000000
sanity_freq_limit              0

#
# Default interface options
#
time_stamping                  hardware


# Interfaces in which ptp should be enabled
# these interfaces should be routed ports
# if an interface does not have an ip address
# the ptp4l will not work as expected.

[swp1]
udp_ttl                 1
masterOnly              0
delay_mechanism         E2E

[swp2]
udp_ttl                 1
masterOnly              0
delay_mechanism         E2E
cumulus@switch:~$ sudo systemctl restart ptp4l.service

电信配置文件

ITU 8275-1 和 ITU 8275-2 是电信配置文件。您可以将 PTP 电信配置文件用于具有完全时序支持的网络中的相位分配,以及用于具有部分时序支持的网络中的时间分配。虽然 ITU 8275-1 使用 802.3 封装,但 ITU 8275-2 使用单播。当您使用电信配置文件时,PTP 使用备用最佳主时钟算法 (BMCA),该算法在常规 BMCA 上提供以下功能

  • 支持仅主时钟功能。
  • 允许同时激活多个 Grand Master。
  • 支持 local-priority 功能,以手动设计同步网络。

本地优先级

电信配置文件的本地优先级属性为构建同步拓扑提供了强大的工具。配置文件具有两个本地优先级配置参数

  • clock-local-priority - 您将时钟本地优先级分配给本地时钟。在决定更好的 Grand Master 时,PTP 使用时钟本地优先级作为决胜因素。
  • local-priority - 当运行备用 BMCA 时,您将本地优先级分配给端口作为决胜因素。当您在配置文件级别设置此属性时,它将应用于所有启用 PTP 的端口。还有一个接口级别的配置可以覆盖配置文件值。

clock-local-prioritylocal-priority 的默认值均为 128。当您使用默认值时,备用 BMCA 会自动确定同步拓扑。如果您使用非默认本地优先级值,则需要手动构建同步拓扑。

  • 手动构建同步拓扑时,请谨慎使用本地优先级属性。
  • 对于两个连接的交换机,您必须在一个交换机上将本地优先级设置为高于 128,而在第二个交换机上将本地优先级设置为低于 128。

以下示例命令设置

  • 基于 ITU 8275-2 的名为 CUSTOM1 的自定义配置文件的本地优先级为 10。
  • 基于 ITU 8275-2 的名为 CUSTOM1 的自定义配置文件的时钟本地优先级为 100。
cumulus@switch:~$ nv set service ptp 1 profile CUSTOM1 local-priority 10
cumulus@switch:~$ nv set service ptp 1 profile CUSTOM1 clock-local-priority 100
cumulus@switch:~$ nv config apply

G.8275.portDS.localPriority(本地优先级)选项和 G.8275.defaultDS.localPriority(时钟本地优先级)选项添加到 /etc/ptp4l.conf 文件的 Global 部分,然后重启 ptp4l 服务。

以下示例设置

  • 本地优先级为 10。
  • 时钟本地优先级为 100。
cumulus@switch:~$ sudo nano /etc/ptp4l.conf
[global]
#
# Default Data Set
#
slaveOnly                      0
priority1                      128
priority2                      128
domainNumber                   28

twoStepFlag                    1
dscp_event                     46
dscp_general                   46
network_transport              L2
dataset_comparison             G.8275.x
G.8275.defaultDS.localPriority 100
G.8275.portDS.localPriority    10
...
cumulus@switch:~$ sudo systemctl restart ptp4l.service

以下示例将 swp1 上的本地优先级设置为 120。

cumulus@switch:~$ nv set interface swp1 ptp 1 local-priority 120
cumulus@switch:~$ nv config apply

G.8275.portDS.localPriority 选项添加到 /etc/ptp4l.conf 文件的 interface 部分,然后重启 ptp4l 服务。

cumulus@switch:~$ sudo nano /etc/ptp4l.conf
...
[swp1]
udp_ttl                      1
hybrid_e2e                   1
masterOnly                   0
delay_mechanism              E2E
network_transport            RAWUDPv6
G.8275.portDS.localPriority  120
...
cumulus@switch:~$ sudo systemctl restart ptp4l.service

显示配置文件设置

要显示当前 PTP 配置文件设置,请运行 nv show service ptp <ptp-instance> 命令

cumulus@switch:~$ nv show service ptp 1
                             operational  applied             description
---------------------------  -----------  ------------------  --------------------------------------------------------------------
enable                       on           on                  Turn the feature 'on' or 'off'.  The default is 'off'.
current-profile                           default-itu-8275-1  Current PTP profile index
domain                       24           0                   Domain number of the current syntonization
ip-dscp                      46           46                  Sets the Diffserv code point for all PTP packets originated locally.
priority1                    128          128                 Priority1 attribute of the local clock
priority2                    128          128                 Priority2 attribute of the local clock
...

要显示配置文件的设置,请运行 nv show service ptp <instance> profile <profile-name> 命令

cumulus@switch:~$ nv show service ptp 1 profile CUSTOM1
                             operational  applied           
---------------------------  -----------  ------------------
enable                                    on                
current-profile                           default-itu-8275-1
domain                                    0                 
ip-dscp                                   46                
logging-level                             info              
priority1                                 128               
priority2                                 128               
[acceptable-master]    
monitor                                                     
  max-offset-threshold                    50                
  max-timestamp-entries                   100               
  max-violation-log-entries               4                 
  max-violation-log-sets                  3                 
  min-offset-threshold                    -50               
  path-delay-threshold                    200               
  violation-log-interval                  1                 

可选的可接受主时钟表

可接受主时钟表选项是一项安全功能,可防止恶意参与者冒充 Grand Master 时钟来接管 PTP 网络。要使用此功能,您需要在可接受主时钟表中配置已知 Grand Master 时钟的时钟 ID,并在 PTP 端口上设置可接受主时钟表选项。BMC 算法会检查 Announce 消息中收到的 Grand Master 时钟是否在此表中,然后再继续进行主时钟选择。Cumulus Linux 默认情况下在 PTP 端口上禁用此选项。

以下示例命令将 Grand Master 时钟 ID 24:8a:07:ff:fe:f4:16:06 添加到可接受主时钟表,并为 swp1 启用 PTP 可接受主时钟表选项

cumulus@switch:~$ nv set service ptp 1 acceptable-master 24:8a:07:ff:fe:f4:16:06
cumulus@switch:~$ nv config apply

您还可以为 Grand Master 配置备用优先级 1 值

cumulus@switch:~$ nv set service ptp 1 acceptable-master 24:8a:07:ff:fe:f4:16:06 alt-priority 2

要为 swp1 启用 PTP 可接受主时钟表选项

cumulus@switch:~$ nv set interface swp1 ptp acceptable-master on
cumulus@switch:~$ nv config apply

编辑 /etc/ptp4l.conf 文件的 Default interface options 部分,以添加 acceptable_master_clockIdentity 248a07.fffe.f41606

cumulus@switch:~$ sudo nano /etc/ptp4l.conf
...
#
# Default interface options
#
time_stamping           hardware


[acceptable_master_table]
maxTableSize 16
acceptable_master_clockIdentity 248a07.fffe.f41606
...

您还可以为 Grand Master 配置备用优先级 1 值。

cumulus@switch:~$ sudo nano /etc/ptp4l.conf
...
#
# Default interface options
#
time_stamping           hardware


[acceptable_master_table]
maxTableSize 16
acceptable_master_clockIdentity 248a07.fffe.f41606 2

要为 swp1 启用 PTP 可接受主时钟表选项,请在 [swp1] 下添加 acceptable_master on

...
# Default interface options
#
time_stamping           hardware

# Interfaces in which ptp should be enabled
# these interfaces should be routed ports
# if an interface does not have an ip address
# the ptp4l will not work as expected.

[swp1]
udp_ttl                 20
masterOnly              1
delay_mechanism         E2E
acceptable_master       on
...

重启 ptp4l 服务

cumulus@switch:~$ sudo systemctl restart ptp4l.service

可选的监控配置

Cumulus Linux 提供以下可选的 PTP 监控配置。

配置时钟时间戳和路径延迟阈值

Cumulus Linux 监控时钟时间戳和路径延迟是否超出阈值,并在 PTP 达到设定的阈值时生成计数器。您可以在 NVUE nv show 命令输出和日志消息中查看计数器。

您可以配置以下监控设置

命令描述
nv set service ptp <instance> monitor min-offset-threshold设置主时钟和从时钟时间之间允许的最小差异。您可以设置介于 -1000000000 和 0 纳秒之间的值。默认值为 -50 纳秒。
nv set service ptp <instance> monitor max-offset-threshold设置主时钟和从时钟时间之间允许的最大差异。您可以设置介于 0 和 1000000000 纳秒之间的值。默认值为 50 纳秒。
nv set service ptp <instance> monitor path-delay-threshold设置 PTP 数据包在主时钟和从时钟之间传输的平均时间。您可以设置介于 0 和 1000000000 纳秒之间的值。默认值为 200 纳秒。
nv set service ptp <instance> monitor max-timestamp-entries设置允许的最大时间戳条目数。Cumulus Linux 持续更新时间戳。您可以指定介于 100 和 200 之间的值。默认值为 100 个条目。

以下示例将最小偏移阈值设置为 -1000,最大偏移阈值设置为 1000,路径延迟阈值设置为 300

cumulus@switch:~$ nv set service ptp 1 monitor min-offset-threshold -1000
cumulus@switch:~$ nv set service ptp 1 monitor max-offset-threshold 1000
cumulus@switch:~$ nv set service ptp 1 monitor path-delay-threshold 300
cumulus@switch:~$ nv config apply

您可以在 /etc/ptp4l.conf 文件中手动配置以下监控设置。请务必运行 sudo systemctl restart ptp4l.service 以应用设置。

参数描述
offset_from_master_min_threshold设置主时钟和从时钟时间之间允许的最小差异。您可以设置介于 -1000000000 和 0 纳秒之间的值。默认值为 -50 纳秒。
offset_from_master_max_threshold设置主时钟和从时钟时间之间允许的最大差异。您可以设置介于 0 和 1000000000 纳秒之间的值。默认值为 50 纳秒。
mean_path_delay_threshold设置 PTP 数据包在主时钟和从时钟之间传输的平均时间。您可以设置介于 0 和 1000000000 纳秒之间的值。默认值为 200 纳秒。

以下示例将最小偏移阈值设置为 -1000,最大偏移阈值设置为 1000,路径延迟阈值设置为 300

cumulus@switch:~$ sudo nano /etc/ptp4l.conf
...
[global]
#
# Default Data Set
#
slaveOnly               0
priority1               128
priority2               128
domainNumber            0

twoStepFlag             1
dscp_event              46
dscp_general            46

offset_from_master_min_threshold   -1000
offset_from_master_max_threshold   1000
mean_path_delay_threshold          300
...

配置 PTP 日志记录

日志集包含不同时间时钟时间戳和路径延迟违规的日志条目。您可以设置要记录的条目数以及连续违规日志之间的间隔。

命令描述
nv set service ptp 1 monitor max-violation-log-sets设置允许的最大日志集数。您可以指定介于 2 和 4 之间的值。默认值为 3。
nv set service ptp 1 monitor max-violation-log-entries设置一个日志集中允许的最大日志条目数。您可以指定介于 4 和 8 之间的值。默认值为 4。
nv set service ptp 1 monitor violation-log-interval设置等待多少秒后记录背靠背违规。您可以指定介于 0 和 60 之间的值。默认值为 1。

以下示例将允许的最大日志集数设置为 4,将允许的最大日志条目数设置为 6,并将违规日志间隔设置为 10

cumulus@switch:~$ nv set service ptp 1 monitor max-violation-log-sets 4
cumulus@switch:~$ nv set service ptp 1 monitor max-violation-log-entries 6
cumulus@switch:~$ nv set service ptp 1 monitor violation-log-interval 10
cumulus@switch:~$ nv config apply

您可以在 /etc/ptp4l.conf 文件中手动配置以下监控设置。请务必运行 sudo systemctl restart ptp4l.service 以应用设置。

参数描述
tsmonitor_num_log_sets设置允许的最大日志集数。您可以指定介于 2 和 4 之间的值。默认值为 3。
tsmonitor_num_log_entries设置一个日志集中允许的最大日志条目数。您可以指定介于 4 和 8 之间的值。默认值为 4。
tsmonitor_log_wait_seconds设置等待多少秒后记录背靠背违规。您可以指定介于 0 和 60 之间的值。默认值为 1。

以下示例将允许的最大日志集数设置为 4,将允许的最大日志条目数设置为 6,并将违规日志间隔设置为 10

cumulus@switch:~$ sudo nano /etc/ptp4l.conf
...
[global]
#
# Default Data Set
#
slaveOnly               0
priority1               128
priority2               128
domainNumber            0

twoStepFlag             1
dscp_event              46
dscp_general            46

offset_from_master_min_threshold   -50
offset_from_master_max_threshold   50
mean_path_delay_threshold          300
tsmonitor_num_ts                   100
tsmonitor_num_log_sets             4
tsmonitor_num_log_entries          6
tsmonitor_log_wait_seconds         10
...

显示 PTP 日志

PTP 监控提供命令来显示违规计数器以及违规的时间戳日志条目。

命令描述
nv show service ptp <instance> monitor timestamp-log显示最近 25 个 PTP 时间戳。
nv show service ptp <instance> monitor violations显示阈值违规计数以及特定类型违规的上次发生时间。
nv show service ptp 1 monitor violations log acceptable-master显示当不在可接受主时钟表中的 PTP 服务器发送 Announce 请求时发生的违规日志。
nv show service ptp 1 monitor violations log forced-master显示当强制主时钟端口获得更高时钟时发生的违规日志。
nv show service ptp 1 monitor violations log max-offset显示当时间戳偏移高于最大偏移阈值时发生的违规日志。
nv show service ptp 1 monitor violations log min-Offset显示当时间戳偏移低于最小偏移阈值时发生的违规日志。
nv show service ptp 1 monitor violations log path-delay显示当平均路径延迟高于路径延迟阈值时发生的违规日志。

以下示例显示阈值违规计数以及上次发生最小偏移阈值违规的时间

cumulus@switch:~$ nv show service ptp 1 monitor violations
                  operational                  applied
----------------  ---------------------------  -------
last-max-offset
last-min-offset   2023-04-24T15:22:01.312295Z
last-path-delay
max-offset-count  0
min-offset-count  2
path-delay-count  0

清除 PTP 违规日志

  • 要清除最大偏移违规日志,请运行 nv action clear service ptp <instance> monitor violations log max-offset 命令。
  • 要清除最小偏移违规日志,请运行 nv action clear service ptp <instance> monitor violations log min-offset 命令。
  • 要清除路径延迟违规日志,请运行 nv action clear service ptp <instance> monitor violations log path-delay 命令。
cumulus@leaf01:mgmt:~$ nv action clear service ptp 1 monitor violations log path-delay
Action succeeded

删除 PTP 配置

要删除 PTP 配置,请删除 PTP 主时钟和从时钟接口。以下示例命令删除 PTP 接口 swp1swp2swp3

cumulus@switch:~$ nv unset interface swp1 ptp
cumulus@switch:~$ nv unset interface swp2 ptp
cumulus@switch:~$ nv unset interface swp3 ptp
cumulus@switch:~$ nv config apply

编辑 /etc/ptp4l.conf 文件以从 Default interface options 部分删除接口,然后重启 ptp4l 服务。

cumulus@switch:~$ sudo nano /etc/ptp4l.conf
...
# Default interface options
#
time_stamping           hardware

# Interfaces in which ptp should be enabled
# these interfaces should be routed ports
# if an interface does not have an ip address
# the ptp4l will not work as expected.
cumulus@switch:~$ sudo systemctl restart ptp4l.service

要在交换机上禁用 PTP 并停止 ptp4lphc2sys 进程

cumulus@switch:~$ nv set service ptp 1 enable off
cumulus@switch:~$ nv config apply
cumulus@switch:~$ sudo systemctl stop ptp4l.service phc2sys.service
cumulus@switch:~$ sudo systemctl disable ptp4l.service phc2sys.service

故障排除

显示 PTP 配置

要显示交换机上 PTP 配置的摘要,请运行 nv show service ptp <instance> 命令

cumulus@switch:~$ nv show service ptp 1
                             operational  applied
---------------------------  -----------  ------------------
enable                       on           on
current-profile                            default-itu-8275-2
domain                                    0
ip-dscp                                   46
logging-level                             info
priority1                                 128
priority2                                 128
[acceptable-master]
monitor
  max-offset-threshold                     50
  max-timestamp-entries                   100
  max-violation-log-entries               4
  max-violation-log-sets                  2
  min-offset-threshold                     -50
  path-delay-threshold                    200
  violation-log-interval                  1
[profile]                                  abc
[profile]                                  default-1588
[profile]                                  default-itu-8275-1
[profile]                                  default-itu-8275-2
[unicast-master]                          1
[unicast-master]                          2
[unicast-master]                          3
[unicast-master]                          4
...

您可以使用以下 nv show service ptp <instance> 命令向下钻取

  • nv show service ptp <instance> acceptable-master 显示可接受主时钟配置。
  • nv show service ptp <instance> clock-quality 显示时钟质量状态。
  • nv show service ptp <instance> current 显示在 PTP 消息交换期间学习到的本地状态。
  • nv show service ptp <instance> domain 显示域配置。
  • nv show service ptp <instance> ip-dscp 显示 PTP DSCP 配置。
  • nv show service ptp <instance> monitor 显示 PTP 监控配置。
  • nv show service ptp <instance> profile 显示 PTP 配置文件配置。
  • nv show service ptp <instance> parent 显示在 PTP 消息交换期间学习到的本地状态。
  • nv show service ptp <instance> priority1 显示 PTP priority1 配置。
  • nv show service ptp <instance> priority2 显示 PTP priority2 配置。
  • nv show service ptp <instance> status 显示所有 PTP 接口的状态。
  • nv show service ptp <instance> time-properties 显示时钟时间属性。
  • nv show service ptp <instance> unicast-master 显示单播主时钟配置。

显示 PTP 接口配置

要检查 PTP 接口的配置,请运行 nv show interface <interface> ptp 命令。

cumulus@switch:~$ nv show interface swp1 ptp
                           operational  applied     description
-------------------------  -----------  ----------  ----------------------------------------------------------------------
enable                                  on          Turn the feature 'on' or 'off'.  The default is 'off'.
acceptable-master                       off         Determines if acceptable master check is enabled for this interface.
delay-mechanism            end-to-end   end-to-end  Mode in which PTP message is transmitted.
forced-master              off          off         Configures PTP interfaces to forced master state.
instance                                1           PTP instance number.
mixed-multicast-unicast                 off         Enables Multicast for Announce, Sync and Followup and Unicast for D...
transport                  ipv4         ipv4        Transport method for the PTP messages.
ttl                        1            1           Maximum number of hops the PTP messages can make before it gets dro...
unicast-request-duration                300         The service time in seconds to be requested during discovery.
timers
  announce-interval        0            0           Mean time interval between successive Announce messages.  It's spec...
  announce-timeout         3            3           The number of announceIntervals that have to pass without receipt o...
  delay-req-interval       -3           -3          The minimum permitted mean time interval between successive Delay R...
  sync-interval            -3           -3          The mean SyncInterval for multicast messages.  It's specified as a...
peer-mean-path-delay       0                        An estimate of the current one-way propagation delay on the link wh...
port-state                 master                   State of the port
protocol-version           2                        The PTP version in use on the port

显示 PTP 计数器

要显示所有 PTP 计数器,请运行 nv show service ptp <instance> counters 命令

cumulus@switch:~$ nv show service ptp 1 counters
Packet Type              Received       Transmitted    
---------------------    ------------   ------------   
Port swp4
  Announce                 0              10370            
  Sync                     0              20731             
  Follow-up                0              20731            
  Delay Request            0              0              
  Delay Response           0              0              
  Peer Delay Request       0              0              
  Peer Delay Response      0              0              
  Management               0              0              
  Signaling                0              0

要显示接口的 PTP 计数器,请运行 nv show interface <interface> counters ptp 命令。

要清除接口的 PTP 计数器,请运行 nv action clear interface <interface> counters ptp 命令

cumulus@switch:~$ nv action clear interface swp1 counters ptp
Action succeeded

显示所有 PTP 接口的状态

要显示所有 PTP 接口的状态,请运行 nv show service ptp <instance> status 命令。命令输出显示 PTP 启用的端口、PTP 端口模式(单播或多播)、基于 BMCA 的端口状态、单播状态,并标识客户端连接到的服务器地址。

cumulus@switch:~$ nv show service ptp 1 status
Port   Mode   State    Ustate                           Server
-----  -----  -------  -------------------------------  -------
swp9   Ucast  SLAVE    Sync and Delay Granted (H_SYDY)  9.9.9.2
swp10  Ucast  PASSIVE  Initial State (WAIT)
swp11  Ucast  PASSIVE  Initial State (WAIT)
swp12  Ucast  PASSIVE  Initial State (WAIT)

显示 NVUE PTP 命令列表

  • 要查看 PTP 的 NVUE show 命令的完整列表,请运行 nv list-commands service ptp 命令。
  • 要显示 PTP 接口的 show 命令的完整列表,请运行 nv list-commands | grep 'nv show interface <interface-id> ptp' 命令。
cumulus@switch:~$ nv list-commands service ptp
nv show service ptp
nv show service ptp <instance-id>
nv show service ptp <instance-id> status
nv show service ptp <instance-id> domain
nv show service ptp <instance-id> priority1
nv show service ptp <instance-id> priority2
nv show service ptp <instance-id> ip-dscp
nv show service ptp <instance-id> acceptable-master
...
cumulus@switch:~$ nv list-commands | grep 'nv show interface <interface-id> ptp'
...
nv show interface <interface-id> ptp
nv show interface <interface-id> ptp timers
nv show interface <interface-id> ptp shaper
...

配置示例

在以下示例中,交换机上的边界时钟从 PTP 从端口 swp1 上的 Master 1(Grand Master)接收时间,设置其时钟,并通过 PTP 主端口 swp2、swp3 和 swp4 将时间向下传递到接收时间的主机。

以下示例配置假定您已配置要用于 PTP 的三层路由接口(swp1swp2swp3swp4)。

cumulus@switch:~$ nv set service ptp 1 enable on
cumulus@switch:~$ nv set service ptp 1 priority2 254
cumulus@switch:~$ nv set service ptp 1 priority1 254
cumulus@switch:~$ nv set service ptp 1 domain 3
cumulus@switch:~$ nv set interface swp1 ptp enable on
cumulus@switch:~$ nv set interface swp2 ptp enable on
cumulus@switch:~$ nv set interface swp3 ptp enable on
cumulus@switch:~$ nv set interface swp4 ptp enable on
cumulus@switch:~$ nv config apply
cumulus@switch:~$ sudo cat /etc/nvue.d/startup.yaml
- set:
    interface:
      lo:
        ip:
          address:
            10.10.10.1/32: {}
        type: loopback
      swp1:
        ptp:
          enable: on
        type: swp
      swp2:
        ptp:
          enable: on
        type: swp
      swp3:
        ptp:
          enable: on
        type: swp
      swp4:
        ptp:
          enable: on
        type: swp
    service:
      ptp:
        '1':
          domain: 3
          enable: on
          priority1: 254
          priority2: 254
cumulus@switch:~$ sudo cat /etc/ptp4l.conf
...
[global]
#
# Default Data Set
#
slaveOnly                      0
priority1                      254
priority2                      254
domainNumber                   3

twoStepFlag                    1
dscp_event                     46
dscp_general                   46

offset_from_master_min_threshold   -50
offset_from_master_max_threshold   50
mean_path_delay_threshold          200
tsmonitor_num_ts                   100
tsmonitor_num_log_sets             2
tsmonitor_num_log_entries          4
tsmonitor_log_wait_seconds         1

#
# Run time options
#
logging_level                  6
path_trace_enabled             0
use_syslog                     1
verbose                        0
summary_interval               0

#
# servo parameters
#
pi_proportional_const          0.000000
pi_integral_const              0.000000
pi_proportional_scale          0.700000
pi_proportional_exponent       -0.300000
pi_proportional_norm_max       0.700000
pi_integral_scale              0.300000
pi_integral_exponent           0.400000
pi_integral_norm_max           0.300000
step_threshold                 0.000002
first_step_threshold           0.000020
max_frequency                  900000000
sanity_freq_limit              0

#
# Default interface options
#
time_stamping                  hardware


# Interfaces in which ptp should be enabled
# these interfaces should be routed ports
# if an interface does not have an ip address
# the ptp4l will not work as expected.

[swp1]
udp_ttl                      1
masterOnly                   0
delay_mechanism              E2E
network_transport            RAWUDPv4

[swp2]
udp_ttl                      1
masterOnly                   0
delay_mechanism              E2E
network_transport            RAWUDPv4

[swp3]
udp_ttl                      1
masterOnly                   0
delay_mechanism              E2E
network_transport            RAWUDPv4

[swp4]
udp_ttl                      1
masterOnly                   0
delay_mechanism              E2E
network_transport            RAWUDPv4

注意事项

PTP 版本

Cumulus Linux 使用符合 PTP v2.1 标准的 linuxptp 软件包,并在配置中默认将主 PTP 版本设置为 2,次要 PTP 版本设置为 1。如果当次要版本设置后您的 PTP 配置无法正常工作,您可以将次要版本更改为 0。

cumulus@switch:~$ nv set service ptp 1 force-version 2.0
cumulus@switch:~$ nv config apply

要将次要 PTP 版本设置回默认值,请运行 nv unset service ptp 1 force-version 命令。

编辑 /etc/ptp4l.conf 文件以将 ptp_minor_version 0 添加到 Global 部分,然后重启 ptp4l 服务。

cumulus@switch:~$ sudo nano /etc/ptp4l.conf
...
[global]
#
# Default Data Set
#
slaveOnly                      0
priority1                      128
priority2                      128
domainNumber                   0

twoStepFlag                    1
dscp_event                     46
dscp_general                   46
ptp_minor_version              0
cumulus@switch:~$ sudo systemctl restart ptp4l.service

要将次要 PTP 版本设置回默认值 (1),请从 /etc/ptp4l.conf 文件的 Global 部分删除 ptp_minor_version 0,然后重启 ptp4l 服务。

要显示 PTP 次要版本现在为 0,请运行 nv show service ptp <instance> force-version 命令

cumulus@switch:~$ nv show service ptp 1 force-version
               applied
-------------  -------
force-version  2.0

PTP 流量整形

为了提高 NVIDIA Spectrum 1 交换机上速度低于 100G 的启用 PTP 端口的性能,您可以启用预定义的流量整形配置文件。例如,如果您看到 PTP 时序偏移变化很大且不稳定,请在所有启用 PTP 的端口上启用 PTP 整形,以稍微降低端口上的带宽并提高时序稳定性。

  • 带有 Spectrum-2 及更高版本的交换机不支持 PTP 整形。

  • Bonds 不支持 PTP 整形。

  • 您不能在同一端口上配置 QoS 流量整形 和 PTP 流量整形。

  • 您必须为 PTP 流量配置 严格优先级;例如

    cumulus@switch:~$ nv set qos egress-scheduler default-global traffic-class 0-5,7 mode dwrr
    cumulus@switch:~$ nv set qos egress-scheduler default-global traffic-class 0-5,7 bw-percent 12
    cumulus@switch:~$ nv set qos egress-scheduler default-global traffic-class 6 mode strict
    

对于您要设置流量整形的每个启用 PTP 的端口,运行 nv set interface <interface> ptp shaper enable on 命令。

cumulus@switch:~$ nv set interface swp1 ptp shaper enable on
cumulus@switch:~$ nv set interface swp2 ptp shaper enable on
cumulus@switch:~$ nv config apply

要查看接口的 PTP 整形设置,请运行 nv show interface <interface> ptp shaper 命令

cumulus@switch:~$ nv show interface swp1 ptp shaper
        operational  applied  
------  -----------  -------  
enable               on   

/etc/cumulus/switchd.d/ptp_shaper.conf 文件中,为您要应用流量整形的接口设置以下参数,并启用流量整形器。您必须重新加载 switchd 才能使更改生效。

cumulus@switch:~$ sudo nano /etc/cumulus/switchd.d/ptp_shaper.conf
## Per-port configuration for PTP shaper
ptp_shaper.port_group_list = [enable-group]
ptp_shaper.enable-group.port_set = swp1,swp2
ptp_shaper.enable-group.ptp_shaper_enable = true
cumulus@switch:~$ sudo systemctl reload switchd.service

生成树和 PTP

PTP 帧受 STP 过滤的影响;事件(例如 STP 拓扑更改(其中端口暂时进入阻塞状态))可能会导致 PTP 通信中断。

如果您在网桥端口上配置 PTP,NVIDIA 建议网桥端口为生成树边缘端口,或者位于禁用生成树的网桥域中。