Linux 上传入网络包的延迟 - 如何分析?

Posted

技术标签:

【中文标题】Linux 上传入网络包的延迟 - 如何分析?【英文标题】:Delay of incoming network package on Linux - How to analyse? 【发布时间】:2021-10-26 14:46:57 【问题描述】:

问题是:有时 tcpdump 发现 UDP 数据包的接收被推迟到下一个传入的 UDP 数据包,尽管网络分流设备显示它通过电缆没有延迟。

场景:我在 Linux 上的 profinet 堆栈(位于用户空间)有一个循环连接,它每 4 毫秒(通过原始套接字)接收和发送 Profinet 协议数据包。根据该协议,大约每 30 毫秒它还会在 UDP 套接字上的另一个线程中接收 UDP 数据包并立即回复它们。大约 10% 的 CPU 负载。有时,接收到的 UDP 数据包似乎卡在网络驱动程序中。 2 秒后,下一个 UDP 数据包进来,丢失的 UDP 数据包和下一个都被接收。没有丢包。

我的测量:

    我使用tcpdump -i eth0 --time-stamp-precision=nano --time-stamp-type=adapter_unsynced -w /tmp/tcpdump.pcap 将UDP 流量记录到RAM 磁盘文件中。 同时我使用网络分流设备记录流量。

问题:

    如何找出延迟的来源(或者是已知的影响)? (2. 时间戳(tcpdump 为每个数据包设置的)告诉我什么?我的意思是,它指的是哪个 OSI 层,换句话说:它是什么时候使用的?)

拓扑:“带有 Linux 和 eth0 的嵌入式设备” tap-device PLC。程序“tcpdump”正在嵌入式设备上运行。 Tap 设备正在收听电缆。实际的 Profinet 连接是在 PLC 和嵌入式设备之间。一台 PC 连接在 Tap 设备上以记录它正在收听的内容。

Wireshark(通过 Tap 和 tcpdump):参见 here(tcpdump.pcap 中的数据包编号 3189)

【问题讨论】:

您似乎在描述一个“腐烂的数据包”问题,在轮询到中断模式之间转换时,一些实现 NAPI 的以太网设备驱动程序中存在这种问题。见***.com/questions/23574203/… 和elixir.bootlin.com/linux/v2.6.16.11/source/Documentation/… @sawdust 在那段时间里(当可能的“腐烂的 UDP 数据包”通过电缆到达,2 秒后下一个 UDP 数据包到达并解决它时)从原始套接字读取了很多 Profinet 数据包在并行线程中。所以我猜想以太网驱动程序实际上正在完成它的工作而没有睡太多(并且缺少东西)。 附加信息:使用 --time-stamp-precision=nano 记录 tcpdump 仍然显示有问题的 UDP 数据包有 2 秒的延迟(这是下一个 UDP 数据包进来的时间)跨度> 这是什么内核版本?什么驱动和设备? “在那段时间......读取了很多 Profinet 数据包” -- 不要依赖用户空间活动来猜测驱动程序何时处理中断!事实上,这可能是触发问题的数据包突发。此外,EMAC 硬件无法区分 UDP 和 Profinet 帧。由于 RX 在数据包突发后变为空闲,因此会发生腐烂数据包。尝试 ping 该主机以查看是否会影响 2 秒延迟。据我了解,Profinet 是基于 UDP 构建的,因此您不太可能看到 UDP 堆栈问题。 内核是“5.4.61-rt37-lf-5.4.y+g20de6d5a36a4”和“dmesg|grep net”输出:“001: audit: initializing netlink subsys (disabled), 003: libphy :fec_enet_mii_bus:已探测,000:fec 30be0000.ethernet eth0:已注册的 PHC 设备 0,000:fsl_dpa:FSL DPAA 以太网驱动程序,000:tsn 通用网络链接模块 v1 初始化...,001:Atheros 8031 以太网 30be0000.ethernet-1: 00: 附加 PHY 驱动程序 [Atheros 8031 以太网] (mii_bus:phy_addr=30be0000.ethernet-1:00, irq=POLL)" 【参考方案1】:

这是飞思卡尔快速以太网驱动程序 (fec_main.c) 中的一个错误,NXP 现在通过其强大的支持修复了它。

实际答案(对于“如何找出延迟从何而来?”的问题)是:必须构建一个启用内核跟踪的 Linux,使用内核跟踪修补驱动程序代码,然后使用开发者 Linux 工具 trace-cmd。这是一件非常复杂的事情,但我很高兴它现在得到了修复:

trace-cmd record -o /tmp/trace.dat -p function -l fec_enet_interrupt -l fec_enet_rx_napi -e 'fec:fec_rx_tp' tcpdump -i eth0 --time-stamp-precision=nano --time-stamp-type=adapter_unsynced -w /tmp/tcpdump.pcap

【讨论】:

以上是关于Linux 上传入网络包的延迟 - 如何分析?的主要内容,如果未能解决你的问题,请参考以下文章

关于Linux 网络抓包的一些笔记整理

关于Linux 网络抓包的一些笔记整理

你不好奇 Linux 是如何收发网络包的?

linux服务器被攻击如何进行抓包来进行分析

网络诊断三部曲

Linux内核中网络数据包的接收-第二部分 select/poll/epoll