【问题标题】:Can I use tcpdump to measure end to end latency (including kernel times)?我可以使用 tcpdump 测量端到端延迟(包括内核时间)吗?
【发布时间】:2017-03-06 20:16:39
【问题描述】:

在 Ubuntu 14.04 服务器上,我试图测量我的软件堆栈处理 UDP 数据包并发出相应 TCP 响应所需的端到端时间。我正在寻找至少微秒级的精度。

我的策略是使用 tcpdump 捕获机器上的网络流量,然后分析流量以配对 UDP 和 TCP 数据包,并使用它们的相对时间戳生成相同的静态数据。这似乎工作正常,因为我获得的时间与我通过应用程序级别跟踪获得的时间一致。

但是,我想知道我是否真的捕获了在 Linux 内核处理 UDP 和 TCP 上花费的大部分时间(这是我的意图),或者 tcpdump 是否过早或过晚为数据包添加时间戳而无法进行此测量有用吗?

提前致谢。

【问题讨论】:

    标签: linux networking linux-kernel tcpdump


    【解决方案1】:

    现在,tcpdump 支持硬件时间戳。如果您打开硬件时间戳并且您的 NIC 和驱动程序支持它,您可以获得微秒精度。例如在Intel i210(优质、廉价的千兆位/秒 NIC)发送时间戳是在 MAC 将数据包发送到 PHY 之前获取的,延迟 MAC->PHY 是众所周知的,并由驱动程序补偿。

    如果您想测量从用户空间到 PHY 的时间,有一些方法可以关联 NIC 时钟和系统时钟,并将用户空间中的时间戳与硬件时间戳进行比较。如果这样做,您可能必须补偿时钟漂移。例如,如果我没记错的话,i210 上的时钟漂移高达 30ppm,除了温度变化外,它还会随着时钟晶体的老化而增加。

    有关详细信息,请参阅例如http://lxr.free-electrons.com/source/Documentation/networking/timestamping.txt

    我也做了一些测试程序,见https://github.com/alapaa/timestamping/tree/send_queue

    【讨论】:

    • 感谢您的精彩回复。我从中学到了很多。我还没有结束这个问题,因为我仍然想知道软件时间戳对总内核时间的代表程度(我正在使用的特定卡不支持硬件时间戳)。如果我在其他地方发现这个问题,我会更新这个问题。
    • 好的。关于内核处理时间和用户空间处理时间:在两个快速 Xeon 机器通过千兆交换机连接的设置中,接收机器上内核和用户空间所花费的时间通常是总回合的大部分(可能是 70%)行程时间(RTT)。因此,对于短 RTT,在网络中花费的实际时间比在软件“翻转数据包”中花费的时间要少。
    • MAC 收到来自 PHY 的数据包后,收到数据包的时间戳是否正确?
    • 我做这个已经4年了,所以我建议你检查内核文档或代码。
    • @falkb 如果我没记错的话,有些网卡甚至会补偿从 PHY 到 NIC 的时间,所以时间戳是数据包到达 PHY 的时间。
    猜你喜欢
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多