14.3. 带有 HW 时间戳的 Chrony
硬件时间戳是在一些网络接口控制器(NIC)中支持的一种功能,它提供传入和传出数据包的准确的时间戳。NTP
时间戳通常由内核及使用系统时钟的 chronyd 创建。但是,当启用了 HW 时间戳时,NIC 使用自己的时钟在数据包进入或离开链路层或物理层时生成时间戳。与 NTP
一起使用时,硬件时间戳可以显著提高同步的准确性。为了获得最佳准确性,NTP
服务器和 NTP
客户端都需要使用硬件时间戳。在理想条件下,可达到次微秒级的准确性。
另一个用于使用硬件时间戳进行时间同步的协议是 PTP
与 NTP
不同,PTP
依赖于网络交换机和路由器。如果您想要达到同步的最佳准确性,请在带有 PTP
支持的网络中使用 PTP
,在使用不支持这个协议的交换机和路由器的网络上选择 NTP
。
以下小节描述了如何进行:
- 验证是否支持硬件时间戳
- 启用硬件时间戳
- 配置客户端轮询间隔
- 启用交错模式
- 为大量客户端配置服务器
- 验证硬件时间戳
- 配置 PTP-NTP 网桥
14.3.1. 验证硬件时间戳支持
要验证接口是否支持使用 NTP
的硬件时间戳,请使用 ethtool -T
命令。如果 ethtool
列出了 SOF_TIMESTAMPING_TX_HARDWARE
和 SOF_TIMESTAMPING_TX_SOFTWARE
模式,以及 HWTSTAMP_FILTER_ ALL
过滤器模式,则可以使用硬件时间戳的 NTP
。
例 14.2. 在特定接口中验证硬件时间戳支持
# ethtool -T eth0
输出:
Timestamping parameters for eth0: Capabilities: hardware-transmit (SOF_TIMESTAMPING_TX_HARDWARE) software-transmit (SOF_TIMESTAMPING_TX_SOFTWARE) hardware-receive (SOF_TIMESTAMPING_RX_HARDWARE) software-receive (SOF_TIMESTAMPING_RX_SOFTWARE) software-system-clock (SOF_TIMESTAMPING_SOFTWARE) hardware-raw-clock (SOF_TIMESTAMPING_RAW_HARDWARE) PTP Hardware Clock: 0 Hardware Transmit Timestamp Modes: off (HWTSTAMP_TX_OFF) on (HWTSTAMP_TX_ON) Hardware Receive Filter Modes: none (HWTSTAMP_FILTER_NONE) all (HWTSTAMP_FILTER_ALL) ptpv1-l4-sync (HWTSTAMP_FILTER_PTP_V1_L4_SYNC) ptpv1-l4-delay-req (HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ) ptpv2-l4-sync (HWTSTAMP_FILTER_PTP_V2_L4_SYNC) ptpv2-l4-delay-req (HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ) ptpv2-l2-sync (HWTSTAMP_FILTER_PTP_V2_L2_SYNC) ptpv2-l2-delay-req (HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ) ptpv2-event (HWTSTAMP_FILTER_PTP_V2_EVENT) ptpv2-sync (HWTSTAMP_FILTER_PTP_V2_SYNC) ptpv2-delay-req (HWTSTAMP_FILTER_PTP_V2_DELAY_REQ)
14.3.2. 启用硬件时间戳
要启用硬件时间戳,请使用 /etc/chrony.conf
文件中的 hwtimestamp
指令。该指令可指定单一接口,也可以指定通配符字符来启用所有支持接口的硬件时间戳。在没有其他应用程序(如 linuxptp
软件包中的 ptp4l 在接口上使用硬件时间戳)的情况下,请使用通配符规范。在 chrony 配置文件中允许使用多个 hwtimestamp
指令。
例 14.3. 使用 hwtimestamp 指令启用硬件时间戳
hwtimestamp eth0 hwtimestamp eth1 hwtimestamp *
14.3.3. 配置客户端轮询间隔
建议为互联网中的服务器使用默认的轮询间隔范围(64-1024秒)。对于本地服务器和硬件时间戳,需要配置一个较短的轮询间隔,以便最小化系统时钟偏差。
/etc/chrony.conf
中的以下指令指定了使用一秒轮询间隔的本地 NTP
服务器:
server ntp.local minpoll 0 maxpoll 0
14.3.4. 启用交错模式
NTP
服务器不是硬件的 NTP
设备,而是运行软件 NTP
实现的通用计算机,如 chrony ,将在发送数据包后才会获得硬件传输时间戳。此行为可防止服务器在其对应的数据包中保存时间戳。为了使 NTP
客户端接收传输后生成的传输时间戳,请将客户端配置为使用 NTP
交错模式,方法是在 /etc/chrony.conf
的 server 指令中添加 xleave
选项:
server ntp.local minpoll 0 maxpoll 0 xleave
14.3.5. 为大量客户端配置服务器
默认服务器配置允许最多几千个客户端同时使用交错模式。要为更多的客户端配置服务器,增大 /etc/chrony.conf
中的 clientloglimit
指令。这个指令指定了为服务器上客户端访问的日志分配的最大内存大小:
clientloglimit 100000000
14.3.6. 验证硬件时间戳
要校验该接口是否已成功启用了硬件时间戳,请检查系统日志。这个日志应该包含来自 chronyd
的每个接口的消息,并成功启用硬件时间戳。
例 14.4. 为启用硬件时间戳的接口记录日志信息
chronyd[4081]: Enabled HW timestamping on eth0 chronyd[4081]: Enabled HW timestamping on eth1
当 chronyd
被配置为 NTP
客户端或对等的客户端时,您可以使用 chronyc ntpdata
命令为每个 NTP
源报告传输和接收时间戳模式以及交错模式:
例 14.5. 报告每个 NTP 源的传输、接收时间戳以及交集模式
# chronyc ntpdata
输出:
Remote address : 203.0.113.15 (CB00710F) Remote port : 123 Local address : 203.0.113.74 (CB00714A) Leap status : Normal Version : 4 Mode : Server Stratum : 1 Poll interval : 0 (1 seconds) Precision : -24 (0.000000060 seconds) Root delay : 0.000015 seconds Root dispersion : 0.000015 seconds Reference ID : 47505300 (GPS) Reference time : Wed May 03 13:47:45 2017 Offset : -0.000000134 seconds Peer delay : 0.000005396 seconds Peer dispersion : 0.000002329 seconds Response time : 0.000152073 seconds Jitter asymmetry: +0.00 NTP tests : 111 111 1111 Interleaved : Yes Authenticated : No TX timestamping : Hardware RX timestamping : Hardware Total TX : 27 Total RX : 27 Total valid RX : 27
例 14.6. 报告 NTP 测量的稳定性
# chronyc sourcestats
启用硬件时间戳后,正常负载下,NTP
测量的稳定性应该以十秒或数百纳秒为单位。此稳定性会在 chronyc sourcestats
命令的输出结果中的 Std Dev
列中报告:
输出:
210 Number of sources = 1 Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev ntp.local 12 7 11 +0.000 0.019 +0ns 49ns
14.3.7. 配置 PTP-NTP 桥接
如果网络中有一个高度准确的 Precision Time Protocol (PTP
)主时间服务器,但没有支持 PTP
支持的交换机或路由器,则计算机可能专用于作为 PTP
客户端和 stratum-1 NTP
服务器。此类计算机需要具有两个或更多个网络接口,并且接近主时间服务器或与它直接连接。这样可保证高度准确的网络同步。
从 linuxptp
软件包中配置 ptp4l 和 phc2sys 程序,以使用 PTP
来同步系统时钟。
将 chronyd
配置为使用其他接口提供系统时间:
例 14.7. 将 chronyd 配置为使用其他接口提供系统时间
bindaddress 203.0.113.74 hwtimestamp eth1 local stratum 1