dpdk - 使用 DPDK 测量往返时间

标签 dpdk roundtrip

我的系统是 CentOS 8,内核为:4.18.0-240.22.1.el8_3.x86_64,我使用的是 DPDK 20.11.1。内核:

我想以优化的方式计算往返时间,以便从机器 A 发送到机器 B 的数据包从机器 B 环回到 A 并测量时间。完成此操作时,机器 B 会运行一个 DPDK 转发应用程序(例如 testpmd 或 l2fwd/l3fwd)。

一种方法是使用 DPDK pktgen 应用程序 ( https://pktgen-dpdk.readthedocs.io/en/latest/ ),但我找不到它以这种方式计算往返时间。虽然 ping 是另一种方式,但是当机器 B 收到来自机器 A 的 ping 数据包时,它必须处理该数据包,然后响应回机器 A,这会增加一些周期(在我的情况下这是不希望的)。

接受计算该时间的建议和方法。此外,比较基于 DPDK 的应用程序与非 DPDK 设置的 RTT(往返时间)的基准也将提供更好的比较。

编辑:有一种方法可以在 DPDK pktgen 中启用延迟。任何人都可以分享一些关于如何计算此延迟及其含义的信息(我在文档中找不到有关页面延迟的可靠信息。

最佳答案

这实际上取决于您想要测量的往返行程类型。考虑以下时间戳:

  -> t1  -> send() -> NIC_A -> t2  --link--> t3  -> NIC_B -> recv() -> t4
host_A                                                              host_B
  <- t1' <- recv() <- NIC_A <- t2' <--link-- t3' <- NIC_B <- send() <- t4' 

你想测量t1' - t1 ?然后,只需编写一个小型 DPDK 程序,在主机 A 上每次发送/接收函数调用之前/之后存储 TSC 值。(在主机 B 上运行转发应用程序。)另请参阅 rte_rdtsc_precise()rte_get_tsc_hz()用于将 TSC 增量转换为纳秒。

对于非 DPDK 程序,您可以通过 other means 读出 TSC 值/频率。 。根据您的分辨率需求,您也可以调用 clock_gettime(CLOCK_REALTIME)其开销约为 18 ns 左右。

这适用于通过 rte_eth_tx_burst() 传输的单个数据包和单个数据包接收 - 这对于您的目标应用程序来说不一定现实。对于较大的突发,您必须在第一次传输之前和最后一次传输之后使用获取时间戳,然后计算平均增量。


时间戳t2, t3, t2', t3'是由(更严重的)NIC 提供的硬件传输/接收时间戳。

如果你想计算往返t2' - t2那么您首先需要控制 NIC 的时钟(例如使用 phc2ys ),启用时间戳并获取这些时间戳。不过,一般来说,AFAICS dpdk 不支持获取 TX 时间戳。

因此,在使用 SFP 收发器时,另一种方法是安装无源 optical TAPs在 NIC_A 的 RX/TX 端,并将监控端口连接到支持接收硬件时间戳的数据包捕获 NIC。通过这样的设置,计算 t2' - t2往返只需编写一个脚本,从 pcap 读取匹配数据包的时间戳并计算它们之间的增量。

关于dpdk - 使用 DPDK 测量往返时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67784263/

相关文章:

http - 将自定义传输添加到第三方包

linux - Linux 中是否保留了 TCP 连接的 RTT(往返时间)统计信息?

ajax - AJAX 与 Web Sockets 的往返时间

c - dpdk mempool 分配的方式超出了必要

c++ - 轮询模式下的 CPU 使用率

linux - 运行 DPDK 负载均衡器示例应用程序

c++ - 使用 visual studio 测量 RTT

docker - 在 Linux Alpine 上安装 DPDK 时出错

linux - 无法使用 Linux perf,因为您的 Linux 内核不支持 PERF_COUNT_HW_REF_CPU_CYCLES 事件

java - Java 中除了 ping 命令之外用 IP 地址计算往返时间的方法