Red Hat Training

A Red Hat training course is available for RHEL 8

第 33 章 带有 HW 时间戳的 Chrony

硬件时间戳是某些网络接口控制器(NIC)支持的功能,它提供传入和传出数据包的时间戳。NTP 时间戳通常由内核和使用系统时钟的 chronyd 创建。但是,当启用 HW 时间戳时,NIC 会使用自己的时钟来生成数据包进入或离开链路层或物理层时的时间戳。当与 NTP 一起使用时,硬件时间戳可以显著提高同步的准确性。为了获得最佳准确性, NTP 服务器和 NTP 客户端都需要使用硬件时间戳。在理想情况下,子微秒的准确性是可能的。

另一个用于使用硬件时间戳进行时间同步的协议是 PTP

NTP 不同, PTP 依赖于网络交换机和路由器。如果您想要达到同步的最佳准确性,在具有支持 PTP 的交换机和路由器的网络中使用 PTP,在没有这样的交换机和路由器的网络中首选使用 NTP

以下小节描述了如何进行:

  • 验证硬件时间戳支持
  • 启用硬件时间戳
  • 配置客户端轮询间隔
  • 启用交集模式
  • 为大量客户端配置服务器
  • 验证硬件时间戳
  • 配置 PTP-NTP 桥接

33.1. 验证硬件时间戳支持

要验证接口是否支持使用 NTP 的硬件时间戳,请使用 ethtool -T 命令。如果 ethtool 列出了 SOF_TIMESTAMPING_TX_HARDWARESOF_TIMESTAMPING_TX_SOFTWARE 功能,以及 HWTSTAMP_FILTER_ALL 过滤器模式,则可以使用 NTP 的硬件时间戳。

例 33.1. 在特定接口中验证硬件时间戳支持

# 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)

33.2. 启用硬件时间戳

要启用硬件时间戳,请使用 /etc/chrony.conf 文件中的 hwtimestamp 指令。该指令可指定单一接口,也可以指定通配符字符来启用所有支持接口的硬件时间戳。如果没有其他应用程序(如 linuxptp 软件包中的 ptp4l) 在接口中使用硬件时间戳,请使用通配符规格。chrony 配置文件中允许使用多个 hwtimestamp 指令。

例 33.2. 使用 hwtimestamp 指令启用硬件时间戳

hwtimestamp eth0
hwtimestamp eth1
hwtimestamp *

33.3. 配置客户端轮询间隔

建议为互联网中的服务器使用默认的轮询间隔范围(64-1024秒)。对于本地服务器和硬件时间戳,需要配置一个较短的轮询间隔,以便最小化系统时钟偏差。

/etc/chrony.conf 中的以下指令使用一个轮询间隔指定本地 NTP 服务器:

server ntp.local minpoll 0 maxpoll 0

33.4. 启用交集模式

NTP 不是硬件 NTP 应用程序的服务器,而是运行软件 NTP 实现的通用目的计算机,如 chrony,只有在发送数据包后才会获得硬件传输时间戳。这个行为可防止服务器在对应的数据包中保存时间戳。要启用 NTP 客户端接收传输时间戳后生成的传输时间戳,请将客户端配置为使用 NTP 交集模式,方法是在 /etc/chrony.conf 的 server 指令中添加 xleave 选项:

server ntp.local minpoll 0 maxpoll 0 xleave

33.5. 为大量客户端配置服务器

默认服务器配置最多允许几千个客户端同时使用交集模式。要为大量客户端配置服务器,增大 /etc/chrony.conf 中的 clientloglimit 指令。这个指令指定了在服务器中记录客户端访问的最大内存大小:

clientloglimit 100000000

33.6. 验证硬件时间戳

要校验该接口是否已成功启用了硬件时间戳,请检查系统日志。这个日志应该包含来自 chronyd 的每个接口的消息,并成功启用硬件时间戳。

例 33.3. 为启用硬件时间戳的接口记录日志信息

chronyd[4081]: Enabled HW timestamping on eth0
chronyd[4081]: Enabled HW timestamping on eth1

chronyd 配置为 NTP 客户端或对等时,您可以通过 chronyc ntpdata 命令为每个 NTP 源报告传输和接收时间戳模式,以及交集模式:

例 33.4. 报告每个 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

例 33.5. 报告 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

33.7. 配置 PTP-NTP 桥接

如果网络中存在一个高度准确的 Precision Time Protocol(PTP)grandmaster,且没有支持 PTP 的交换机或路由器,则一个计算机可能会被指定专门用于作为 PTP slave 和一个 stratum-1 NTP 服务器操作。这样的计算机需要两个或者多个网络接口,并接近 grandmaster 或与其直接连接。这样可保证高度准确的网络同步。

linuxptp 软件包中配置 ptp4 l 和 phc2sys 程序,使用一个接口使用 PTP 同步系统时钟。

配置 chronyd 以使用其他接口提供系统时间:

例 33.6. 将 chronyd 配置为使用其他接口提供系统时间

bindaddress 203.0.113.74
hwtimestamp eth1
local stratum 1