目录
一、抓包命令
ibdump 抓包命令
tcpdump抓包命令
二、RDMA抓包
Mellanox 网卡
1.ibdump
2.tcpdump (docker,Linux内核从4.9以上)
3.Offloaded Traffic Sniffer(tcpdump,ConnectX®-4以上的版本,libpcap库v1.9或更高版本)
Intel RDMA网卡
端口镜像方式
在mellanox主机上抓包
抓包测试
数据收发测试工具:
三、抓包结果文件拆分
边抓包边切割
切割已经爪完成的包
四、抓包结果分析
RDMA抓包
作者:bandaoyu,原始连接:https://blog.csdn.net/bandaoyu/article/details/115791233
[root @ rdma64 ibdump-master]#ibdump -h
ibdump-dump Mellanox Technologies ConnectX 网卡的 Infiniband 数据包
可以生成文件给Wireshark进行图形流量分析
用法:
ibdump [选项]
选项:
-d,--ib-dev =
-i, --ib-port = <端口>使用IB设备的端口<端口>(默认1)
-w,-write = <文件> 结果保存到文件(默认为“ sniffer.pcap”)
“-”代表标准输出-启用管道传输到tcpdump或tshark。
-o,--output = <文件>是-w选项的别名。不使用-为了向后兼容
-b,--max-burst =
捕获而没有数据包丢失。
每个条目占用〜MTU字节的内存(默认12-4096个条目)
-s,-silent不打印进度指示。
-T,--conti使用连续页面。
-M,--mem-mode <大小>(指定时),仅在抓包动作停止后才将包写入文件,它比默认模式快(丢包更少)
,但占用更多内存。在这种模式下,ibdump在捕获
-p,--writer-thread <大小>使用特定线程将数据写入磁盘。为了使用此功能,您必须指定
两个临时缓冲区的大小,用于保存数据给线程写入磁盘
--decap 解封装端口镜像的headers。用于捕获RSPAN流量时需要启用。
-h,--help显示此帮助屏幕。
-v,--version打印版本信息。
用法:Mellanox Interconnect Communityhttps://community.mellanox.com/s/article/MLNX2-117-2647kn
[root@tuki1 ~]# ibdump -d mlx5_0 -i 1
简介:tcpdump是一个可以根据需求来抓取网络上传输的数据包的工具
常用的命令选项有:
-c:设定抓取的数量
-i:指定监听的网口
-w:将抓取的数据包保存到文件
-s:截取报文的内容,默认截取96字节,-s0表示截取全部
-r:读取数据包内容
-C 10: 每10M保存一个包
-G 600:每10分钟保存一个包
过滤的参数规则:
host:指定主机名
net:指定网段
port:指定端口
portrange:指定端口范围
连接运算符
and:所有的条件都满足
or:只要满足一个条件
not:取反,也可以用!
例子:
1、抓取主机172.0.0.1的eth0网口的8080、8081端口传输的数据包并保存文件
tcpdump -i eth0 -s0 port 8080 or port 8081 host 172.0.0.1 -w 1.pcap
2、按 crtl+c 停止抓包,当前目录会生成一个1.pcap文件
3、简单查看数据包内容
tcpdump -r 1..pcap
注:一般对抓取的数据包用Wireshark工具进行分析
注意:如果您正在使用MLNX_OFED v5.1或更高版本,请确保安装了libpcap库v1.9或更高版本,以便能够激活该功能。要下载libpcap,请访问https://www.tcpdump.org/。
有三种方法。(抓包:sniffer packet、Packet capture)
嗅探RDMA流量(抓包RDMA)非常棘手,因为一旦两端完成了初始握手,数据便会不经过内核协议栈通过网卡(HCA)直接到达内存。除了在网络上放置专用硬件嗅探器来抓包,剩下的唯一方法就是在网卡内放置有网卡商的hook接口,然后网卡商提供使用这些接口的 软件工具。
例如:Mellanox HCA(网卡)的ibdump,This tool is also a part of Mellanox OFED package.
Mellanox github: https://github.com/Mellanox/ibdump
编译报错:ibdump.c:890:30: 错误:‘IBV_FLOW_ATTR_SNIFFER’未声明(在此函数内第一次使用)
则在文件:vim ibdump.c 添加:
#if !defined(IBV_FLOW_ATTR_SNIFFER)
#define IBV_FLOW_ATTR_SNIFFER 3
#endif
具体含义见:https://man7.org/linux/man-pages/man3/ibv_create_flow.3.html
执行:
make WITHOUT_FW_TOOLS=yes
启用步骤:
1.将以下内容添加到/etc/modprobe.d/mlnx.conf文件:
options mlx4_core log_num_mgm_entry_size = -1:
(实际mlnx.conf提示:
Please don't edit this file. Create a new file under
# /etc/modprobe.d/ for your configurations.
所以在/etc/modprobe.d/下创建:
mlx5.conf #根据主机上的实际ib名称创建
options mlx4_core log_num_mgm_entry_size = -1:
options mlx5_core log_num_mgm_entry_size = -1: #不确定,我又补了这一句
)
2.重新启动驱动程序。
重启网络接口ib0
ifdown ib0
ifup ib0
注意:如果将HCA的端口中有一个配置为InfiniBand,则ibdump要求IPoIB DMFS是使能的。有关更多信息,请参阅第3.1.12.1节,启用/禁用流向,第103页。有关更多信息,请参阅工具的手册页。
Mellanox 社区--https://mymellanox.force.com/mellanoxcommunity/s/article/MLNX2-117-2032kn
服务端:
ib_write_bw -d mlx5_1 #监听mlx5_1 网卡#客户端
ib_write_bw 182.205.31.53 --report_gbits -F抓包:
ibdump -d mlx5_1 -i 1
ibdump -d mlx5_1 -i 1 -w msg.acp #抓包并写入msg.acp
-d,--ib-dev =
-i, --ib-port = <端口>使用IB设备的端口<端口>(默认1)
-w,-write = <文件> 结果保存到文件(默认为“ sniffer.pcap”)
“-”代表标准输出-启用管道传输到tcpdump或tshark。
(更多参数说明见本文后面)
测试RDMA网卡:https://blog.csdn.net/ljlfather/article/details/102925954
最新消息:Linux内核从4.9版开始就支持抓包RDMA(RoCE)流量。tcpdump发展到使用RDMA verbs接口直接 捕获流量。请确保使用最新的Linux内核service:https://hub.docker.com/r/mellanox/tcpdump-rdma
(查看内核版本命令:uname -r、uname -a、lsb_release -a)
但是,在某些系统上很难升级tcpdump应用程序和关联的库以利用最新功能(特别是RDMA嗅探器)。
使用该docker容器是用户能使用tcpdump捕获和分析RDMA数据包的简单,优雅且最快的方式。
使用方法:
1、拉取容器:
docker pull mellanox / tcpdump-rdma2、启动容器
docker run -it -v /dev/infiniband:/dev/infiniband -v /tmp/traces:/tmp/traces --net=host --privileged现在mellanox/tcpdump-rdma bash 开始使用RDMA设备mlx5_0捕获数据包。 (注意RDMA设备,而不是以太网设备)
3、保存捕获结果到文件
tcpdump -i mlx5_0 -s 0 -w /tmp/traces/capture1.pcap
这会将数据包保存在容器内外/ tmp / traces目录中的capture1.pcap文件中。
-s:截取报文的内容,默认截取96字节,-s0表示截取全部
-i:指定监听的网口
(更多参数说明见本文后面)
原文:https://docs.mellanox.com/display/MLNXOFEDv451010/Offloaded+Traffic+Sniffer
在ConnectX®-4和更高版本的网卡中受支持。
Offloaded 流量嗅探器 使得bypass kernel的数据传输方式 (如 RoCE, VMA, and DPDK)的流量可以被tcpdump等现有的抓包分析工具捕获
使能Offloaded Traffic Sniffer:
Turn on the new ethtool private flags "sniffer" (off by default).
|
在要监听的以太网接口上设置sniffer
标志后,运行tcpdump捕获该接口上的bypass kernel 流量。
注意:使能Offloaded Traffic Sniffer会降低bypass kernel数据流的速度。
有关如何使用ConnectX-4网卡自带的tcpdump工具 dump RDMA流量的示例:
(示例英文原文:https://community.mellanox.com/s/article/how-to-dump-rdma-traffic-using-the-inbox-tcpdump-tool--connectx-4-x)
一、前提条件
设置
注意:如果您使用的是MLNX_OFED v5.1或更高版本,请确保在您的设置中安装了libpcap库v1.9或更高版本,以便能够激活该功能。要下载libpcap,请访问https://www.tcpdump.org/。
在下面的示例中,使用了两个通过ConnectX-4适配器背对背连接的服务器。查看tcpdump和libpcap版本
[root@rdma63 dscp]# tcpdump --help
tcpdump version 4.9.2
libpcap version 1.5.3配置
- 链路层:以太网
- 流量:RoCE
二、执行过程
1.配置两个适配器端口的IP地址,并确保在服务器之间运行ping。2.使用ethtool启用嗅探器。
在此示例中,网卡名称为ens785f0:
# ethtool --set-priv-flags ens785f0 sniffer on注意:如果您使用的是MLNX_OFED v5.1或更高版本,则此步骤无关紧要。
3.运行tcpdump等待数据包对于低于5.1的MLNX_OFED版本,请运行:
#tcpdump -i ens785f0 -s 65535 -w rdma_traffic.pcap对于MLNX_OFED v5.1及更高版本,运行:
#tcpdump -i mlx5_1 -s 65535 -w rdma_traffic.pcap测试完成后,在wireshark中打开文件。
请参阅tcpdump主页(tcpdump(8):https://linux.die.net/man/8/tcpdump)以查看更多示例。4. 验证RDMA抓包效果(Run RDMA traffic):
在一个服务器上运行
# ib_send_bw
************************************ * Waiting for client to connect... * ************************************
在另外一个服务器上运行:
# ib_send_bw 192.168.5.232 --report_gbits -F
--------------------------------------------------------------------------------------- Send BW Test Dual-port : OFF Device : mlx5_1 Number of qps : 1 Transport type : IB Connection type : RC Using SRQ : OFF TX depth : 128 CQ Moderation : 100 Mtu : 4096[B] Link type : Ethernet Gid index : 0 Max inline data : 0[B] rdma_cm QPs : OFF Data ex. method : Ethernet --------------------------------------------------------------------------------------- local address: LID 0000 QPN 0x01ae PSN 0x31a206 GID: 00:00:00:00:00:00:00:00:00:00:255:255:12:12:12:06 remote address: LID 0000 QPN 0x020a PSN 0xa2824e GID: 00:00:00:00:00:00:00:00:00:00:255:255:12:12:12:05 --------------------------------------------------------------------------------------- #bytes #iterations BW peak[Gb/sec] BW average[Gb/sec] MsgRate[Mpps] 65536 1000 95.16 95.16 0.181502 ---------------------------------------------------------------------------------------
5.检查输出文件。
在此示例中,UDP端口4791用于RoCEv2通信。# cat ~/rdma_traffic.txt ... 14:48:23.007280 IP (tos 0x0, ttl 64, id 5066, offset 0, flags [DF], proto UDP (17), length 308) 1.1.6.2.49153 > 1.1.5.2.4791: [no cksum] UDP, length 280 0x0000: 248a 0780 5401 e41d 2df2 a45c 8100 0006 $...T...-..\.... 0x0010: 0800 4500 0134 13ca 4000 4011 18ea 0101 ..E..4..@.@..... 0x0020: 0602 0101 0502 c001 12b7 0120 0000 6440 ..............d@ 0x0030: ffff 0000 0001 0000 002a 8001 0000 0000 .........*...... 0x0040: 0001 0107 0203 0000 0000 0000 0011 7a2f ..............z/ 0x0050: ac19 0010 0000 0000 0000 19ac 2f7a 0000 ............/z.. 0x0060: 0000 0000 0000 0106 4853 e41d 2d03 00f2 ........HS..-... 0x0070: a45c 0000 0000 0000 0000 0001 a400 0000 .\.............. 0x0080: 0000 0000 00b0 28a5 38b7 ffff 37f0 ffff ......(.8...7... 0x0090: ffff 0000 0000 0000 0000 0000 ffff 0101 ................ 0x00a0: 0602 0000 0000 0000 0000 0000 ffff 0101 ................ 0x00b0: 0502 0000 0007 0040 0098 0000 0000 0000 .......@........ 0x00c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0x00d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0x00e0: 0000 0000 0000 0040 b1ee 0000 0000 0000 .......@........ 0x00f0: 0000 0000 0000 0101 0602 0000 0000 0000 ................ 0x0100: 0000 0000 0000 0101 0502 0000 0000 0000 ................ 0x0110: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0x0120: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0x0130: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0x0140: 0000 5870 f2dd ..Xp..
如果您将文件保存给Wireshark,则会收到以下消息:
“请确保您使用的是最新版本的wireshark,因为旧版本可能无法很好地解析InfiniBand。”
intel主机侧的抓包工具仍然在开发中,目前(2022-10)只能通过在交换机上or交换机镜像到主机上来抓包。或者 通过和mellanox网卡通信,在mellanox主机上抓包
使用tcpdump捕获RDMA流量
-----------------------------------
RDMA通信绕过内核,Linux的tcpdump 通常不可用。您可以通过在交换机上使用端口镜像来使用tcpdump捕获RDMA通信。
1.将3个主机连接到交换机:
- 2个做RDMA通信主机。
- 1个做监控流量主机。
2.配置交换机将一个通信主机连接的交换机端口镜像到监控主机连接的交换机端口。
怎么配置镜像请参阅交换机文档。
(Configure the switch to mirror traffic from one compute node's switch port
to the monitoring host's switch port. Consult your switch documentation
for syntax.)
3.在监控主机上卸载IRDMA驱动程序:
# rmmod irdma
irdma驱动处于加载状态,则可能无法正确捕获流量。
4.在监控主机上启动tcpdump 。例如:
# tcpdump -nXX -i
5.在2通信主机之间进行RDMA通信。 RDMA数据包将出现在
监控主机上的tcpdump上。
原文链接:https://blog.csdn.net/bandaoyu/article/details/116203690
intel RDMA网卡的主机和 mellanox网卡的主机通信,在mellanox网卡的主机上抓包
tcpdump 过滤TOS值和DSCP值的抓包分享:
首先在一台Linux机器上持续ping,-Q 40 标识ICMP包的DSCP字段为40,对应AF11
然后我们另开一个shell 用tcpdump抓包:sudo tcpdump -v -i eth0 ‘ip[1]&0xfc == 40’,ip[1] 是过滤IP包头的第2个字节,0xfc相当于掩码忽略掉后两位ECN位。
这样就可以抓到AF11的包,对应上表DSCP值10[0x0a],TOS值40[0x28]。
原文链接:https://blog.csdn.net/qq_33681684/article/details/123747965
perftest工具
https://mymellanox.force.com/mellanoxcommunity/s/article/MLNX2-117-2032kn
ib_send_bw/ib_write_bw
./tcpdump udp and src host 172.17.31.54 and dst host 172.17.31.53 -i ib3b-0 -vv
测试SEND模式
在一个服务器上运行
# ib_send_bw
在另外一个服务器上运行:
# ib_send_bw 192.168.5.232 --report_gbits -F
测试WRITE模式
在一个服务器上运行
# ib_write_bw
在另外一个服务器上运行:
# ib_write_bw 192.168.5.232 --report_gbits -F
--tos 字节, DSCP占高6bit, 后2bit 没研究ib_send_bw怎么给赋值
所以想给DSCP赋值4,二进制为100,加2bit怎为100xx,
tos=10000、10001、10010、10011,即16、17、18、19想给DSCP赋值16,二进制为10000,加2bit怎为10000xx,
tos=1000000、1000001、1000010、1000011,即64
实战
[root@rdma63 tcpdump]# ifconfig 找到两张IB网卡
ib18-0: 192.169.31.53
ib3b-0: 172.17.31.53
为方便,将两个网卡都使能
$ ethtool --set-priv-flags ib18-0 sniffer on
$ ethtool --set-priv-flags ib3b-0 sniffer on
我们要监听ib3b-0这个IB网卡,监听ib3b-0网卡上从 54的IB网卡(172.17.31.54)发消息到53的IB网卡(172.17.31.53)的udp 消息。
./tcpdump udp and src host 172.17.31.54 and dst host 172.17.31.53 -i ib3b-0 -vv
查询IB卡与网口对应关系:
[root@rdma63 dscp]# ibdev2netdev
mlx5_0 port 1 ==> ib18-0 (Up)
mlx5_1 port 1 ==> ib3b-0 (Up)
我们服务器上tcpdump监听的是ib3b-0 ,即mlx5_1,所以
53(172.17.31.53)上运行server:
ib_write_bw -d mlx5_1
54(172.17.31.54)上运行client 连接ib3b-0(172.17.31.53):
ib_write_bw 172.17.31.53
用ibdump监听:
./ibdump -d mlx5_1
服务端:
ib_send_bw -d mlx5_1 --rdma_cm
客户端:
ib_send_bw 172.17.31.53 --tos=0x04 –R
--tos 字节, DSCP占高6bit, 后2bit 没研究ib_send_bw怎么给赋值
所以想给DSCP赋值4,二进制为100,加2bit怎为100xx,
tos=10000、10001、10010、10011,即16、17、18、19
想给DSCP赋值16,二进制为10000,加2bit怎为10000xx,
tos=1000000、1000001、1000010、1000011,即64、65、66、67
RDMA Qos note
日期 |
变更人 |
版本 |
备注 |
RDMA通信测试工具|RDMA信息查询工具_https://blog.csdn.net/bandaoyu/article/details/115798045
抓的包太大,怎么拆分成多个文件呢?
常用的命令选项有:
-c:设定抓取的数量
-i:指定监听的网口
-w:将抓取的数据包保存到文件
-s:截取报文的内容,默认截取96字节,-s0表示截取全部
-r:读取数据包内容
-C 10: 每10M保存一个包
-G 600:每10分钟保存一个包
用tcpdump就可以直接拆分抓到的数据包。
tcpdump -r ***.pcap -w newfile -C 1000
就是从已经捕获的文件读取,然后再另存成新文件,并且每个文件大小是1000M(不过不是1G,是1000M个字节)
RoCEv2 帧结构|RoCE和RRoCE|Soft-RoCE_https://blog.csdn.net/bandaoyu/article/details/117560876
=========================草稿======================
嗅探RDMA流量(抓包RDMA)非常棘手,因为一旦两端完成了初始握手,数据便会不经过内核协议栈通过网卡(HCA)直接到达内存。除了在网络上放置专用硬件嗅探器来抓包,剩下的唯一方法就是在网卡内放置有网卡商的hook接口,然后网卡商提供使用这些接口的 软件工具。
例如:Mellanox HCA(网卡)的ibdump,This tool is also a part of Mellanox OFED package.
用法
启用步骤:
1.将以下内容添加到/etc/modprobe.d/mlnx.conf文件:
options mlx4_core log_num_mgm_entry_size = -1:
(实际mlnx.conf提示:
Please don't edit this file. Create a new file under
# /etc/modprobe.d/ for your configurations.
所以在/etc/modprobe.d/下创建:
mlx5.conf #根据主机上的实际ib名称创建
options mlx4_core log_num_mgm_entry_size = -1:
options mlx5_core log_num_mgm_entry_size = -1: #不确定,我又补了这一句
)
2.重新启动驱动程序。
.重启网络接口ib0
ifdown ib0
ifup ib0
注意:如果将HCA的端口中有一个配置为InfiniBand,则ibdump要求IPoIB DMFS是使能的。有关更多信息,请参阅第3.1.12.1节,启用/禁用流向,第103页。有关更多信息,请参阅工具的手册页。
https://mymellanox.force.com/mellanoxcommunity/s/article/MLNX2-117-2032kn
服务端:
ib_write_bw -d mlx5_1 #监听mlx5_1 网卡
ib_write_bw 182.205.31.53 --report_gbits -F #客户端
测试RDMA网卡:https://blog.csdn.net/ljlfather/article/details/102925954
ibdump github: https://github.com/Mellanox/ibdump
注意,RDMA write/read的时候,用的是GID而不是IP,协议也不是UDP,所以不要用IP和UDP/TCP过滤,否则抓不到包
最新消息:Linux内核从4.9版开始就支持抓包RDMA(RoCE)流量。tcpdump发展到使用RDMA verbs接口直接 捕获流量。请确保使用最新的Linux内核service:https://hub.docker.com/r/mellanox/tcpdump-rdma
(查看内核版本命令:uname -r、uname -a、lsb_release -a)
但是,在某些系统上很难升级tcpdump应用程序和关联的库以利用最新功能(特别是RDMA嗅探器)。
使用该docker容器是用户能使用tcpdump捕获和分析RDMA数据包的简单,优雅且最快的方式。
使用方法:
1、拉取容器:
docker pull mellanox / tcpdump-rdma
2、启动容器
docker run -it -v /dev/infiniband:/dev/infiniband -v /tmp/traces:/tmp/traces --net=host --privileged
现在mellanox/tcpdump-rdma bash 开始使用RDMA设备mlx5_0捕获数据包。 (注意RDMA设备,而不是以太网设备)
3、保存捕获结果到文件
tcpdump -i mlx5_0 -s 0 -w /tmp/traces/capture1.pcap
这会将数据包保存在容器内外/ tmp / traces目录中的capture1.pcap文件中。
原文:https://docs.mellanox.com/display/MLNXOFEDv451010/Offloaded+Traffic+Sniffer
在ConnectX®-4和更高版本的网卡中受支持。
Offloaded 流量嗅探器 使得bypass kernel的数据传输方式 (如 RoCE, VMA, and DPDK)的流量可以被tcpdump等现有的抓包分析工具捕获
Turn on the new ethtool private flags "sniffer" (off by default).
$ ethtool --set-priv-flags enp130s0f0 sniffer on
(在运行tcpdump的主机上)
注意:使能Offloaded Traffic Sniffer会降低bypass kernel数据流的速度。
有关如何使用ConnectX-4网卡自带的tcpdump工具 dump RDMA流量的示例:
(示例英文原文:https://community.mellanox.com/s/article/how-to-dump-rdma-traffic-using-the-inbox-tcpdump-tool--connectx-4-x)
一、前提条件
设置
注意:如果您使用的是MLNX_OFED v5.1或更高版本,请确保在您的设置中安装了libpcap库v1.9或更高版本,以便能够激活该功能。要下载libpcap,请访问https://www.tcpdump.org/。
在下面的示例中,使用了两个通过ConnectX-4适配器背对背连接的服务器。
查看tcpdump和libpcap版本
[root@rdma63 dscp]# tcpdump --help
tcpdump version 4.9.2
libpcap version 1.5.3
配置
链路层:以太网
流量:RoCE
二、执行过程
1.配置两个适配器端口的IP地址,并确保在服务器之间运行ping。
2.使用ethtool启用嗅探器。
在此示例中,网卡名称为ens785f0:
# ethtool --set-priv-flags ens785f0 sniffer on
注意:如果您使用的是MLNX_OFED v5.1或更高版本,则此步骤无关紧要。
3.运行tcpdump等待数据包
对于低于5.1的MLNX_OFED版本,请运行:
#tcpdump -i ens785f0 -s 65535 -w rdma_traffic.pcap
对于MLNX_OFED v5.1及更高版本,运行:
#tcpdump -i mlx5_1 -s 65535 -w rdma_traffic.pcap
./tcpdump udp and src host 172.17.31.54 and dst host 172.17.31.54 -i ib3b-0 -vv
(抓取网卡ib3b-0上 172.17.31.54 与 172.17.31.54 之间的udp数据包)
测试完成后,在wireshark中打开文件。
请参阅tcpdump主页(https://linux.die.net/man/8/tcpdump)以查看更多示例。
备注:使用过程中,发现加了port过滤后,抓不到RDMA包
Tcpdump 抓到的包的tos更像是dscp的值
测试SEND模式
在一个服务器上运行
# ib_send_bw
在另外一个服务器上运行:
# ib_send_bw 192.168.5.232 --report_gbits -F
测试WRITE模式
在一个服务器上运行
# ib_write_bw
在另外一个服务器上运行:
# ib_write_bw 192.168.5.232 --report_gbits -F
5.检查输出文件。
在此示例中,UDP端口4791用于RoCEv2通信。
# cat ~/rdma_traffic.txt
如果您将文件保存给Wireshark,则会收到以下消息:
“请确保您使用的是最新版本的wireshark,因为旧版本可能无法很好地解析InfiniBand。”
设置tos
服务端:
ib_send_bw -d mlx5_1 --rdma_cm
客户端:
ib_send_bw 172.17.31.53 --tos=0x04 -R
使用bv_xxx_pingpong可以测试RDMA设备的流量发送功能:
RDMA抓包
嗅探RDMA流量(抓包RDMA)非常棘手,因为一旦两端完成了初始握手,数据便会不经过内核协议栈通过网卡(HCA)直接到达内存。除了在网络上放置专用硬件嗅探器来抓包,剩下的唯一方法就是在网卡内放置有网卡商的hook接口,然后网卡商提供使用这些接口的 软件工具。 例如:Mellanox HCA(网卡)的ibdump,This tool is also a part of Mellanox OFED package. 用法 启用步骤: 1.将以下内容添加到/etc/modprobe.d/mlnx.conf文件: options mlx4_core log_num_mgm_entry_size = -1: (实际mlnx.conf提示: Please don't edit this file. Create a new file under # /etc/modprobe.d/ for your configurations. 所以在/etc/modprobe.d/下创建: mlx5.conf #根据主机上的实际ib名称创建 options mlx4_core log_num_mgm_entry_size = -1: options mlx5_core log_num_mgm_entry_size = -1: #不确定,我又补了这一句 ) 2.重新启动驱动程序。 .重启网络接口ib0 ifdown ib0 ifup ib0 注意:如果将HCA的端口中有一个配置为InfiniBand,则ibdump要求IPoIB DMFS是使能的。有关更多信息,请参阅第3.1.12.1节,启用/禁用流向,第103页。有关更多信息,请参阅工具的手册页。 https://mymellanox.force.com/mellanoxcommunity/s/article/MLNX2-117-2032kn 服务端: ib_write_bw -d mlx5_1 #监听mlx5_1 网卡 ib_write_bw 182.205.31.53 --report_gbits -F #客户端 测试RDMA网卡:https://blog.csdn.net/ljlfather/article/details/102925954 ibdump github: https://github.com/Mellanox/ibdump
最新消息:Linux内核从4.9版开始就支持抓包RDMA(RoCE)流量。tcpdump发展到使用RDMA verbs接口直接 捕获流量。请确保使用最新的Linux内核service:https://hub.docker.com/r/mellanox/tcpdump-rdma (查看内核版本命令:uname -r、uname -a、lsb_release -a) 但是,在某些系统上很难升级tcpdump应用程序和关联的库以利用最新功能(特别是RDMA嗅探器)。 使用该docker容器是用户能使用tcpdump捕获和分析RDMA数据包的简单,优雅且最快的方式。 使用方法: 1、拉取容器: docker pull mellanox / tcpdump-rdma 2、启动容器 docker run -it -v /dev/infiniband:/dev/infiniband -v /tmp/traces:/tmp/traces --net=host --privileged 现在mellanox/tcpdump-rdma bash 开始使用RDMA设备mlx5_0捕获数据包。 (注意RDMA设备,而不是以太网设备) 3、保存捕获结果到文件 tcpdump -i mlx5_0 -s 0 -w /tmp/traces/capture1.pcap 这会将数据包保存在容器内外/ tmp / traces目录中的capture1.pcap文件中。
原文:https://docs.mellanox.com/display/MLNXOFEDv451010/Offloaded+Traffic+Sniffer 在ConnectX®-4和更高版本的网卡中受支持。 Offloaded 流量嗅探器 使得bypass kernel的数据传输方式 (如 RoCE, VMA, and DPDK)的流量可以被tcpdump等现有的抓包分析工具捕获
Turn on the new ethtool private flags "sniffer" (off by default). $ ethtool --set-priv-flags enp130s0f0 sniffer on (在运行tcpdump的主机上)
注意:使能Offloaded Traffic Sniffer会降低bypass kernel数据流的速度。 有关如何使用ConnectX-4网卡自带的tcpdump工具 dump RDMA流量的示例: (示例英文原文:https://community.mellanox.com/s/article/how-to-dump-rdma-traffic-using-the-inbox-tcpdump-tool--connectx-4-x) 一、前提条件 设置 注意:如果您使用的是MLNX_OFED v5.1或更高版本,请确保在您的设置中安装了libpcap库v1.9或更高版本,以便能够激活该功能。要下载libpcap,请访问https://www.tcpdump.org/。 在下面的示例中,使用了两个通过ConnectX-4适配器背对背连接的服务器。 查看tcpdump和libpcap版本 [root@rdma63 dscp]# tcpdump --help tcpdump version 4.9.2 libpcap version 1.5.3 配置 链路层:以太网 流量:RoCE 二、执行过程 1.配置两个适配器端口的IP地址,并确保在服务器之间运行ping。 2.使用ethtool启用嗅探器。 在此示例中,网卡名称为ens785f0: # ethtool --set-priv-flags ens785f0 sniffer on 注意:如果您使用的是MLNX_OFED v5.1或更高版本,则此步骤无关紧要。 3.运行tcpdump等待数据包 对于低于5.1的MLNX_OFED版本,请运行: #tcpdump -i ens785f0 -s 65535 -w rdma_traffic.pcap 对于MLNX_OFED v5.1及更高版本,运行: #tcpdump -i mlx5_1 -s 65535 -w rdma_traffic.pcap *.pcap文件用wireshark打开。 ./tcpdump (抓取网卡ib3b-0上 172.17.31.54 与 172.17.31.54 之间的udp数据包,只有SEND的时候走IP,能识别为UDP包,当使用WRITE/READ时,不走IP,走的是GID,所以tcpdump不能使用ip和udp过滤,否则就把RDMA包给过滤了) 测试完成后,在wireshark中打开文件。 请参阅tcpdump主页(https://linux.die.net/man/8/tcpdump)以查看更多示例。 Tcpdump 抓到的包的tos更像是dscp的值
测试SEND模式 在一个服务器上运行 # ib_send_bw 在另外一个服务器上运行: # ib_send_bw 192.168.5.232 --report_gbits -F 测试WRITE模式 在一个服务器上运行 # ib_write_bw 在另外一个服务器上运行: # ib_write_bw 192.168.5.232 --report_gbits -F 5.检查输出文件。 在此示例中,UDP端口4791用于RoCEv2通信。 # cat ~/rdma_traffic.txt 如果您将文件保存给Wireshark,则会收到以下消息: “请确保您使用的是最新版本的wireshark,因为旧版本可能无法很好地解析InfiniBand。” 设置tos 服务端: ib_send_bw -d mlx5_1 --rdma_cm 客户端: ib_send_bw 172.17.31.53 --tos=0x04 -R
使用bv_xxx_pingpong可以测试RDMA设备的流量发送功能:
服务器端运行: rdma_server #默认端口是7471 客户端运行: rdma_client -s 服务端IP 帮助:man rdma_server
用ibdump监听: ./ibdump -d mlx5_1 ib_send_bw要支持Qos需要加--rdma_cm 服务端: ib_send_bw -d mlx5_1 --rdma_cm 客户端: ib_send_bw 172.17.31.53 --tos=0x04 –R --tos 字节, DSCP占高6bit, 后2bit 没研究ib_send_bw怎么给赋值 所以想给DSCP赋值4,二进制为100,加2bit怎为100xx, tos=10000、10001、10010、10011,即16、17、18、19 想给DSCP赋值16,二进制为10000,加2bit怎为10000xx, tos=1000000、1000001、1000010、1000011,即64、65、66、67
交换机需要安装Packet Capture :https://www.h3c.com/cn/d_202009/1327093_30005_0.htm#_Toc49527163
过程:
# 在FortyGigE1/0/1上开启远程报文捕获功能,指定RPCAP服务端口号为2014。 语法: packet-capture remote interface interface-type interface-number [ port port ] interface-type 查询命令: display interface dis int packet-capture stop 停止服务 (2) 配置Wireshark a. 在PC上打开Wireshark软件,选择“Capture > Options”。 b. 选择“Interface > Remote”。 c. 输入Device的IP地址(该地址必须和Wireshark路由可达)和绑定的RPCAP服务端口号2014。 d. 点击 更多捕获规则见:https://www.h3c.com/cn/d_202009/1327093_30005_0.htm#_Toc49527163
在53机器上: ConnectX®-4以上的版本,libpcap库v1.9或更高版本)
[root@rdma63 tcpdump]# ifconfig 找到两张IB网卡 ib18-0: 192.169.31.53 ib3b-0: 172.17.31.53
为方便,将两个网卡都使能 $ ethtool --set-priv-flags ib18-0 sniffer on $ ethtool --set-priv-flags ib3b-0 sniffer on
我们要监听ib3b-0这个IB网卡,监听ib3b-0网卡上从 54的IB网卡(172.17.31.54)发消息到53的IB网卡(172.17.31.53)的udp 消息。 ./tcpdump udp and src host 172.17.31.54 and dst host 172.17.31.53 -i ib3b-0 –vv (RMDA write的时候用的不是IP,用的是GID,所以不能用IP过滤)
查询IB卡与网口对应关系: [root@rdma63 dscp]# ibdev2netdev mlx5_0 port 1 ==> ib18-0 (Up) mlx5_1 port 1 ==> ib3b-0 (Up) 我们服务器上tcpdump监听的是ib3b-0 ,即mlx5_1,所以 53(172.17.31.53)上运行server: ib_write_bw -d mlx5_1 54(172.17.31.54)上运行client 连接ib3b-0(172.17.31.53): ib_write_bw 172.17.31.53 用ibdump监听: ./ibdump -d mlx5_1 服务端: ib_send_bw -d mlx5_1 --rdma_cm 客户端: ib_send_bw 172.17.31.53 --tos=0x04 –R --tos 字节, DSCP占高6bit, 后2bit 没研究ib_send_bw怎么给赋值 所以想给DSCP赋值4,二进制为100,加2bit怎为100xx, tos=10000、10001、10010、10011,即16、17、18、19 想给DSCP赋值16,二进制为10000,加2bit怎为10000xx, tos=1000000、1000001、1000010、1000011,即64、65、66、67 |
服务器端运行:
rdma_server #默认端口是7471
客户端运行:
rdma_client -s 服务端IP
帮助:man rdma_server
用ibdump监听:
./ibdump -d mlx5_1
ib_send_bw要支持Qos需要加--rdma_cm
服务端:
ib_send_bw -d mlx5_1 --rdma_cm
客户端:
ib_send_bw 172.17.31.53 --tos=0x04 –R
--tos 字节, DSCP占高6bit, 后2bit 没研究ib_send_bw怎么给赋值
所以想给DSCP赋值4,二进制为100,加2bit怎为100xx,
tos=10000、10001、10010、10011,即16、17、18、19
想给DSCP赋值16,二进制为10000,加2bit怎为10000xx,
tos=1000000、1000001、1000010、1000011,即64、65、66、67
交换机需要安装Packet Capture
:https://www.h3c.com/cn/d_202009/1327093_30005_0.htm#_Toc49527163
图1-1 远程报文捕获组网图
过程:
# 在FortyGigE1/0/1上开启远程报文捕获功能,指定RPCAP服务端口号为2014。
语法:
packet-capture remote interface interface-type interface-number [ port port ]
interface-type 查询命令:
display interface
dis int
packet-capture stop 停止服务
(2) 配置Wireshark
a. 在PC上打开Wireshark软件,选择“Capture > Options”。
b. 选择“Interface > Remote”。
c. 输入Device的IP地址(该地址必须和Wireshark路由可达)和绑定的RPCAP服务端口号2014。
d. 点击
更多捕获规则见:https://www.h3c.com/cn/d_202009/1327093_30005_0.htm#_Toc49527163
在53机器上:
ConnectX®-4以上的版本,libpcap库v1.9或更高版本)
[root@rdma63 tcpdump]# ifconfig 找到两张IB网卡
ib18-0: 192.169.31.53
ib3b-0: 172.17.31.53
为方便,将两个网卡都使能
$ ethtool --set-priv-flags ib18-0 sniffer on
$ ethtool --set-priv-flags ib3b-0 sniffer on
我们要监听ib3b-0这个IB网卡,监听ib3b-0网卡上从 54的IB网卡(172.17.31.54)发消息到53的IB网卡(172.17.31.53)的udp 消息。
./tcpdump udp and src host 172.17.31.54 and dst host 172.17.31.53 -i ib3b-0 –vv
查询IB卡与网口对应关系:
[root@rdma63 dscp]# ibdev2netdev
mlx5_0 port 1 ==> ib18-0 (Up)
mlx5_1 port 1 ==> ib3b-0 (Up)
我们服务器上tcpdump监听的是ib3b-0 ,即mlx5_1,所以
53(172.17.31.53)上运行server:
ib_write_bw -d mlx5_1
54(172.17.31.54)上运行client 连接ib3b-0(172.17.31.53):
ib_write_bw 172.17.31.53
用ibdump监听:
./ibdump -d mlx5_1
服务端:
ib_send_bw -d mlx5_1 --rdma_cm
客户端:
ib_send_bw 172.17.31.53 --tos=0x04 –R
--tos 字节, DSCP占高6bit, 后2bit 没研究ib_send_bw怎么给赋值
所以想给DSCP赋值4,二进制为100,加2bit怎为100xx,
tos=10000、10001、10010、10011,即16、17、18、19
想给DSCP赋值16,二进制为10000,加2bit怎为10000xx,
tos=1000000、1000001、1000010、1000011,即64、65、66、67
过滤:----注意,RDMA write/read的时候,用的是GID而不是IP,协议也不是UDP,所以不要用IP和UDP/TCP过滤,否则抓不到包
源主机是:172.17.31.54、目标主机是:172.17.31.53 目标端口是:12345 的数据
./tcpdump src host 172.17.31.54 and dst host 172.17.31.53 and dst port 12345 -i ib3b-0 -vv
协议是UDP 源主机是:172.17.31.54、目标主机是:172.17.31.53 目标端口是:12345 的数据
./tcpdump udp and src host 172.17.31.54 and dst host 172.17.31.53 and dst port 12345 -i ib3b-0 -vv
ibv_rc_pingpong -g 0 -d mlx5_1 -i 1 -p 12345
ibv_rc_pingpong -g 0 -i 1 172.17.31.53 -p 12345
OPCODE | IBV_QPT_UD | IBV_QPT_UC | IBV_QPT_RC
----------------------------+------------+------------+-----------
IBV_WR_SEND | X | X | X
IBV_WR_SEND_WITH_IMM | X | X | X
IBV_WR_RDMA_WRITE | | X | X
IBV_WR_RDMA_WRITE_WITH_IMM | | X | X
IBV_WR_RDMA_READ | | | X
IBV_WR_ATOMIC_CMP_AND_SWP | | | X
IBV_WR_ATOMIC_FETCH_AND_ADD | | | X
ibv_post_send(3) - Linux manual page
rdma_cm
/* Connection types available. */
#define RC (0)
#define UC (1)
#define UD (2)
#define RawEth (3)
#define XRC (4)
#define DC (5)
#define SRD (6)