摘要

本项目测试内核旁路数据中心网络能否提高 OpenNTPD 所校正系统时钟的稳定性。我在 共享的网络时间协议(Network Time Protocol,NTP)实现下增加了两个传输后端: 通过 ConnectX-5 网卡发送线缆兼容的用户态以太网、互联网协议版本 4 和用户数据报 协议(User Datagram Protocol,UDP),以及使用 InfiniBand 不可靠数据报 (unreliable datagram,UD)的原生远程直接内存访问(remote direct memory access,RDMA)。实验在同一对服务器上将它们与通过 10 和 100 千兆以太网 (Gigabit Ethernet,GbE)的内核 UDP 对比。整套测试包含 10 类测试、372 个 条件和三次完整随机排序重复;四条路径共用相同的 NTP 数据包处理、滤波、对等端 选择和时钟控制代码。

新后端可以工作,但性能假设失败了。稳态对等端抖动中位数——即 OpenNTPD 八样本 滤波窗口内有效时钟偏移样本的均方根变化——在 10 GbE 内核 UDP 上为 183.4 微秒,在 100 GbE 内核 UDP 上为 429.7 微秒,在用户态 UDP 上为 1,985.6 微秒, 在 InfiniBand UD 上为 205.6 微秒。本次运行中,三条标称更快的路径都加剧了抖动。 在同一块 100 GbE 网卡上,用户态 UDP 把空闲往返时间(round-trip time,RTT) 中位数从 369.1 微秒降至 202.9 微秒,却把抖动提高到 10 GbE 基线的 10.8 倍。 实验还表明定向排队会偏置 NTP 的偏移估计,并发现 RDMA UD 客户端在服务器进程 重启后没有重新发现端点。抖动回退的原因与 RDMA 端点自动重新发现仍在调查。 由于实验没有外部时间基准,这些结果描述的是相对同步稳定性,而不是相对于协调 世界时的绝对精度。

我在同一对 Dell PowerEdge R820 服务器之间使用四条不同的网络路径,测量数据包 路径如何影响 OpenNTPD 的采样与同步。

每台服务器配有四颗 Intel Xeon E5-4657L v2 处理器,共 48 个物理核心、96 个 硬件线程。一台始终作为参考端,另一台始终作为被测客户端;同步测试期间只校正 客户端时钟。

四条路径分别是:

  • 通过 Broadcom 10 GbE 接口的普通内核用户数据报协议(UDP);
  • 通过 ConnectX-5 100 GbE 接口的普通内核 UDP;
  • 通过同一块 ConnectX-5 的用户态 Ethernet、因特网协议第 4 版(IPv4)与 UDP;它使用 raw-packet verbs 队列对(queue pair,QP),绕过内核 UDP 数据路径;
  • 通过 40 Gb InfiniBand 的远程直接内存访问(remote direct memory access, RDMA)不可靠数据报(unreliable datagram,UD)。

四条路径使用同一套网络时间协议(Network Time Protocol,NTP)实现。我给 OpenNTPD 增加了一层传输接口,数据包解析、滤波、对等端选择和时钟控制仍由 共享代码完成。

这个项目并不以缩短往返时间(round-trip time,RTT)为最终目标。NTP 用户使用的 不是更快完成的请求,而是最终的时间基准,也就是 OpenNTPD 校正后的系统时钟。 因此,相关结果是这个时间基准的稳定性;本实验用 OpenNTPD 的对等端抖动衡量 这种稳定性。

对等端抖动是 OpenNTPD 当前八样本滤波窗口内,有效时钟偏移样本相对于最低延迟 样本的均方根变化。抖动越低,送入时钟控制循环的时差估计越一致。RTT 仍然是有用 的诊断数据,因为可变延迟或不对称延迟会扰动这些偏移样本;但更低的 RTT 本身并不 等于更好的时钟。由于实验没有外部时间基准,对等端抖动衡量的是同步一致性,而不是 相对于协调世界时(Coordinated Universal Time,UTC)的绝对精度。

后端能够工作,但我的性能假设失败了。本次运行中,三条标称更快的路径都使稳态 对等端抖动比 10 GbE 内核 UDP 更差。用户态 UDP 明显降低了空闲 RTT,却把抖动 提高到 10 GbE 基线的 10.8 倍。

完整方法、图表和精简证据包位于 OpenNTPD 仓库的 HTML 研究包修改后的源代码位于独立补丁分支

四种传输,一套实现

两个内核 UDP 条件使用同一个后端。绑定源地址与接口,决定数据走 10 GbE 还是 100 GbE。

两条用户态路径使用 libibverbs,即 Linux 向支持 RDMA 的网卡直接提交工作的 API。用户态 UDP 并不是加了特殊选项的套接字。它在注册内存中构造标准 Ethernet、 IPv4、UDP 和 NTP 数据包,通过 ConnectX-5 raw-packet QP 发送,安装接收流, 轮询完成队列,校验地址与校验和,并补充接收工作请求。在线路上,它仍是 UDP。

InfiniBand 后端使用不可靠数据报。它通过 libibverbs 创建保护域(PD)、内存 区域(MR)、完成队列(CQ)、UD 队列对、地址句柄(AH)和预先发布的接收池。 它不会把丢包转换成可靠字节流,也不会用可靠连接(reliable connection,RC) 队列对替代所需的 UD 语义。

40 Gb InfiniBand 路径使用 Mellanox MT27600 Connect-IB 网卡。

时间戳和偏移估计

四条路径都在等价的软件边界使用 CLOCK_REALTIME

  • T1:客户端提交请求前一刻;
  • T2:参考端收到请求后一刻;
  • T3:参考端提交响应前一刻;
  • T4:客户端收到响应后一刻。

标准双向计算为:

delay  = (T4 - T1) - (T3 - T2)
offset = ((T2 - T1) + (T3 - T4)) / 2

第二个表达式就是 NTP 的双向偏移估计器:它估算参考时钟比客户端时钟快或慢 多少。请求与响应的网络延迟相等时,两者会抵消;延迟不相等时,其差值的一半会 进入估计偏移。

所有路径都没有使用硬件时间戳,因此比较对象始终是应用可见的软件数据包路径。

实验没有外部时间基准。每次包含四个时间戳的交换都会产生一个两台机器之间的 相对时钟偏移估计。客户端自由运行时,两个振荡器的速率略有差异,因此该偏移会 随时间变化。实验用下面的直线拟合这种预期变化:

预测偏移(t) = a + b*t
残差(t) = 测得偏移(t) - 预测偏移(t)

因此,残差就是某个测得偏移与同一时刻拟合漂移线之间的垂直距离。若估计器测得 +120 微秒,而拟合线预测 +110 微秒,残差就是 +10 微秒;负残差表示测量值位于 拟合线下方。累积分布函数(cumulative distribution function,CDF)使用绝对 残差,只保留与拟合线的距离,不区分方向。

残差描述移除建模时钟漂移后剩余的短时散布。它不是相对于 UTC 的误差;无论测量 偏移还是残差都不能证明绝对时钟准确度。

原始格式保留整数纳秒 T1–T4,并用两倍偏移的整数形式保存半纳秒结果。 11,018 个完整交换都能精确复现记录的 delay 和 offset 算术。

同步结果:更快的路径加剧了抖动

客户端经过 OpenNTPD 稳定后,中位结果为:

传输 测得相对偏移 滤波偏移 对等端抖动 同步丢失
udp10 +231.5 µs +260.4 µs 183.4 µs 0
udp100 +5.9 µs −43.4 µs 429.7 µs 0
uudp100 −1,435.7 µs −2,478.4 µs 1,985.6 µs 0
ib40 +77.0 µs +85.6 µs 205.6 µs 0

滤波偏移是 OpenNTPD 从近期样本窗口中选出的估计值。对等端抖动描述该窗口内的 有效偏移样本相对于最低延迟样本的散布。

100 GbE 内核 UDP 的抖动是 10 GbE 的 2.3 倍;同一 100 GbE 网卡上的用户态 UDP 是 10.8 倍;InfiniBand UD 较接近,但仍高出 12%。稳态窗口内四条路径都 没有丢失同步,但三条标称更快的路径都加剧了时钟校正逻辑所见的抖动。

目前还没有确定原因。轮询位置、两个方向的软件开销、队列行为和短时主机变化 都是待验证假设。下一轮测试将采用更长的运行时间和分阶段计时来分别检查这些 因素。本次运行中,内核旁路实现加剧了实测稳态抖动;原因尚未解决。

空闲数据包延迟是辅助证据

第一个测试让客户端自由运行。每个传输、每次重复都拟合:

offset(t) = a + b*t

随后分析去除拟合漂移后的残差。

传输 RTT 中位数 RTT p99 残差 RMS 绝对残差 p99.9
udp10 388.6 µs 418.6 µs 14.6 µs 41.8 µs
udp100 369.1 µs 392.0 µs 11.5 µs 29.7 µs
uudp100 202.9 µs 261.9 µs 13.9 µs 28.6 µs
ib40 253.5 µs 276.8 µs 11.1 µs 39.4 µs
四种 OpenNTPD 传输的往返时间累积分布
自由运行 RTT 分布。横轴给定一个 RTT 时,纵轴表示 RTT 小于等于该值的样本比例,范围为 0 到 1。

内核 UDP 从 10 GbE 换到 100 GbE,中位数减少约 19.5 微秒,即 5%。在同一块 100 GbE 网卡上绕过内核 UDP 数据路径,中位数减少 166.3 微秒,即 45%。

该工作负载每秒约发送一个 NTP 请求,远未达到线速。应用看到的主要成本来自 提交、唤醒、轮询、完成处理和调度,而不是链路带宽上限。

自由运行残差没有遵循 RTT 排名。RDMA UD 的均方根(RMS)残差最小,为 11.1 微秒;100 GbE 内核 UDP 为 11.5 微秒;最快的用户态 UDP 为 13.9 微秒。

四种 OpenNTPD 传输的绝对偏移估计器残差累积分布
横轴给定一个绝对残差时,纵轴表示与拟合漂移线距离不超过该值的样本比例,范围为 0 到 1;它不是绝对时钟准确度分布。

延迟最低的路径并没有得到最低的测量噪声。

负载下的路径差异

下表把路径静默时的 NTP 延迟,与另一个程序同时在两个方向发送大包时的 NTP 延迟进行比较。时钟测试前,运行器先测量每条物理路径的最大可持续背景流量。 “90%”条件请求该实测速率的 90%,而不是网卡标称线速的 90%。

传输 基线 RTT 中位数 实际背景负载 负载 RTT 中位数 负载 RTT p99
udp10 388.7 µs 6.03 Gbit/s 1,822.8 µs 3,070.1 µs
udp100 370.7 µs 75.62 Gbit/s 372.1 µs 390.3 µs
uudp100 229.3 µs 80.21 Gbit/s 217.0 µs 280.5 µs
ib40 245.0 µs 36.75 Gbit/s 237.5 µs 271.4 µs

10 GbE 路径的 RTT 中位数扩大到 4.7 倍,p99 超过 3 毫秒;该条件的样本拒绝率 中位数为 7.14%。其余三条路径仍接近空载中位数。这个结果只适用于本次达到的 负载、队列行为和测试时长。

RTT 结果说明可变排队可能扰动用于计算抖动的偏移样本;RTT 本身不是同步结果。

另一个测试在静默期之间插入两秒双向背景流量。下图横轴是时间,纵轴是相对于 每次运行突发前静默期偏移中位数的变化,灰色带表示负载发生时间。细线表示单次 重复,粗线表示每秒中位数。四个面板共用纵轴。

udp10 在突发期间的 RTT p99 达 2.80 ms;udp100uudp100ib40 都低于 406 微秒。

OpenNTPD 在重复两秒网络突发期间的偏移变化
相对于各次运行突发前偏移中位数的变化。灰色带为两秒流量突发,细线为各次重复,粗线为每秒中位数。

定向负载移动了估计偏移

设参考时钟实际比客户端快 θ,请求单向网络延迟为 d_request,响应单向 延迟为 d_response。四个 NTP 时间戳得到:

estimated offset = θ + (d_request - d_response) / 2

NTP 无法区分真实时差与两个单向延迟之差的一半。两个方向延迟相等时会抵消; 只有一个方向排队时,该排队会表现为时钟偏移。定向负载测试每次只加载一个方向, 故意制造这种不对称。

udp10 上,偏移中位数分别为:

  • 客户端 → 参考端负载:+691.0 µs
  • 参考端 → 客户端负载:−229.8 µs

两者相差 920.8 微秒,而两只物理时钟都没有被修改。udp100uudp100ib40 的对应方向差分别为 10.0、86.5 和 126.3 微秒。

图中参考端→客户端映射为 −1,双向负载映射为 0,客户端→参考端映射为 +1。 图表保留重复点与条件中位数,并拟合直线;斜率表示每单位归一化方向引起的偏移 变化。udp10 的斜率绝对值为 460.4 微秒。

正向、反向和双向背景负载下测得的相对时钟偏移与拟合斜率
圆点为各次重复,方块为条件中位数,直线为拟合斜率。偏移变化来自不对称延迟偏差,不代表任一物理时钟发生移动。

因此,偏移估计中会包含一部分网络延迟不对称。

恢复结果与一个后端缺陷

把客户端放在参考端后面 120 秒会触发启动 step。step 是一次性跳变时钟;slew 是通过改变时钟速率逐步修正偏移。四条路径均在 4.24–4.30 秒内达到连续三个 样本距离零点小于 1 ms。

120 秒的起始偏移比 step 后最小偏移大一百多万倍,因此线性坐标会遮住零点附近 的变化。普通对数坐标无法表示零或负值。图中的启动 step 改用带符号的对称对数 (symmetric logarithmic,symlog)坐标:−100 到 +100 微秒之间保持线性;超出 该区间后,相同的纵向距离表示幅度增加十倍,同时保留正负号。

在大约每秒一个有效样本的采样率下,展开后的尺度没有显示反复穿过零点的振铃; 它无法分辨 NTP 交换之间更快的变化。step 后,八条传输/重复轨迹保持为正,范围是 +32.5 到 +355.1 微秒。第三次重复中,四种传输都穿过零点一次,随后保持为负; 剩余窗口内范围是 −0.492 到 −2.360 毫秒。这表明观测样本中存在依赖重复轮次的 step 后偏差与漂移,而不是围绕零点的反复振荡。

250 ms 的正常 slew 在任何传输的 30 秒窗口内都没有达到该标准。正负 50 百万分之一(parts per million,ppm)频率误差也没有在 30 秒内收敛,最终 注入误差仍为 ±50 ppm。观察窗口短于 OpenNTPD 对应的控制时间尺度。

分别显示小偏移 slew 与大偏移启动 step 的相对时钟偏移恢复面板
250 ms slew 使用线性坐标;120 s 启动 step 使用带符号的 symlog 坐标,在 ±100 µs 内为线性,区间外为对数。各列对应不同传输,细线为重复,粗线为中位数。

进程与连接恢复更快:

  • 客户端重启后,中位 0.55–0.64 秒重新获得样本;
  • 传输重启后为 0.74–0.77 秒;
  • 连通性恢复后为 1.60–1.89 秒。

RDMA UD 客户端没有在 24 秒条件内从参考端进程重启中恢复。重启后的 UD 服务器拥有新的 QP 编号;客户端保留了过期的远端地址,动作后没有记录到有效 样本。进程没有崩溃,QP 没有卡死,清理成功,但同步没有恢复。

我们正在调查这个缺陷。修复目标是:服务器端点消失时使旧远端地址失效,重新 发现重启后服务器的新 QP 编号,再用同一个重启条件证明客户端可以恢复。

丢包结果

实验在提交到传输之前注入丢包,因此四个后端获得相同语义。RDMA UD 不重传。

名义 1% 条件在确定性的 16 秒窗口中只产生一个丢包,观察到的拒绝率约为 6.7%;5% 条件产生两个丢包,拒绝率约为 6.7–7.1%。

16 个样本无法估计 0.1% 丢包率;0.1% 条件经常一个包也不丢。这些短条件能 一致触发行为,但不构成统计能力足够的丢包研究。

失败的结果与待解决问题

本次运行没有达到主要性能目标:

  • 三条标称更快的路径都使稳态对等端抖动比 10 GbE 更差;用户态 UDP 将其 提高到 10.8 倍。
  • 本次运行中,用户态 UDP 的稳态测量偏移和滤波偏移也明显更大,原因尚未分离。
  • 30 秒窗口不足以让 250 ms slew 与 ±50 ppm 频率修正收敛,因此这些条件 不能比较最终控制精度。
  • RDMA UD 客户端没有在服务器进程重启后重新发现端点;该恢复缺陷正在调查。

运行还表明,定向排队会偏置 NTP 的偏移估计,饱和的 10 GbE 路径出现毫秒级 排队。RDMA UD 的自由运行 RMS 残差最低,但没有得到最低的稳态抖动。

源代码、配置、原始观测、事件流、系统清单、随机顺序、汇总和图表可以从 实验的证据包 下载。