DOCA Firefly 服务指南
本指南提供关于如何在 NVIDIA® BlueField® DPU 之上使用 DOCA Firefly 服务容器的说明。
DOCA Firefly 服务为 BlueField DPU 提供基于精确时间协议 (PTP) 的时间同步服务。
PTP 是一种用于同步网络中时钟的协议。当与硬件支持结合使用时,PTP 能够实现亚微秒级的精度,这远优于通常通过网络时间协议 (NTP) 获得的效果。PTP 支持分为内核空间和用户空间。ptp4l 程序实现了 PTP 边界时钟和普通时钟。借助硬件时间戳,它用于将 PTP 硬件时钟同步到主时钟。

Firefly 提供的某些功能需要特定的 BlueField DPU 硬件功能
PTP – 所有 BlueField DPU 均支持
PPS – 需要具有 PPS 功能的 BlueField DPU
SyncE - 需要融合卡 BlueField DPU
由于缺少硬件支持而导致 PPS 运行失败将在服务输出中注明。但是,该服务将继续运行它可以在提供的硬件上提供的计时服务。
固件版本
固件版本必须为 24.34.1002 或更高版本。
BlueField BSP 版本
支持的 BlueField 镜像版本为 3.9.0 及更高版本。
嵌入式模式
在 DPU 上配置嵌入式模式的固件设置
将 DPU 设置为嵌入式模式(默认模式)
sudo
mlxconfig -y -d 03:00.0 s INTERNAL_CPU_MODEL=1启用实时时钟 (RTC)
sudo
mlxconfig -d 03:00.0set
REAL_TIME_CLOCK_ENABLE=1平稳关机 并重启 DPU 以应用配置。
您可以使用以下命令检查 DPU 模式
sudo
mlxconfig -d 03:00.0 q |grep
INTERNAL_CPU_MODEL# Example output
INTERNAL_CPU_MODEL EMBEDDED_CPU(1)
确保 OVS 硬件卸载
DOCA Firefly 要求在 Open vSwitch (OVS) 中激活硬件卸载。默认情况下,这已作为安装在 DPU 上的 BFB 镜像的一部分启用。
要验证 OVS 中的硬件卸载配置
sudo
ovs-vsctl get Open_vSwitch . other_config | grep
hw-offload
# Example output
{hw-offload="true"
}
如果未激活
通过运行以下命令激活硬件卸载
sudo
ovs-vsctlset
Open_vSwitch . other_config:hw-offload=true
;重启 OVS 服务
sudo
/etc/init.d/openvswitch-switch restart平稳关机 并重启 DPU 以应用配置。
辅助脚本
Firefly 的部署包含一个脚本,以帮助完成嵌入式模式下网络接口所需的配置步骤
scripts/doca_firefly/<firefly-version>/prepare_for_embedded_mode.sh
scripts/doca_firefly/<firefly-version>/set_new_sf.sh
最新的 DOCA Firefly 版本是 1.5.0
。
这两个脚本都作为 DOCA 容器资源的一部分包含在内,可以根据 NVIDIA DOCA 容器部署指南 中的说明下载。有关 DOCA 容器资源结构的更多信息,请参阅部署指南中“NGC 资源结构”部分。
由于 NGC 资源的技术限制,这两个脚本均在未执行 (+x) 权限的情况下提供。这可以通过运行以下命令来解决
chmod
+x scripts/doca_firefly/<firefly-version>/*.sh
prepare_for_embedded_mode.sh
此脚本自动化了“为嵌入式模式设置网络接口”部分中提到的所有步骤,并将新安装的 BFB 镜像配置为 DOCA Firefly 所需的设置。
注意事项
该脚本删除所有先前的 OVS 设置,并创建一个与“为嵌入式模式设置网络接口”部分中的定义匹配的单个 OVS 网桥
该脚本应仅在首次连接到 DPU 或断电重启后运行一次
使用此脚本后,唯一需要手动执行的步骤是配置已创建网络接口的 IP 地址(“为嵌入式模式设置网络接口”部分中的步骤 5)
该脚本自动使用端口 0 (
p0
)。端口 1 的配置应根据“set_new_sf.sh”和“为 DPU 模式设置网络接口”部分中列出的命令手动完成。
脚本参数
SF 编号(检查是否已存在)
示例
使用索引为 4 的 SF 准备 OVS 设置
chmod
+x ./*.sh ./prepare_for_embedded_mode.sh 4
该脚本使用 set_new_sf.sh
作为辅助脚本。
set_new_sf.sh
创建新的受信任 SF 并将其标记为“受信任”。
脚本参数
PCIe 地址
SF 编号(检查是否已存在)
MAC 地址(如果不存在,则生成随机地址)
示例
在 DPU 的端口 0 上创建编号为“4”的 SF
./set_new_sf.sh 0000:03:00.0 4
在 DPU 的端口 0 上创建编号为“5”的 SF 和特定的 MAC 地址
./set_new_sf.sh 0000:03:00.0 5 aa:bb:cc:
dd
:ee:ff在 DPU 的端口 1 上创建编号为“4”的 SF
./set_new_sf.sh 0000:03:00.1 4
前两个示例应可直接用于 BlueField-2 设备,并分别创建 SF4 和 SF5。
为 DPU 模式设置网络接口
根据可扩展功能设置指南,创建要供服务使用的受信任 SF。
注意以下说明假定 SF 已使用索引 4 创建。
创建所需的 OVS 设置,如架构图所示
$
sudo
ovs-vsctl add-br uplink $sudo
ovs-vsctl add-port uplink p0 $sudo
ovs-vsctl add-port uplink en3f0pf0sf4# This port is needed to ensure we have traffic host<->network as well
$sudo
ovs-vsctl add-port uplink pf0hpf验证 OVS 设置
sudo
ovs-vsctl show Bridge uplink Port pf0hpf Interface pf0hpf Port en3f0pf0sf4 Interface en3f0pf0sf4 Port p0 Interface p0 Port uplink Interface uplinktype
: internal在 SF 接口(而不是代表器)上启用 TX 时间戳
# tx port timestamp offloading
sudo
ethtool
--set
-priv-flags enp3s0f0s4 tx_port_ts on启用接口并为其设置 IP 地址
# configure ip for the interface:
sudo
ifconfig
enp3s0f0s4 <ip-addr> up配置 OVS 以支持此 SF 上的 TX 时间戳和常规多播流量
# Multicast-related definitions
$sudo
ovs-vsctlset
Bridge uplink mcast_snooping_enable=true
$sudo
ovs-vsctlset
Bridge uplink other_config:mcast-snooping-disable-flood-unregistered=true
$sudo
ovs-vsctlset
Port p0 other_config:mcast-snooping-flood=true
$sudo
ovs-vsctlset
Port p0 other_config:mcast-snooping-flood-reports=true
# PTP-related definitions
$sudo
ovs-ofctl add-flow uplink in_port=en3f0pf0sf4,udp,tp_src=319,actions=output:p0 $sudo
ovs-ofctl add-flow uplink in_port=p0,udp,tp_src=319,actions=output:en3f0pf0sf4 $sudo
ovs-ofctl add-flow uplink in_port=en3f0pf0sf4,udp,tp_src=320,actions=output:p0 $sudo
ovs-ofctl add-flow uplink in_port=p0,udp,tp_src=320,actions=output:en3f0pf0sf4注意如果您的 OVS 网桥使用的名称不是
uplink
,请确保所用名称反映在ovs-vsctl
和ovs-ofctl
命令中。例如$
sudo
ovs-vsctlset
Bridge <bridge-name> mcast_snooping_enable=true
分离模式
在 DPU 上配置分离模式的固件设置
将 BlueField 的运行模式设置为“分离”
sudo
mlxconfig -y -d 03:00.0 s INTERNAL_CPU_MODEL=0启用 RTC
sudo
mlxconfig -d 03:00.0set
REAL_TIME_CLOCK_ENABLE=1平稳关机 并重启 DPU 以应用配置。
您可以使用以下命令检查 BlueField 的运行模式
sudo
mlxconfig -d 03:00.0 q |grep
INTERNAL_CPU_MODEL# Example output
INTERNAL_CPU_MODEL SEPARATED_HOST(0)
为分离模式设置网络接口
确保
p0
未连接到 OVS 网桥sudo
ovs-vsctl show在
p0
接口上启用 TX 时间戳# TX port timestamp offloading (assuming PTP interface is p0)
sudo
ethtool
--set
-priv-flags p0 tx_port_ts on启用接口并为其设置 IP 地址
# Configure IP for the interface
sudo
ifconfig
p0 <ip-addr> up
基于主机的部署
基于主机的部署需要与“分离模式”部分下描述的相同配置。
DPU 部署
有关在 BlueField DPU 之上部署 DOCA 容器的信息,请参阅 NVIDIA DOCA 容器部署指南。
特定于服务的配置步骤和部署说明可以在服务的容器页面下找到。
DOCA Firefly 也可以部署在未连接到互联网的 DPU 上。有关说明,请参阅 NVIDIA DOCA 容器部署指南 中的相关部分。
主机部署
DOCA Firefly 具有适用于基于主机部署的版本。有关在主机之上部署 DOCA 容器的更多信息,请参阅 NVIDIA BlueField DPU 容器部署指南。
以下是在主机上部署 DOCA Firefly 的 docker 命令
sudo docker run --privileged --net=host -v /var/log/doca/firefly:/var/log/firefly -v /etc/firefly:/etc/firefly -e PTP_INTERFACE='eth2'
-it nvcr.io/nvidia/doca/doca_firefly:1.4
.0
-doca2.7.0
-host /entrypoint.sh
其中
其他 YAML 配置可以作为环境变量以额外的
-e
键值对传递,如上面的PTP_INTERFACE
一样确切的容器标签应为 DOCA Firefly 的 NGC 页面上选择的所需标签
服务中的所有模块都具有配置文件,允许自定义各种设置,包括常规设置和 PTP 相关设置。
内置配置文件
每个配置概况都有其自己的 ptp4l
基本 PTP 配置文件。例如,媒体配置概况 PTP 配置文件是 ptp4l-media.conf
。
内置 PTP 配置文件可以在“PTP 配置概况默认配置文件”部分中找到。为了便于使用,这些文件作为从 NGC 下载的 DOCA 容器资源的一部分提供,并放置在 Firefly 的 configs
目录 (scripts/doca_firefly/<firefly version>/configs
) 下。
当使用内置配置文件时,Firefly 使用存储在容器本身 /etc/linuxptp
目录中的文件。NGC 资源中包含的配置文件仅为便于访问而提供。修改它们不会影响容器在实践中使用的配置。相反,配置的更新应按照以下部分中的描述进行。
自定义配置文件
用户可以为每个模块创建自己的文件,而不是使用配置概况的基本配置文件。
要设置自定义配置文件,用户应在 /etc/firefly
目录中找到其配置文件,并在 DOCA Firefly 的 YAML 文件中设置配置文件名称。
例如,要设置自定义 linuxptp
配置文件,用户可以在 YAML 文件中设置参数 PTP_CONFIG_FILE
- name: PTP_CONFIG_FILE
value: my_custom_ptp.conf
在此示例中,my_custom_ptp.conf
应放置在 /etc/firefly/my_custom_ptp.conf
。
配置文件不得为 UDS 相关端口(/var/run/ptp4l
和 /var/run/ptp4lro
)定义值,因为这些值将影响容器内部行为。此类设置将提示警告,并在准备最终配置时被忽略(请参阅下一节中的更多信息)。
覆盖特定配置文件参数
用户可以选择覆盖特定参数,而不是替换整个配置文件。这可以使用 YAML 文件中的以下变量语法完成:CONF_<TYPE>_<SECTION>_<PARAMETER_NAME>
。
TYPE
–PTP
、MONITOR
、PHC2SYS
、SYNCE 或SERVO
之一SECTION
– 参数应放置在配置文件中的部分注意如果指定的节在配置文件中尚不存在,则会创建一个新节,除非它引用了未包含在
PTP_INTERFACE
YAML 字段中的 PTP 网络接口。PARAMETER_NAME
– 应放置在配置文件中的配置参数名称注意如果参数名称已存在于配置文件中,则根据
.yaml
文件中提供的值更改该值。如果参数名称尚不存在于配置文件中,则会添加该参数。
例如,YAML 文件定义中的以下变量将 PTP 配置文件中 global
部分下的参数 priority1
的值更改为 64
。
- name: CONF_PTP_global_priority1
value: "64"
由于表的结构(即,多个条目共享同一个键),不支持通过 YAML 文件配置 unicast_master_table
。
确保和调试配置文件的正确性
前面的章节描述了配置文件定义的 2 个层
基本配置文件 – 内置配置文件或自定义配置文件
向 YAML 文件添加值/从 YAML 文件覆盖值
实际上,有稍微更多的层到位,优先级如下(按升序排列)
PTP 程序(例如 ptp4l)的默认配置值 – 保存所有可用配置选项的值
您选择的配置文件 – 包含选项的子集
YAML 文件中的定义 – 更窄的子集
Firefly 强制值
当将提供的配置文件与 YAML 文件中的定义结合使用时,Firefly 会遍历这些定义,并根据预定义的配置选项集检查它们
仅警告 – 如果某个值在支持的部署场景中导致已知问题,则发出警告
覆盖 – 不应由用户设置且将由 Firefly 覆盖的容器内部定义
在这两种情况下都提供了合适的日志消息
# Example for a warning
2023-01-31 11:55:13 - Firefly - Config - INFO - Missing explicit definition "fault_reset_interval", verifying default value instead: "4"
2023-01-31 11:55:13 - Firefly - Config - WARNING - Value "4" for definition "fault_reset_interval" will be invalid in Embedded Mode, expected a value lesser or equal to "1"
2023-01-31 11:55:13 - Firefly - Config - WARNING - Continuing with invalid value
# Example for an override
2023-01-31 11:21:00 - Firefly - Config - WARNING - Invalid value "/var/run/ptp4l2" for definition "uds_address", expected "/var/run/ptp4l"
2023-01-31 11:21:00 - Firefly - Config - INFO - Setting definition "uds_address" value to the following: "/var/run/ptp4l"
在此过程结束时,Firefly 生成一个更新的配置文件,供稍后由各种时间提供程序使用。为了避免意外修改用户提供的配置文件或权限问题,最终文件在容器内的 /tmp
目录下生成。
例如,如果在 DPU 上的 /etc/firefly
目录下使用名为 my_custom_ptp.conf
的自定义配置文件,则更新后的文件将位于容器内的以下路径:/tmp/my_custom_ptp.conf
。
为了排除配置文件可能存在的问题,可以执行以下操作之一
使用 YAML 文件中的内置支持将容器的
/tmp
目录映射到 DPU更改前
# Uncomment when debugging the finalized configuration files used - Part #
1
#- name: debug-firefly-volume # hostPath: # path: /tmp/firefly # type: DirectoryOrCreate containers: ... volumeMounts: - name: logs-firefly-volume mountPath: /var/log/firefly - name: conf-firefly-volume mountPath: /etc/firefly # Uncomment when debugging the finalized configuration files used - Part #2
#- name: debug-firefly-volume # mountPath: /tmp更改后
# Uncomment when debugging the finalized configuration files used - Part #
1
- name: debug-firefly-volume hostPath: path: /tmp/firefly type: DirectoryOrCreate containers: ... volumeMounts: - name: logs-firefly-volume mountPath: /var/log/firefly - name: conf-firefly-volume mountPath: /etc/firefly # Uncomment when debugging the finalized configuration files used - Part #2
- name: debug-firefly-volume mountPath: /tmp
最终配置文件保持节和配置选项与原始文件中出现的顺序相同,但文件中去除了多余的换行符或注释行。在调试会话期间直接访问它时,应考虑这一点。
提供程序
DOCA Firefly 服务使用以下第三方提供程序来提供时间同步服务
Linuxptp - 版本 v4.2
PTP
– PTP 服务,由 PTP4L 程序提供PHC2SYS
– 操作系统时间校准,由 PHC2SYS 程序提供
Testptp
PPS
- PPS 设置服务
此外,DOCA Firefly 服务还使用以下 NVIDIA 模块
SyncE
SYNCE
– 同步以太网守护程序 (synced
)
Firefly
MONITOR
- Firefly PTP 监控器
Firefly
SERVO
- Firefly PTP 伺服
每个提供程序都可以启用、禁用或设置为使用配置概况定义的设置
YAML 设置 –
<provider name>_STATE
支持的值 –
enable
、disable
、defined_by_profile
有关每个提供程序的默认配置概况设置,请参阅“配置概况”部分下的表格。
以下是专门禁用 phc2sys
提供程序的 YAML 设置示例
- name: PHC2SYS_STATE
value: "disable"
defined_by_profile
设置仅适用于明确定义的配置概况。因此,当选择 custom
配置概况时,无法使用它。有关配置概况设置的更多信息,请参阅“配置概况”部分下的表格。
配置概况
DOCA Firefly 服务包含配置概况,这些配置概况代表 Firefly 服务的常见用例,每个配置概况提供不同的默认配置
默认 | 媒体 | 电信 (L2) | 自定义 | |
用途 | 需要 PTP 的任何用户 | 媒体制作 | 电信网络 | 针对专用用户场景的自定义配置 |
PTP | 已启用 | 已启用 | 已启用 | 无默认值。应由用户设置启用/禁用。 |
PTP 配置概况 | PTP 默认配置概况 | SMPTE 2059-2 | G.8275.1 | 由用户设置 |
PTP 客户端/服务器 1 | 两者 | 仅客户端 | 两者 | 由用户设置 |
PHC2SYS | 已启用 | 已启用 | 已启用 | 无默认值。应由用户设置启用/禁用。 |
PPS(输入/输出) | 已启用 | 已启用 | 已启用 | 无默认值。应由用户设置启用/禁用。 |
PTP 监控器 | 已禁用 | 已禁用 | 已禁用 | 无默认值。应由用户设置启用/禁用。 |
SyncE | 已禁用 | 已禁用 | 已启用 | 无默认值。应由用户设置启用/禁用。 |
伺服 | 已禁用 | 已禁用 | 已禁用 | 无默认值。应由用户设置启用/禁用。 |
输出
容器输出
运行时,可以使用以下命令查看 DOCA Firefly 服务容器的完整输出
sudo
crictl logs <CONTAINER-ID>
其中 CONTANIER-ID
可以使用以下命令检索
sudo
crictl ps
例如,在以下输出中,容器 ID 为 8f368b98d025b
。
$ sudo
crictl ps
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID POD
8f368b98d025b 289809f312b4c 2 seconds ago Running doca-firefly 0 5af59511b4be4 doca-firefly-some-computer-name
容器的输出取决于硬件支持的服务、配置启用的服务以及选择的配置概况。但是,请注意,任何配置都运行 PTP,因此当 DOCA FireFly 成功运行时,预计会看到行“Running ptp4l
”。
以下是在支持 PPS 的 DPU 上运行默认配置概况时,预期的容器输出示例
2023-09-07 14:04:23 - Firefly - Init - INFO - Starting DOCA Firefly - Version 1.4.0
2023-09-07 14:04:23 - Firefly - Init - INFO - Selected features:
2023-09-07 14:04:23 - Firefly - Init - INFO - [+] PTP - Enabled - ptp4l will be used
2023-09-07 14:04:23 - Firefly - Init - INFO - [+] MONITOR - Enabled - PTP Monitor will be used
2023-09-07 14:04:23 - Firefly - Init - INFO - [+] PHC2SYS - Enabled - phc2sys will be used
2023-09-07 14:04:23 - Firefly - Init - INFO - [-] SyncE - Disabled
2023-09-07 14:04:23 - Firefly - Init - INFO - [-] SERVO - Disabled
2023-09-07 14:04:23 - Firefly - Init - INFO - [+] PPS - Enabled - testptp will be used (if supported by hardware)
2023-09-07 14:04:23 - Firefly - Init - INFO - Going to analyze the configuration files
2023-09-07 14:04:23 - Firefly - Init - INFO - Requested the following PTP interface: p0
2023-09-07 14:04:23 - Firefly
2023-09-07 14:04:23 - Firefly - Init - INFO - Starting PPS configuration
2023-09-07 14:04:23 - Firefly - Init - INFO - [+] PPS is supported by hardware
2023-09-07 14:04:23 - Firefly - Init - INFO - set pin function okay
2023-09-07 14:04:23 - Firefly - Init - INFO - [+] PPS in - Activated
2023-09-07 14:04:23 - Firefly - Init - INFO - set pin function okay
2023-09-07 14:04:23 - Firefly - Init - INFO - [+] PPS out - Activated
2023-09-07 14:04:23 - Firefly - Init - INFO - name mlx5_pps0 index 0 func 1 chan 0
2023-09-07 14:04:23 - Firefly - Init - INFO - name mlx5_pps1 index 1 func 2 chan 0
2023-09-07 14:04:23 - Firefly - Init - INFO - periodic output request okay
2023-09-07 14:04:23 - Firefly
2023-09-07 14:04:23 - Firefly - Init - INFO - Running ptp4l
2023-09-07 14:04:23 - Firefly - Init - INFO - Running Firefly PTP Monitor
2023-09-07 14:04:23 - Firefly - Init - INFO - Running phc2sys
以下是在不支持 PPS 的 DPU 上运行默认配置概况时,预期的容器输出示例
2023-09-07 14:04:23 - Firefly - Init - INFO - Starting DOCA Firefly - Version 1.3.0
2023-09-07 14:04:23 - Firefly - Init - INFO - Selected features:
2023-09-07 14:04:23 - Firefly - Init - INFO - [+] PTP - Enabled - ptp4l will be used
2023-09-07 14:04:23 - Firefly - Init - INFO - [+] MONITOR - Enabled - PTP Monitor will be used
2023-09-07 14:04:23 - Firefly - Init - INFO - [+] PHC2SYS - Enabled - phc2sys will be used
2023-09-07 14:04:23 - Firefly - Init - INFO - [-] SyncE - Disabled
2023-09-07 14:04:23 - Firefly - Init - INFO - [-] SERVO - Disabled
2023-09-07 14:04:23 - Firefly - Init - INFO - [+] PPS - Enabled - testptp will be used (if supported by hardware)
2023-09-07 14:04:23 - Firefly - Init - INFO - Going to analyze the configuration files
2023-09-07 14:04:23 - Firefly - Init - INFO - Requested the following PTP interface: p0
2023-09-07 14:04:23 - Firefly
2023-09-07 14:04:23 - Firefly - Init - INFO - Starting PPS configuration
2023-09-07 14:04:23 - Firefly - Init - WARNING - [-] PPS capability is missing, seems that the card doesn't support PPS
2023-09-07 14:04:23 - Firefly - Init - INFO - capabilities:
2023-09-07 14:04:23 - Firefly - Init - INFO - 50000000 maximum frequency adjustment (ppb)
2023-09-07 14:04:23 - Firefly - Init - INFO - 0 programmable alarms
2023-09-07 14:04:23 - Firefly - Init - INFO - 0 external time stamp channels
2023-09-07 14:04:23 - Firefly - Init - INFO - 0 programmable periodic signals
2023-09-07 14:04:23 - Firefly - Init - INFO - 0 pulse per second
2023-09-07 14:04:23 - Firefly - Init - INFO - 0 programmable pins
2023-09-07 14:04:23 - Firefly - Init - INFO - 0 cross timestamping
2023-09-07 14:04:23 - Firefly
2023-09-07 14:04:23 - Firefly - Init - INFO - Running ptp4l
2023-09-07 14:04:23 - Firefly - Init - INFO - Running Firefly PTP Monitor
2023-09-07 14:04:23 - Firefly - Init - INFO - Running phc2sys
Firefly 输出
除了容器的日志之外,Firefly 还定义了一个额外的非易失性日志,可以在 /var/log/doca/firefly/firefly.log
中找到。
此文件包含“容器输出”部分中描述的相同输出,并且在容器停止执行时,对于调试部署错误很有用。
为了避免磁盘空间问题,/var/log/doca/firefly/firefly.log
文件仅包含 Firefly 初始化时的日志,而不包含其余模块(ptp4l、phc2sys 等)或 PTP 监控器的日志。后者仍包含在容器日志中,可以使用命令 sudo crictl logs <CONTAINER-ID>
进行检查。
ptp4l 输出
ptp4l 输出可以在文件 /var/log/doca/firefly/ptp4l.log
中找到。
示例输出
ptp4l[192710.691]: rms 1 max 1 freq -114506 +/- 0 delay -15 +/- 0
ptp4l[192712.692]: rms 6 max 9 freq -114501 +/- 3 delay -15 +/- 0
ptp4l[192714.692]: rms 7 max 9 freq -114511 +/- 3 delay -13 +/- 0
ptp4l[192716.692]: rms 5 max 7 freq -114502 +/- 1 delay -13 +/- 0
ptp4l[192718.693]: rms 4 max 6 freq -114509 +/- 2 delay -13 +/- 0
ptp4l[192720.693]: rms 3 max 3 freq -114506 +/- 2 delay -13 +/- 0
ptp4l[192722.694]: rms 4 max 6 freq -114510 +/- 3 delay -12 +/- 0
ptp4l[192724.694]: rms 5 max 7 freq -114510 +/- 5 delay -12 +/- 1
ptp4l[192726.695]: rms 4 max 5 freq -114508 +/- 3 delay -11 +/- 0
ptp4l[192728.695]: rms 6 max 9 freq -114504 +/- 4 delay -11 +/- 0
phc2sys 输出
phc2sys 输出可以在文件 /var/log/doca/firefly/phc2sys.log
中找到。
示例输出
phc2sys[1873325.928]: reconfiguring after port state change
phc2sys[1873325.928]: selecting CLOCK_REALTIME for synchronization
phc2sys[1873325.928]: selecting enp3s0f0s4 as the master clock
phc2sys[1873325.928]: CLOCK_REALTIME phc offset 1378 s2 freq -165051 delay 255
phc2sys[1873326.928]: CLOCK_REALTIME phc offset 1378 s2 freq -163673 delay 240
phc2sys[1873327.928]: port 62b785.fffe.0c9369-1 changed state
phc2sys[1873327.929]: CLOCK_REALTIME phc offset 14 s2 freq -164624 delay 255
phc2sys[1873328.936]: CLOCK_REALTIME phc offset 89 s2 freq -164545 delay 240
SyncE 输出
SyncE 输出可以在文件 /var/log/doca/firefly/synced.log
中找到。
示例输出
INFO [05/09/2023 05:11:01.493414]: SyncE Group #0: is in TRACKING holdover acquired mode on p0, frequency_diff: 0 (ppb)
INFO [05/09/2023 05:11:02.502963]: SyncE Group #0: is in TRACKING holdover acquired mode on p0, frequency_diff: -113 (ppb)
INFO [05/09/2023 05:11:03.512491]: SyncE Group #0: is in TRACKING holdover acquired mode on p0, frequency_diff: 37 (ppb)
SYNCE
模块输出的详细程度默认受到限制。要将输出设置为更详细,请将 verbose
选项设置为 1
(真)。
之前
# Example #4
- Overwrite the value of verbose in the [global] section of the SyncE configuration file.
#- name: CONF_SYNCE_global_verbose
# value: "1"
之后
# Example #4
- Overwrite the value of verbose in the [global] section of the SyncE configuration file.
- name: CONF_SYNCE_global_verbose
value: "1"
Firefly 伺服输出
Firefly 伺服输出可以在文件 /var/log/doca/firefly/servo.log
中找到。
示例输出
2024-03-18 09:04:22 - Firefly - SERVO - INFO - offset +8 +/- 2 freq -5.66 +/- 0.41 delay -48 +/- 2
2024-03-18 09:04:24 - Firefly - SERVO - INFO - offset +4 +/- 2 freq -6.35 +/- 0.36 delay -47 +/- 2
2024-03-18 09:04:26 - Firefly - SERVO - INFO - offset +2 +/- 2 freq -6.75 +/- 0.41 delay -47 +/- 1
2024-03-18 09:04:28 - Firefly - SERVO - INFO - offset +0 +/- 2 freq -6.97 +/- 0.35 delay -47 +/- 1
2024-03-18 09:04:30 - Firefly - SERVO - INFO - offset +0 +/- 3 freq -7.30 +/- 0.60 delay -47 +/- 1
2024-03-18 09:04:33 - Firefly - SERVO - INFO - offset +1 +/- 2 freq -6.93 +/- 0.41 delay -47 +/- 1
2024-03-18 09:04:35 - Firefly - SERVO - INFO - offset +1 +/- 2 freq -6.81 +/- 0.48 delay -47 +/- 1
2024-03-18 09:04:37 - Firefly - SERVO - INFO - offset +2 +/- 2 freq -6.76 +/- 0.52 delay -48 +/- 2
DPU 模式下的 Tx 时间戳支持
当 BlueField 在 DPU 模式下运行时,需要额外的 OVS 配置,如“为 DPU 模式设置网络接口”部分的步骤 6 中所述。此配置实现以下目的
正确支持传入/传出多播流量
启用 Tx 时间戳
仅当传出 PTP 消息(Tx 时间戳)卸载到硬件时,Firefly 才会获得数据包时间戳。因此,当与 OVS 一起使用时,用户必须确保此流量流得到正确识别和卸载。如果未发生卸载,Firefly 会陷入故障循环,同时等待接收 Tx 时间戳事件
ptp4l[2912.797]: timed out while polling for tx timestamp
ptp4l[2912.797]: increasing tx_timestamp_timeout may correct this issue, but it is likely caused by a driver bug
ptp4l[2912.797]: port 1 (enp3s0f0s4): send sync failed
ptp4l[2923.528]: timed out while polling for tx timestamp
ptp4l[2923.528]: increasing tx_timestamp_timeout may correct this issue, but it is likely caused by a driver bug
ptp4l[2923.528]: port 1 (enp3s0f0s4): send sync failed
此问题的解决方案
在 OVS 中激活硬件卸载
OpenFlow 规则,确保 OVS 正确识别流量并将其卸载到硬件
修改
fault_reset_interval
配置值,以确保从始终由软件处理的第一个数据包引起的故障中及时恢复(直到规则卸载到硬件)。因此,Firefly 要求fault_reset_interval
值小于等于 1。如果检测到不正确的值,则会发出适当的警告。该值会在内置配置概况中相应更新。
当这些配置就绪后,Firefly 会在启动期间包含单个故障报告,但会从中恢复并照常继续
ptp4l[3715.687]: timed out while polling for tx timestamp
ptp4l[3715.687]: increasing tx_timestamp_timeout may correct this issue, but it is likely caused by a driver bug
ptp4l[3715.687]: port 1 (enp3s0f0s4): send delay request failed
排除 Tx 时间戳问题
如前所述,需要多个层来确保 Tx 时间戳按 Firefly 的要求工作。以下是调试每一层状态的命令列表
检查 OpenFlow 规则
$ sudo ovs-ofctl dump-flows uplink cookie=0x0, duration=4075.576s, table=0, n_packets=2437, n_bytes=209582, udp,in_port=en3f0pf0sf4,tp_src=319 actions=output:p0 cookie=0x0, duration=4075.549s, table=0, n_packets=1216, n_bytes=109420, udp,in_port=p0,tp_src=319 actions=output:en3f0pf0sf4 cookie=0x0, duration=4075.521s, table=0, n_packets=13, n_bytes=1242, udp,in_port=en3f0pf0sf4,tp_src=320 actions=output:p0 cookie=0x0, duration=4074.604s, table=0, n_packets=3034, n_bytes=297376, udp,in_port=p0,tp_src=320 actions=output:en3f0pf0sf4 cookie=0x0, duration=4075.856s, table=0, n_packets=184, n_bytes=12901, priority=0 actions=NORMAL
在 DOCA Firefly 部署时检查硬件 TC 规则(规则在没有流量的情况下 10 秒后老化)
$ sudo tc -s -d filter show dev en3f0pf0sf4 egress filter ingress protocol ip pref 4 flower chain 0 filter ingress protocol ip pref 4 flower chain 0 handle 0x1 eth_type ipv4 ip_proto udp src_port 320 ip_flags nofrag in_hw in_hw_count 1 action order 1: mirred (Egress Redirect to device p0) stolen index 3 ref 1 bind 1 installed 7 sec used 7 sec Action statistics: Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0 cookie bec8bd6ede4e86341e9045a6edb58ca2 no_percpu filter ingress protocol ip pref 4 flower chain 0 handle 0x2 eth_type ipv4 ip_proto udp src_port 319 ip_flags nofrag in_hw in_hw_count 1 action order 1: mirred (Egress Redirect to device p0) stolen index 4 ref 1 bind 1 installed 6 sec used 6 sec Action statistics: Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0 cookie c568d97efd400de98608fbbf86ccdf3c no_percpu
注意如果在 Firefly 运行时不存在 TC 规则,这通常表示硬件卸载在 OVS 级别被禁用,在这种情况下,应按照“确保 OVS 硬件卸载”下的说明激活硬件卸载。
PTP
Firefly 使用 ptp4l
实用程序来处理精确时间协议 (IEEE 1588)。
通过 YAML 文件,用户可以配置用于协议的网络接口
# Network interfaces to be used (For multiple interfaces use a space (" "
) separated list)
- name: PTP_INTERFACE
# Set according to used interfaces on the local setup
value: "p0"
在部署容器之前,用户应配置此字段以指向先前步骤中配置的所需网络接口。
PHC2SYS
Firefly 使用 phc2sys
实用程序将 OS 的时钟同步到 ptp4l
接收的精确时间戳。
通过 YAML 文件,用户可以配置 phc2sys
程序使用的命令行参数
- name: PHC2SYS_ARGS
value: "-a -r"
Firefly 在用户选择的标志之上添加以下命令行参数
使用选择的配置文件(默认情况下为空配置文件,或者如果 YAML 文件中指定了用户提供的文件)
使用
-m
命令行选项将输出重定向到日志文件
phc2sys
必须使用与 ptp4l
使用的相同的 domainNumber
设置。如果用户未设置相同的 domainNumber
,Firefly 会自动执行此操作。
仅当禁用其他计时服务(如 NTP)时,phc2sys
才能准确同步托管环境(通常是 DPU,但也可能是主机(如果部署在那里))的时钟。
因此,例如,在 Ubuntu 22.04 上,用户必须通过运行以下命令来确保禁用 NTP 计时服务
systemctl stop systemd-timesyncd
SYNCE
Firefly 使用专有的 synced
实用程序来实现 同步以太网 协议,旨在确保时钟频率与参考时钟同步。一旦实现,两个时钟都声明为“同步”。
通过 YAML 文件,用户可以配置用于协议的网络接口
# Network interfaces to be used (For multiple interfaces use a space (" "
) separated list)
- name: SYNCE_INTERFACE
# Set according to used interfaces on the local setup
value: "p0"
在部署容器之前,应配置此字段以指向先前步骤中配置的所需网络接口。
DOCA 包括对 "dpll"
后端(默认)的 synced 支持,这增加了对 SF 和 VF 的支持。"dpll"
后端是使用的默认后端。如果 DOCA 检测到系统不支持它,它将自动回退到 "mft"
后端。
在内核 6.8 或 BlueField 平台软件 2.8.0 之前的版本中,仅支持 PF,并且仅使用 "mft"
后端。
可以使用 YAML 文件通过取消注释以下行来显式设置后端选项
之前 |
|
之后 |
|
以下是使用 "dpll"
后端在 SF 之上路由 SyncE 相关流量所需的 OVS 命令示例
$ sudo
ovs-ofctl add-flow uplink dl_dst=01:80:c2:00:00:02,in_port=en3f0pf0sf4,actions=p0
$ sudo
ovs-ofctl add-flow uplink dl_dst=01:80:c2:00:00:02,in_port=p0,actions=en3f0pf0sf4
$ sudo
ovs-ofctl add-flow uplink dl_dst=01:80:c2:00:00:02,actions=controller
此示例使用指南前面使用的相同 OVS 设置
uplink
– 网桥名称en3f0pf0sf4
– SF 代表器p0
– 我们正在工作的 PF 接口(端口 0)
如果您的部署使用不同的值,请确保相应地调整上述命令。
如果内核版本尚不支持此功能,并且使用了 SF/VF,则会打印以下错误
...
mlx5 DPLL kernel support appears to be missing
Falling back to MFT tools backend
...
如果显示此错误,则只能使用 PF,并且 synced
会回退到使用 "mft"
后端。
PTP 监控器
PTP 监控器定期查询各种 PTP 相关信息,并将其打印到容器的日志中。
以下是此工具的示例输出
gmIdentity: 48
:B0:2D:FF:FE:5C:4D:24
(48b02d.fffe.5c4d24)
portIdentity: 48
:B0:2D:FF:FE:5C:53
:44
(48b02d.fffe.5c5344-1
)
port_state: Active
domainNumber: 2
master_offset: avg: 1
max: -8
rms: 3
gmPresent: true
ptp_stable: Recovered
UtcOffset: 37
timeTraceable: 0
frequencyTraceable: 0
grandmasterPriority1: 128
gmClockClass: 248
gmClockAccuracy: 0x6
grandmasterPriority2: 128
gmOffsetScaledLogVariance: 0xffff
ptp_time (TAI): Thu Sep 7
11
:22
:50
2023
ptp_time (UTC adjusted): Thu Sep 7
11
:22
:13
2023
system_time (UTC): Thu Sep 7
11
:22
:13
2023
error_count: 1
last_err_time (UTC): Thu Sep 7
09
:55
:48
2023
除其他外,此监控提供以下信息
关于 DPU 与之同步的主时钟的详细信息
当前 PTP 时间戳
运行期间的连接错误以及是否已从中恢复等运行状况信息
PTP 监控默认禁用,可以通过将 disable
值替换为要使用的监控服务器的 IP 地址来激活
- name: MONITOR_STATE
Value: "<IP address for the monitoring server>"
激活后,可以使用以下命令从容器中查看信息
sudo
crictl logs --tail
=20 <CONTAINER-ID>
建议使用以下 watch
命令来主动监控 PTP 状态
sudo
watch
-n 1 crictl logs --tail
=20 <CONTAINER-ID>
在诊断部署问题时,可以在监视器的开发者日志中找到额外的日志信息:/var/log/doca/firefly/firefly_monitor_dev.log
。
监控功能连接到 ptp4l 的本地 UDS 服务器以查询必要的信息。 这就是配置管理器阻止用户修改容器内 ptp4l 使用的 uds_address
和 uds_ro_address
字段的原因。
配置
PTP 监视器支持配置选项,这些选项像 DOCA Firefly 的其余模块一样,通过专用的配置文件传递。 内置监视器配置文件可以在“PTP 监视器”部分中找到。 为了便于使用,该文件也作为从 NGC 下载的 DOCA 容器资源的一部分提供。
“Firefly 模块配置选项”包含对每个配置选项及其默认值的完整解释。
要设置自定义配置文件,用户应在 /etc/firefly
目录中找到其配置文件,并在 DOCA Firefly 的 YAML 文件中设置配置文件名称。
- name: MONITOR_CONFIG_FILE
value: my_custom_monitor.conf
在此示例中,my_custom_monitor.conf
应放置在 /etc/firefly/my_custom_monitor.conf
。
时间表示 (PTP 时间 vs 系统时间)
在大多数部署场景中,监视器显示的 PTP 时间根据国际原子时 (TAI) 标准显示,而系统时间通常使用协调世界时 (UTC)。 由于这些时间表示模型之间的差异,监视器提供 2 种不同的时间读数(每种都相应地标记)。
...
UtcOffset: 37
...
ptp_time (TAI): Thu Sep 7 11:22:50 2023
ptp_time (UTC adjusted): Thu Sep 7 11:22:13 2023
system_time (UTC): Thu Sep 7 11:22:13 2023
这种差异(在上面的示例中为 37 秒)是故意的,并且源于自 epoch 以来的闰秒数。 这由 UtcOffset
字段指示,该字段也包含在监视器的报告中。
监控服务器
除了将监控数据打印到可通过容器日志访问的容器标准输出外,监控数据还通过 gRPC 服务器公开,客户端可以订阅该服务器。 这允许主机上的监控客户端订阅 DPU 之上运行的服务中的监控事件,从而提供更好的可见性。
下图展示了将监控客户端(在主机上)连接到监控服务器(在 DPU 上)的推荐部署架构。

基于以上内容,当激活监视器功能时,用户必须提供监视器服务器要使用的 IP 地址。
- name: MONITOR_STATE
value: "<IP address for the monitoring server>"
用户可以选择仅通过容器日志查看监控事件,而无需连接到监控服务器。 在这种情况下,建议在 YAML 文件中配置本地主机 IP 地址 (127.0.0.1),以避免将其暴露给不需要的网络。
监控客户端
监视器客户端所需的文件在服务的专用 NGC 资源“scripts”目录下提供。
从 Linux 主机执行基于 python 的监视器客户端的命令行示例
$ sudo pip3 install click protobuf grpcio
$ ./doca_firefly_monitor_client.py <ip-address-for
-the-monitoring-server>
Firefly 监视器使用的参考源文件和 .proto
文件放置在 NGC 资源内的 src/
下。
遥测导出
除了允许客户端订阅监控事件的馈送之外,PTP 监视器服务器还支持将事件主动导出到 DOCA Telemetry Service (DTS)。 在这种情况下,用户应将 DTS 部署到部署 DOCA Firefly 的机器(主机/DPU)上,然后使用以下步骤激活“遥测导出”
通过 YAML 文件启用所需的文件挂载
之前
... # Uncomment when using the telemetry features with DTS - Part #
1
#- name: ipc-sockets-volume # hostPath: # path: /opt/mellanox/doca/services/telemetry/ipc_sockets # type: DirectoryOrCreate #- name: shared-memory # hostPath: # path: /dev/shm/telemetry # type: DirectoryOrCreate containers: - name: doca-firefly ... # Uncomment when debugging the finalized configuration files used - Part #2
#- name: debug-firefly-volume # mountPath: /tmp # Uncomment when using the telemetry features with DTS - Part #2
#- name: ipc-sockets-volume # mountPath: /opt/mellanox/doca/services/telemetry/ipc_sockets #- name: shared-memory # mountPath: /dev/shm ...之后
... # Uncomment when using the telemetry features with DTS - Part #
1
- name: ipc-sockets-volume hostPath: path: /opt/mellanox/doca/services/telemetry/ipc_sockets type: DirectoryOrCreate - name: shared-memory hostPath: path: /dev/shm/telemetry type: DirectoryOrCreate containers: - name: doca-firefly ... # Uncomment when debugging the finalized configuration files used - Part #2
#- name: debug-firefly-volume # mountPath: /tmp # Uncomment when using the telemetry features with DTS - Part #2
- name: ipc-sockets-volume mountPath: /opt/mellanox/doca/services/telemetry/ipc_sockets - name: shared-memory mountPath: /dev/shm ...通过配置将
1
的配置值传递给telemetry_export
。 这可以很容易地直接通过 YAML 文件完成之前
... # Example #
7
- Activate the monitor telemetry export feature (export through DTS). #- name: CONF_MONITOR_global_telemetry_export # value:"1"
...之后
... # Example #
7
- Activate the monitor telemetry export feature (export through DTS). - name: CONF_MONITOR_global_telemetry_export value:"1"
...激活后,日志消息应指示导出功能的可用性(该功能使用 DOCA Telemetry Exporter 库)
...
2024
-09
-05
06
:22
:08
- Firefly - MONITOR - INFO - Monitor records will also be exported via DOCA Telemetry Exporter ...
当通过 DTS 在本地调试遥测信息时,务必记住激活数据写入器(存储输出),如 DOCA Telemetry Service Guide 中所述。
有关可视化通过 DTS 导出的信息的更多信息,请参阅有关将 Grafana 与 DTS 一起使用的示例。
Firefly 伺服
Firefly 的 Servo 模块可以看作是 linuxptp
提供的内置伺服系统的扩展。 激活后,linuxptp
会自动设置为“自由运行”,并且对物理硬件时钟 (PHC) 的控制权将移交给 Firefly 自己的伺服系统。
以下是使用 l2-telco
配置文件(每秒 16 条消息)时,此工具的示例输出
2024
-03
-18
07
:46
:45
- Firefly - SERVO - INFO - Detected new
master clock: 48b02d.fffe.5c4d24-1
2024
-03
-18
07
:46
:45
- Firefly - SERVO - INFO - Transition from servo state IDLE to FREE_RUNNING
2024
-03
-18
07
:46
:47
- Firefly - SERVO - INFO - Estimated a logSyncInterval of: -4
2024
-03
-18
07
:46
:47
- Firefly - SERVO - INFO - Measured offset 18691
delay -47
2024
-03
-18
07
:46
:48
- Firefly - SERVO - INFO - Transition from servo state FREE_RUNNING to LOCKED
2024
-03
-18
07
:46
:50
- Firefly - SERVO - INFO - offset +164
+/- 164
freq -1.50
+/- 0.00
delay -48
+/- 1
2024
-03
-18
07
:46
:52
- Firefly - SERVO - INFO - Transition from servo state LOCKED to LOCKED_STABLE
2024
-03
-18
07
:46
:52
- Firefly - SERVO - INFO - offset +0
+/- 1
freq -1.41
+/- 0.47
delay -48
+/- 1
2024
-03
-18
07
:46
:54
- Firefly - SERVO - INFO - offset -8
+/- 4
freq -4.21
+/- 1.40
delay -47
+/- 1
2024
-03
-18
07
:46
:57
- Firefly - SERVO - INFO - offset -12
+/- 2
freq -5.46
+/- 0.73
delay -47
+/- 1
2024
-03
-18
07
:46
:59
- Firefly - SERVO - INFO - offset -13
+/- 2
freq -6.13
+/- 0.65
delay -47
+/- 1
2024
-03
-18
07
:47
:01
- Firefly - SERVO - INFO - offset -13
+/- 3
freq -6.19
+/- 1.23
delay -47
+/- 2
2024
-03
-18
07
:47
:03
- Firefly - SERVO - INFO - offset -19
+/- 2
freq -8.04
+/- 0.96
delay -47
+/- 1
2024
-03
-18
07
:47
:06
- Firefly - SERVO - INFO - offset -14
+/- 3
freq -6.46
+/- 1.11
delay -47
+/- 1
2024
-03
-18
07
:47
:08
- Firefly - SERVO - INFO - offset -16
+/- 2
freq -7.32
+/- 0.78
delay -48
+/- 2
2024
-03
-18
07
:47
:10
- Firefly - SERVO - INFO - offset -15
+/- 2
freq -7.11
+/- 0.87
delay -47
+/- 2
2024
-03
-18
07
:47
:12
- Firefly - SERVO - INFO - offset -14
+/- 1
freq -6.74
+/- 0.57
delay -47
+/- 2
2024
-03
-18
07
:47
:15
- Firefly - SERVO - INFO - offset -12
+/- 3
freq -6.20
+/- 1.01
delay -48
+/- 1
2024
-03
-18
07
:47
:17
- Firefly - SERVO - INFO - offset -13
+/- 2
freq -6.40
+/- 0.89
delay -47
+/- 1
2024
-03
-18
07
:47
:19
- Firefly - SERVO - INFO - offset -11
+/- 2
freq -5.98
+/- 0.86
delay -48
+/- 1
2024
-03
-18
07
:47
:21
- Firefly - SERVO - INFO - offset -10
+/- 2
freq -5.75
+/- 0.87
delay -46
+/- 1
2024
-03
-18
07
:47
:24
- Firefly - SERVO - INFO - offset -8
+/- 1
freq -5.15
+/- 0.42
delay -47
+/- 1
可以看出,伺服系统的行为与 linuxptp
的 ptp4l
相似,并且由一个状态机组成,该状态机跟踪活动 PTP 端口的状态(FREE_RUNNING
、LOCKED
、LOCKED_STABLE
等)。
Firefly 的 Servo 默认禁用(在所有配置文件中),可以通过将 define_by_profile
值替换为 enable
来激活
# Activation status
- name: SERVO_STATE
# Options are "enable"
/"disable"
/"defined_by_profile"
value: "enable"
激活后,可以从模块的日志文件 /var/log/doca/firefly/servo.log
中查看信息。
Firefly 伺服配置
Firefly 的 Servo 当前旨在用于与电信相关的部署,使用 l2-telco
配置文件,包括使用 SyncE。 因此,内置配置文件中的默认值针对这些场景进行了优化。
伺服系统支持配置选项,这些选项像 DOCA Firefly 的其余模块一样,通过专用的配置文件传递。 内置伺服系统配置文件可以在“Firefly Servo”部分中找到。 为了便于使用,该文件也作为从 NGC 下载的 DOCA 容器资源的一部分提供。
“Firefly 模块配置选项”包含对每个配置选项及其默认值的完整解释。
要设置自定义配置文件,用户应在 /etc/firefly
目录中找到其配置文件,并在 DOCA Firefly 的 YAML 文件中设置配置文件名称。
- name: SERVO_CONFIG_FILE
value: my_custom_servo.conf
在此示例中,my_custom_servo.conf
应放置在 /etc/firefly/my_custom_servo.conf
。
动态数据包速率支持
伺服系统能够动态检测 PTP 主时钟使用的包速率,以便根据需要校准自身,以防其与建议的每秒 16 个数据包不同。
2024
-03
-18
07
:46
:45
- Firefly - SERVO - INFO - Transition from servo state IDLE to FREE_RUNNING
2024
-03
-18
07
:46
:47
- Firefly - SERVO - INFO - Estimated a logSyncInterval of: -4
2024
-03
-18
07
:46
:47
- Firefly - SERVO - INFO - Measured offset 18691
delay -47
如果消息速率是恒定的并且事先已知,则可以禁用动态估计,而支持提供的消息速率
- name: CONF_SERVO_global_servo_const_log_sync_interval
value: "-2"
在上面的示例中,将使用每秒 4 个数据包的固定消息速率(logSyncInterval 为“-2”)。
虽然伺服系统经过测试可以在各种数据包速率(2、4、8、16、32、64、128)下产生稳定的结果,但仅正式建议在使用每秒 16 个数据包的数据包速率的部署中使用。
VLAN 标记
DOCA Firefly 原生支持启用 VLAN 标记的网络接口。
分离模式
启用 VLAN 的网络接口的名称应是通过 YAML 文件在 PTP_INTERFACE
字段中传递的名称。
嵌入式模式
除了在前一部分列出的通过 YAML 传递启用 VLAN 的接口之外,用户还需要配置 DPU 内的网络路由以支持 VLAN 标记
以下示例将 VLAN 标签 10 配置到
enp3s0f0s4
接口$
sudo
ip link add link enp3s0f0s4 name enp3s0f0s4.10type
vlanid
10 $sudo
ip linkset
up enp3s0f0s4.10 $sudo
ifconfig
enp3s0f0s4.10 192.168.104.1 up在此示例中,
enp3s0f0s4.10
是要传递给 DOCA Firefly 的接口。在 DPU 内路由流量的其他命令
$
sudo
ovs-ofctl add-flow uplink in_port=en3f0pf0sf4,dl_vlan=10,actions=output:p0 $sudo
ovs-ofctl add-flow uplink in_port=p0,dl_vlan=10,actions=output:en3f0pf0sf4
多个接口
DOCA Firefly 可以通过以下 YAML 文件语法支持多个网络接口
- name: PTP_INTERFACE
value: "<space (' ') separated list of interface names>"
例如
- name: PTP_INTERFACE
value: "p0 p1"
仅当启用 clientOnly
配置时,才支持多接口的监控功能。
使用多个接口时,不支持 phc2sys
的自动模式 (-a
)。 建议在此模式下禁用 phc2sys
。
在对容器部署问题进行故障排除时,强烈建议遵循NVIDIA DOCA Container Deployment Guide的“查看容器部署”部分中的部署步骤和技巧。
要调试 Firefly 使用的最终配置文件,用户可以按如下方式连接到容器
使用容器 ID 在正在运行的容器上打开 shell 会话
sudo
crictlexec
-it <container-id
> /bin/bash连接到容器后,可以在
/tmp
目录下找到最终的配置文件,文件名与原始配置文件相同。信息有关配置文件的更多信息,请参见“确保和调试配置文件的正确性”部分。
Pod 标记为“就绪”但未列出容器
错误
部署容器时,pod 的 STATE 标记为 Ready
,列出了映像,但看不到容器正在运行
$ sudo
crictl pods
POD ID CREATED STATE NAME NAMESPACE ATTEMPT RUNTIME
06bd84c07537e 4 seconds ago Ready doca-firefly-my-dpu default 0 (default)
$ sudo
crictl images
IMAGE TAG IMAGE ID SIZE
k8s.gcr.io/pause 3.2 2a060e2e7101d 251kB
nvcr.io/nvidia/doca/doca_firefly 1.1.0-doca2.0.2 134cb22f34611 87.4MB
$ sudo
crictl ps
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID POD
解决方案
在大多数情况下,容器已启动,但立即退出。 可以使用以下命令进行检查
$ sudo
crictl ps
-a
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID POD
556bb78281e1d 134cb22f34611 7 seconds ago Exited doca-firefly 1 06bd84c07537e doca-firefly-my-dpu
如果容器失败(即,状态为 Exited
),建议检查 Firefly 的主日志 /var/log/doca/firefly/firefly.log
。
此外,在终止后的短时间内,也可以使用容器的 ID 查看容器日志
$ sudo
crictl logs 556bb78281e1d
Starting DOCA Firefly - Version 1.1.0
...
Requested the following PTP interface: p10
Failed to find
interface "p10"
. Aborting
未找到自定义配置文件
错误
当使用自定义配置文件部署 DOCA Firefly 时,会发生部署错误,并显示以下日志消息
...
2023-09-07 14:04:23 - Firefly - Init - ERROR - Custom config file
not found: my_file.conf. Aborting
...
解决方案
检查 YAML 文件中写入的自定义文件名,并确保已将该名称的文件正确放置在 DPU 的 /etc/firefly/
目录下。
不支持配置概况
错误
当部署 DOCA Firefly 时,会发生部署错误,并显示以下日志消息
...
2023-09-07 14:04:23 - Firefly - Init - ERROR - profile <name> is not supported. Aborting
...
解决方案
验证 YAML 文件中选择的配置文件是否与配置文件表中列出的受支持配置文件之一匹配。
配置文件名称区分大小写。 名称必须以小写字母指定。
缺少 PPS 功能
错误
当部署 DOCA Firefly 并配置为使用 PPS
模块时,会发生部署错误,并显示以下日志消息
...
2023-09-07 14:04:23 - Firefly - Init - INFO - Starting PPS configuration
2023-09-07 14:04:23 - Firefly - Init - WARNING - [-] PPS capability is missing, seems that the card doesn't support PPS
2023-09-07 14:04:23 - Firefly - Init - INFO - capabilities:
2023-09-07 14:04:23 - Firefly - Init - INFO - 50000000 maximum frequency adjustment (ppb)
2023-09-07 14:04:23 - Firefly - Init - INFO - 0 programmable alarms
2023-09-07 14:04:23 - Firefly - Init - INFO - 0 external time
stamp channels
2023-09-07 14:04:23 - Firefly - Init - INFO - 0 programmable periodic signals
2023-09-07 14:04:23 - Firefly - Init - INFO - 0 pulse per second
2023-09-07 14:04:23 - Firefly - Init - INFO - 0 programmable pins
2023-09-07 14:04:23 - Firefly - Init - INFO - 0 cross timestamping
...
解决方案
此日志表明 DPU 硬件不支持 PPS。 但是,PTP 仍然可以在此硬件上运行,您应该在容器日志中看到 Running ptp4l
行,表明 PTP 正在成功运行。
轮询 Tx 时间戳时超时
错误
当 BlueField 在 DPU 模式下运行时,DOCA Firefly 在等待接收 Tx 时间戳事件时卡在故障循环中
ptp4l[2912.797]: timed out while polling for tx timestamp
ptp4l[2912.797]: increasing tx_timestamp_timeout may correct this issue, but it is likely caused by a driver bug
ptp4l[2912.797]: port 1 (enp3s0f0s4): send sync failed
ptp4l[2923.528]: timed out while polling for tx timestamp
ptp4l[2923.528]: increasing tx_timestamp_timeout may correct this issue, but it is likely caused by a driver bug
ptp4l[2923.528]: port 1 (enp3s0f0s4): send sync failed
DOCA Firefly 存在一个已知缺陷,导致此错误出现一次,之后 ptp4l 会从中恢复。 本节仅涵盖出现故障循环且未发生恢复的情况。
解决方案
DOCA Firefly 的配置已经过调整,以适应 Tx 端口时间戳。 有关此错误的原因以及为此设计的恢复机制的更多信息,请参阅“DPU 模式下的 Tx 时间戳支持”部分。
警告 – 时间向后跳跃
错误
当使用 Firefly 的 Servo 模块时,启动时会遇到以下警告日志消息
2024-01-01 14:04:23 - Firefly - SERVO - WARNING - Clock is going to jump backwards in time - this might have a system-wide impact
解决方案
此警告消息指示系统时间向后跳跃了至少一分钟。 Firefly 记录此事件是因为此类跳跃可能具有系统范围的影响。 有关更多信息,请参阅DOCA Troubleshooting中的“无法保留 Sandbox 名称”部分。
此类跳跃仅可能发生在 Firefly 启动期间,在 Servo 实现与参考时钟的初始时间同步之前。
媒体配置概况
#
# This config file contains configurations for
media & entertainment alongside
# DOCA Firefly specific adjustments.
#
[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
logAnnounceInterval -2
announceReceiptTimeout 3
logSyncInterval -3
logMinDelayReqInterval -3
delay_mechanism E2E
network_transport UDPv4
# Value lesser or equal to 1
is required for
Embedded Mode
fault_reset_interval 1
# Required for
multiple interfaces support
boundary_clock_jbod 1
默认配置概况
#
# This config file extends
linuxptp default
.cfg config file with DOCA Firefly
# specific adjustments.
#
[global]
# Value lesser or equal to 1
is required for
Embedded Mode
fault_reset_interval 1
# Required for
multiple interfaces support
boundary_clock_jbod 1
电信 (L2) 配置概况
#
# This config file extends
linuxptp G.8275.1
.cfg config file with DOCA Firefly
# specific adjustments.
#
[global]
dataset_comparison G.8275
.x
G.8275
.defaultDS.localPriority 128
maxStepsRemoved 255
logAnnounceInterval -3
logSyncInterval -4
logMinDelayReqInterval -4
G.8275
.portDS.localPriority 128
ptp_dst_mac 01
:80
:C2:00
:00
:0E
network_transport L2
domainNumber 24
# Value lesser or equal to 1
is required for
Embedded Mode
fault_reset_interval 1
# Required for
multiple interfaces support
boundary_clock_jbod 1
PTP 监视器
monitor-default.conf
#
# Default values for
all of Firefly's PTP monitor configuration values.
#
[global]
# General
report_interval 1000
# Debugging & Logging
doca_logging_level 50
telemetry_export 0
配置选项
report_interval
– 监视器应将报告发布到所有定义的输出提供程序(标准输出、gRPC 客户端等)的时间间隔(以毫秒为单位)。 默认值:1000(1 秒)。doca_logging_level
– 模块的日志记录级别,基于 DOCA 的日志记录级别。 默认值为 50 (INFO)。 有效选项10=DISABLE
20=CRITICAL
30=ERROR
40=WARNING
50=INFO
60=DEBUG
telemetry_export
– 指示是否应通过 DOCA Telemetry Service 导出监视器信息。 有效选项0=禁用(默认)
1=启用
Firefly Servo
servo-default.conf
#
# Default values for
all of Firefly's servo configuration values
#
[global]
# Time thresholds
init_offset_from_master_threshold 10000000
offset_from_master_min_threshold -1500
offset_from_master_max_threshold 1500
init_max_time_adjustment 0
max_time_adjustment 1500
step_adjustment_threshold 0
hold_over_timer 0
# Sampling Window & servo logic
warmup_period 1500
sync_filter_length 6
delay_request_filter_length 6
servo_adjustment_interval 4
servo_init_adjustment_interval 24
servo_const_log_sync_interval 0xFF
servo_window_min_samples 2
servo_num_offset_values 5
servo_pi_cutoff_frequency 0.0159
servo_pi_dumping_factor 7.85
# Debugging & Logging
summary_interval 2000
doca_logging_level 50
free_running 0
配置选项
init_offset_from_master_threshold
– 在初始化时切换到 PI 伺服系统的最小阈值(以纳秒为单位)。 默认值为 10000000(10 毫秒)。offset_from_master_min_threshold
– 将与主时钟的时间偏移声明为“稳定”的最小阈值(以纳秒为单位)。 默认值为 -1500(-1.5 微秒)。offset_from_master_max_threshold
– 将与主时钟的时间偏移声明为“稳定”的最大阈值(以纳秒为单位)。 默认值为 +1500(+1.5 微秒)。init_max_time_adjustment
– 激活后,定义伺服系统达到“锁定”状态之前的最大允许时间(步进)调整(以纳秒为单位)。 默认值为 0(禁用)。max_time_adjustment
– 激活后,定义伺服系统达到“锁定”状态后允许的最大参考时间调整(以纳秒为单位)。 默认值为 1500(1.5 微秒)。step_adjustment_threshold
– 激活后,定义即使在伺服系统达到“锁定”状态后也允许时间(步进)调整的阈值(以纳秒为单位)。 默认值为 0(禁用)。hold_over_timer
– 激活后,定义伺服系统保持“保持”模式的时间(以秒为单位),直到恢复为“自由运行”。 默认值为 0(“保持”状态已禁用)。warmup_period
– 收集样本以估计logSyncInterval
值(数据包速率)的时间跨度(以毫秒为单位)。 默认值为 1500(1.5 秒)。sync_filter_length
– 伺服系统历史记录缓冲区中SYNC
消息的数量。 默认值为 6。delay_request_filter_length
– 伺服系统历史记录缓冲区中DELAY_REQUEST
消息的数量。 默认值为 6 条消息。servo_adjustment_interval
– 在伺服系统至少一次达到“锁定”状态后,PHC 更新的SYNC
消息数量。 默认值为 4 条消息。servo_init_adjustment_interval
– 在伺服系统从未达到“锁定”状态之前,PHC 更新的SYNC
消息数量。 默认值为 24 条消息。servo_const_log_sync_interval
– 要用作logSyncInterval
的已知固定值,而不是尝试在运行时对其进行估计。 默认值为 0xFF(禁用)。servo_window_min_samples
– 伺服系统计算所需的最小样本数。 默认值为 2 条消息。servo_num_offset_values
– “与主时钟的偏移”阈值内所需的连续时间戳的数量,以便从“锁定”状态过渡到“锁定稳定”状态。 默认值为 5 个偏移值。servo_pi_cutoff_frequency
– PI 伺服系统的截止频率值。 默认值为 0.0159。servo_pi_dumping_factor
– PI 伺服系统的阻尼系数值。 默认值为 7.85。summary_interval
– 伺服系统应发布报告日志事件的时间间隔(以毫秒为单位)。 默认值为 2000(2 秒)。doca_logging_level
– 模块的日志记录级别,基于 DOCA 的日志记录级别。 默认值为 50 (INFO)。 有效选项10=DISABLE
20=CRITICAL
30=ERROR
40=WARNING
50=INFO
60=DEBUG
free_running
– 告诉伺服系统仅记录操作,而不实际调整 PHC。 默认值为 0(禁用)。