RDMA中的数据包捕获?

10
在Linux中,是否有像tcpdump一样的实用程序,可以捕获通过RDMA通道传输的流量?(Infiniband/RoCE/iWARP)

你最终是如何解决这个问题的? - Djvu
1
ibdump对我非常有用,就像@kliteyn建议的那样。你在寻找什么样的数据包?我正在进行RMDA_WRITE_WITH_IMMIDIATE操作,我可以看到所有的数据包。 - dhavale
1
我只是想确认是否有一些RDMA数据包正在发送到网络。但是当我使用ibdump时,我只捕获了很少的数据包,例如ibdump显示的2个数据包。但是我发送了很多数据。我也想知道ibdump捕获的数据包的含义,它们仅用于连接设置,而不包含发送的数据吗? - Djvu
我有另一个问题。使用ibdump捕获的数据包编号在我发送数据结束后会增加。那这是什么意思呢?是ibdump响应慢吗?不像tcpdump一样实时显示。 - Djvu
6个回答

10

虽然这是一个旧帖子,但仍然有参考价值:

正如Roland所指出的那样,嗅探RDMA流量很棘手,因为一旦端点完成了初始握手,流量就直接通过网络适配器(HCA)进入内存。 在不在线路上放置专用硬件嗅探器的情况下,唯一的嗅探此流量的方法是在网络适配器中使用特定于供应商的钩子,并使用SW工具来使用这些钩子。

如果您拥有Mellanox HCA,您可以使用“ibdump”工具。该工具还是Mellanox OFED软件包的一部分。

如果您拥有其他供应商的硬件,则需要与该供应商进行确认-很抱歉,您不会找到适用于所有RDMA设备的开源数据包嗅探器。


我认为你的答案最合适。我已经了解到每个供应商都必须提供用于在其HCA上进行数据包捕获的实用程序。目前我只处理Mellanox HCA,你是对的,“ibdump”就是这个问题的答案。我现在已经尝试过它并且可以进行捕获。但是我发现它仅记录RDMA操作头而不是有效载荷本身。我不知道这是否是默认行为还是我需要升级软件包。但是从本质上讲,“ibdump”起作用,这正是我提出问题时正在寻找的。谢谢! - dhavale
@kliteyn 但是为什么ibdump捕获的数据包这么少,我发送了很多数据包,但它只捕获了一些数据包。 - Djvu
@Djvu ibdump readme列出了一些限制,例如在突发期间丢失数据包。与tcpdump不同的是,在捕获过程中它不会报告丢失的数据包数量。您的ibdump可能会因要捕获的数据包数量过多而不堪重负。 - maxschlepzig

4
一般情况下是不可以的。 RDMA 的主要特点之一是所有网络处理都在适配器上完成,完全不涉及 CPU。通常工作请求直接从用户空间排队到适配器,不需要任何系统调用。因此,嗅探器无处可钩取流量。
话虽如此,对于以太网协议、iWARP 或 IBoE(又称 RoCE),您可以将系统连接在连接的中间,并设置其在软件中进行转发(例如 Linux 桥模块),然后运行 tcpdump 或 wireshark 来捕获通过此系统传输的 RDMA 流量。Wireshark 甚至还有 iWARP 和 IBoE 的解析器。
对于原生 InfiniBand,理论上可以构建类似的东西(设置适配器来捕获和转发流量),但据我所知,没有人做过必要的固件或驱动程序工作来实现基本的数据包嗅探。

感谢Roland的建议!我将探索使用Linux Bridge进行嗅探。我理解数据包是直接从用户空间排队的,这就是为什么没有拦截的位置。我正在从内核中使用ib_post_send()排队工作请求,所以我认为在实现中应该有一些地方可以知道数据包是否已发送到其他节点。我不知道是否可以在没有固件支持的情况下实现,也许当您在CQ上收到事件时?提出此问题的主要原因是当我在接收器中看不到数据时,我们需要一种方法来告诉哪个RNIC出了问题,是发送方还是接收方? - dhavale

3

Chelsio的T4设备支持数据包跟踪功能,允许它将收发卸载数据包复制到设备的NIC队列之一。然后您可以在该ethX接口上使用tcpdump或其他工具来查看RDMA或TOE数据包。


谢谢Steve!我会向我的硬件供应商(Mellanox)咨询是否支持类似的东西。 - dhavale

1

当我写这个答案的时候,现在可以使用最新的Linux内核或安装Mellanox OFED(Nvidia)来嗅探网络。

如何使用内置的tcpdump工具转储RDMA流量(ConnectX-4及以上版本)

安装Mellanox OFED(如果需要),您可以生成一个pcap文件,并稍后通过在Wireshark中打开该pcap文件进行分析。

tcpdump -i mlx5_1 -s 65535 -w rdma_traffic.pcap

确保使用mlx5_X可用的接口。

0
捕获此类流量的可靠方法是将其复制到专用捕获端口中。这些端口可以是您开发机器上的附加以太网/IB端口(或附加适配器),也可以位于另一台捕获机器中。
基本上有两种方法可以复制流量:
  1. 在交换机中配置端口镜像。管理型以太网交换机中支持端口镜像的功能非常普遍,即使是便宜的交换机也有此功能。此功能也可在一些 Mellanox Infiniband 交换机中使用。您可以将一个端口的两个方向镜像到另一个端口,但如果被镜像的端口同时以线速率接收和发送(全双工),则会超额订阅接收器。在这种情况下,一些帧无法转发到捕获端口,因此被丢弃。为避免此限制,需要将每个方向镜像到单独的捕获端口。

  2. 将网络电缆连接到TAP(目标访问点)设备,该设备可以复制或分割信号。在光纤网络中,这些 TAP 设备通常以完全被动的方式构建,因此不会增加太多复杂性,并且相对便宜(示例)。每根光纤都需要一个 TAP,即如果要捕获两个方向,则始终占用 2 个捕获端口。TAP 设备适用于以太网网络中常用的光纤和连接器。如果您的 Infiniband 硬件也使用相同的设备,则应该能够在那里使用相同的 TAP 设备,至少是被动的那些。

一旦镜像/复制的流量到达您的捕获端口,您可以使用标准的抓包工具,例如tcpdump。

对于Infiniband,有ibdump,但是,根据您使用的Infiniband软件(开源OFED与专有Mellanox OFED)和主机通道适配器(HCA),您也可以使用tcpdump来捕获Infiniband流量


0

Wireshark可能是一个选择。但问题在于您需要一个观察服务器。启用镜像功能后,您应该能够在观察者处接收ROCE数据包。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接