时间戳
时间戳是跟踪数据包创建过程的方法。时间戳服务支持在特定时间之前数据存在的证据声明。传入数据包在 PCI 上分发之前进行时间戳标记,具体取决于 PCI 缓冲区中的拥塞情况。传出数据包在即将放置到线路上传输时进行时间戳标记。
时间戳默认关闭,应在使用前启用。
为套接字启用时间戳
要为套接字启用时间戳,请使用 SO_TIMESTAMPING
和以下标志调用 setsockopt()
| 尝试在硬件中获取发送时间戳 |
| 如果 |
| 返回硬件生成的原始、未修改的时间戳 |
| 如果 |
| 返回原始硬件时间戳 |
| 返回转换为系统时基的硬件时间戳 |
| 返回在软件中生成的系统时间戳 |
| 确定如何生成时间戳 |
| 确定如何报告时间戳 |
为网络设备启用时间戳
要为网络设备启用时间戳,具有管理员权限的用户可以通过调用 ioctl (sock, SIOCSH-WTSTAMP, &ifreq) 和以下值来启用/禁用时间戳
发送端时间采样,通过
ifreq.hwtstamp_config.tx_type
在以下情况下启用/* possible values for hwtstamp_config->tx_type */
enum
hwtstamp_tx_types {/*
* No outgoing packet will need hardware time stamping;
* should a packet arrive which asks for it, no hardware
* time stamping will be done.
*/
HWTSTAMP_TX_OFF,/*
* Enables hardware time stamping for outgoing packets;
* the sender of the packet decides which are to be
* time stamped by setting %SOF_TIMESTAMPING_TX_SOFTWARE
* before sending the packet.
*/
HWTSTAMP_TX_ON,/*
* Enables time stamping for outgoing packets just as
* HWTSTAMP_TX_ON does, but also enables time stamp insertion
* directly into Sync packets. In this case, transmitted Sync
* packets will not received a time stamp via the socket error
* queue.
*/
HWTSTAMP_TX_ONESTEP_SYNC, }; Note:for
send side time stamping currently only HWTSTAMP_TX_OFF and HWTSTAMP_TX_ON are supported.接收端时间采样,通过
ifreq.hwtstamp_config.rx_filter
在以下情况下启用/* possible values for hwtstamp_config->rx_filter */
enum
hwtstamp_rx_filters {/* time stamp no incoming packet at all */
HWTSTAMP_FILTER_NONE,/* time stamp any incoming packet */
HWTSTAMP_FILTER_ALL,/* return value: time stamp all packets requested plus some others */
HWTSTAMP_FILTER_SOME,/* PTP v1, UDP, any kind of event packet */
HWTSTAMP_FILTER_PTP_V1_L4_EVENT,/* PTP v1, UDP, Sync packet */
HWTSTAMP_FILTER_PTP_V1_L4_SYNC,/* PTP v1, UDP, Delay_req packet */
HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ,/* PTP v2, UDP, any kind of event packet */
HWTSTAMP_FILTER_PTP_V2_L4_EVENT,/* PTP v2, UDP, Sync packet */
HWTSTAMP_FILTER_PTP_V2_L4_SYNC,/* PTP v2, UDP, Delay_req packet */
HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ,/* 802.AS1, Ethernet, any kind of event packet */
HWTSTAMP_FILTER_PTP_V2_L2_EVENT,/* 802.AS1, Ethernet, Sync packet */
HWTSTAMP_FILTER_PTP_V2_L2_SYNC,/* 802.AS1, Ethernet, Delay_req packet */
HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ,/* PTP v2/802.AS1, any layer, any kind of event packet */
HWTSTAMP_FILTER_PTP_V2_EVENT,/* PTP v2/802.AS1, any layer, Sync packet */
HWTSTAMP_FILTER_PTP_V2_SYNC,/* PTP v2/802.AS1, any layer, Delay_req packet */
HWTSTAMP_FILTER_PTP_V2_DELAY_REQ, }; Note:for
receive side time stamping currently only HWTSTAMP_FILTER_NONE and HWTSTAMP_FILTER_ALL are supported.
获取时间戳
启用时间戳后,时间戳将放置在套接字辅助数据中。 recvmsg()
可用于获取常规传入数据包的此控制消息。对于发送时间戳,传出数据包将循环返回到套接字的错误队列,并附加发送时间戳。可以使用 recvmsg (flags=MSG_ERRQUEUE)
接收。调用返回原始传出数据包数据,包括所有前置标头(向下到并包括链路层)、scm_time-stamping
控制消息和 sock_extended_err
控制消息(其中 ee_errno==ENOMSG
和 ee_origin==SO_EE_ORIGIN_TIMESTAMPING
)。就 select()
而言,具有此类挂起弹回数据包的套接字已准备好进行读取。如果传出数据包必须分片,则仅对第一个分片进行时间戳标记并返回到发送套接字。
启用时间戳后,VLAN 剥离将被禁用。有关更多信息,请参阅 kernel.org 中的 Documentation/networking/timestamping.txt
。
在 ConnectX-4 适配器及更高版本上,启用时间戳后,RX CQE 压缩将被禁用(这些功能互斥)。
通过 ethtool 查看时间戳功能
要通过 ethtool 显示时间戳功能
ethtool -T eth<x>
示例输出
ethtool -T eth0
Time stamping parameters for
p2p1:
Capabilities:
hardware-transmit (SOF_TIMESTAMPING_TX_HARDWARE)
software-transmit (SOF_TIMESTAMPING_TX_SOFTWARE)
hardware-receive (SOF_TIMESTAMPING_RX_HARDWARE)
software-receive (SOF_TIMESTAMPING_RX_SOFTWARE)
software-system-clock (SOF_TIMESTAMPING_SOFTWARE)
hardware-raw-clock (SOF_TIMESTAMPING_RAW_HARDWARE)
PTP Hardware Clock: 1
Hardware Transmit Timestamp Modes:
off (HWTSTAMP_TX_OFF)
on (HWTSTAMP_TX_ON)
Hardware Receive Filter Modes:
none (HWTSTAMP_FILTER_NONE)
all (HWTSTAMP_FILTER_ALL)
有关 PTP 硬件时钟的更多详细信息,请参阅:https://www.kernel.org/doc/Documentation/ptp/ptp.txt
将 PTP 流量引导至单个 RX 环
由于接收端转向 (RSS),到达 UDP 端口 319 和 320 的 PTP 流量可能会以乱序方式到达用户空间应用程序。为了防止这种情况,需要使用 ethtool 将 PTP 流量引导至单个 RX 环。
示例
# ethtool -u ens7
8
RX rings available
Total 0
rules
# ethtool -U ens7 flow-type udp4 dst-port 319
action 0
loc 1
# ethtool -U ens7 flow-type udp4 dst-port 320
action 0
loc 0
# ethtool -u ens7
8
RX rings available
Total 2
rules
Filter: 0
Rule Type: UDP over IPv4
Src IP addr: 0.0
.0.0
mask: 255.255
.255.255
Dest IP addr: 0.0
.0.0
mask: 255.255
.255.255
TOS: 0x0
mask: 0xff
Src port: 0
mask: 0xffff
Dest port: 320
mask: 0x0
Action: Direct to queue 0
Filter: 1
Rule Type: UDP over IPv4
Src IP addr: 0.0
.0.0
mask: 255.255
.255.255
Dest IP addr: 0.0
.0.0
mask: 255.255
.255.255
TOS: 0x0
mask: 0xff
Src port: 0
mask: 0xffff
Dest port: 319
mask: 0x0
Action: Direct to queue 0
Tx 端口时间戳
此功能仅在 ConnectX-6 Dx 及更高版本的适配器卡上受支持。
当使用端口级别生成的时间戳而不是在 CQE 创建时生成的时间戳时,可以提高传输数据包时间戳的准确性。Tx 端口时间戳可以更好地反映数据包的实际传输时间。
正常发送队列 (SQ) 在打开时支持 CQE 时间戳。启用此功能后,驱动程序预计会为每个流量类别 (TC) 打开额外的 Tx 端口时间戳 SQ。
流必须满足以下条件才能通过 Tx 端口时间戳 SQ 传输。
SKBTX_HW_TSTAMP
标志已在tx_flag
中设置(通过setsockopt()
或类似方法设置了SO_TIMESTAMPING
)数据包类型为
非 IP,EtherType 为 PTP over IEEE 802.3 (0x88f7);或
UDP over IPv4/IPv6
默认情况下禁用此功能,以避免额外的 SQ 内存分配。可以使用以下命令启用或禁用该功能
ethtool --set-priv-flags <ifs-name> tx_port_ts <on/off>
PTP Cyc2time 硬件转换卸载
此功能仅在 ConnectX-6 Dx 及更高版本的适配器卡上受支持。
设备时间戳在一个或两种模式下运行:实时或自由运行的内部时间。
自由运行的内部时间模式 – 在此模式下,无法编辑设备时钟。驱动程序或用户空间必须将时间戳调整为实时纳秒。
实时模式 – 在此模式下,可以调整硬件时钟,从而提供已转换为实时纳秒的时间戳。
两种模式都是每个设备的全局模式。配置模式后,所有与时钟相关的功能(例如,PPS、CQE TS、PCIe BAR)都将专门使用选定的时钟模式运行。
默认情况下,硬件设置为自由运行的内部时间模式。驱动程序根据 PTP 守护程序时钟更新调整硬件实时时钟。
只有物理功能 (PF) 可以修改硬件实时时钟。来自虚拟功能 (VF) 的调整将被忽略(视为无操作)。如果多个 PF 尝试修改时钟,则设备会选择一个作为指定的时钟提供程序。如果指定的提供程序在特定时间内未能发送更新,则设备可能会将其替换为另一个 PF。在此期间的其他输入也被视为无操作。
时间戳格式
ConnectX-6 Dx 和 ConnectX-6 Lx NIC 的 CQE 硬件时间戳格式为 64 位,如下所示
{32bit sec, 32
bit nsec}
配置
要启用此功能
通过 mlxconfig 在
NV_CONFIG
中设置REAL_TIME_CLOCK_ENABLE
重启驱动程序。
限制
管理员必须重启驱动程序并执行固件重置,以使配置生效。否则,可能会发生硬件和驱动程序时间戳模式不匹配的情况。
在给定设备上激活实时模式后(请参阅配置部分),版本 5.3 或更高版本必须在所有设备功能上运行。在此配置下,任何在设备功能上运行的旧版本驱动程序都将无法打开任何流量队列(RDMA 或 ETH),因此将变得功能失常。
在实时模式下,同一设备中的所有设备功能都必须与单个时钟域同步 - 请勿在同一设备上的不同功能使用多个 GM。
关于硬件时钟所有权,硬件仅从单个选定的功能进行配置;设备会忽略其他功能设置。没有指示哪个功能是硬件时钟的所有者。在没有修改硬件时钟的内部超时后,某个功能将失去硬件时钟的所有权,并且可以被任何功能获取。
同一设备中的所有 PF/VF 都必须同步到同一 1588 主时钟。如果使用多个主时钟,则设备将使用单个选定的功能。这可能会导致设备的时钟表示错误、错误的 1588 TLV 以及在替换选定功能时出现问题。
此功能仅在 ConnectX-6 Dx 及更高版本的适配器卡上受支持。
RoCE 时间戳允许您在数据包发送到线路/从线路接收时对数据包进行时间戳标记。时间戳以原始硬件周期给出,但可以轻松转换为基于硬件参考的纳秒时间。此外,它还使您能够查询硬件以获取硬件时间,从而对其他应用程序的事件进行时间戳标记并比较时间。
查询功能
仅当硬件报告能够报告时,时间戳才可用。要验证 RoCE 时间戳是否可用,请运行 ibv_query_device_ex
。
有关更多信息,请参阅 ibv_query_device_ex 手册页。
创建时间戳完成队列
要获取时间戳,必须通过对 ibv_create_cq_ex 动词的特殊调用来创建合适的扩展完成队列 (CQ)。
有关更多信息,请参阅 ibv_create_cq_ex 手册页。
当使用 CQE 压缩时,时间戳不可用。
查询硬件时间
通过 ibv_query_rt_values_ex
动词完成硬件时间查询。例如
有关更多信息,请参阅 ibv_query_rt_values_ex 手册页。
1PPS 是一种时间同步功能,允许适配器能够在使用 SMA 连接器(SubMiniature 版本 A)的适配器卡上的专用引脚上发送或接收每秒 1 个脉冲。仅支持一个引脚,并且可以配置为 1PPS 输入或 1PPS 输出。
有关更多信息,请参阅 如何在 NVIDIA 适配器上测试 1PPS 社区帖子。