【网络】TCP抓包|RDMA抓包|ibdump、tcpdump用法说明
目录
2.tcpdump (docker,Linux内核从4.9以上)
3.Offloaded Traffic Sniffer(tcpdump,ConnectX®-4以上的版本,libpcap库v1.9或更高版本)
tcpdump (docker,Linux内核从4.9以上)
Offloaded Traffic Sniffer(tcpdump,ConnectX®-4以上的版本,libpcap库v1.9或更高版本)
作者:bandaoyu,原始连接:https://blog.csdn.net/bandaoyu/article/details/115791233
一、抓包命令
ibdump 抓包命令
[root @ rdma64 ibdump-master]#ibdump -h
ibdump-dump Mellanox Technologies ConnectX 网卡的 Infiniband 数据包
可以生成文件给Wireshark进行图形流量分析
用法:
ibdump [选项]
选项:
-d,--ib-dev = <dev>使用IB设备<dev>(找到默认的第一个设备)
-i, --ib-port = <端口>使用IB设备的端口<端口>(默认1)
-w,-write = <文件> 结果保存到文件(默认为“ sniffer.pcap”)
“-”代表标准输出-启用管道传输到tcpdump或tshark。
-o,--output = <文件>是-w选项的别名。不使用-为了向后兼容
-b,--max-burst = <log2突发> log2的最大突发大小
捕获而没有数据包丢失。
每个条目占用〜MTU字节的内存(默认12-4096个条目)
-s,-silent不打印进度指示。
-T,--conti使用连续页面。
-M,--mem-mode <大小>(指定时),仅在抓包动作停止后才将包写入文件,它比默认模式快(丢包更少)
,但占用更多内存。在这种模式下,ibdump在捕获<size>个字节后停止
-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抓包命令
简介: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工具进行分析
二、RDMA抓包
有三种方法。(抓包:sniffer packet、Packet capture)
1.ibdump
嗅探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 = <dev>使用IB设备<dev>(找到默认的第一个设备)
-i, --ib-port = <端口>使用IB设备的端口<端口>(默认1)
-w,-write = <文件> 结果保存到文件(默认为“ sniffer.pcap”)
“-”代表标准输出-启用管道传输到tcpdump或tshark。
(更多参数说明见本文后面)
测试RDMA网卡:https://blog.csdn.net/ljlfather/article/details/102925954
2.tcpdump (docker,Linux内核从4.9以上)
最新消息: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:指定监听的网口
(更多参数说明见本文后面)
3.Offloaded Traffic Sniffer(tcpdump,ConnectX®-4以上的版本,libpcap库v1.9或更高版本)
原文: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).
$ ethtool --set-priv-flags enp130s0f0 sniffer on
-
在要监听的以太网接口上设置
sniffer
标志后,运行tcpdump捕获该接口上的bypass kernel 流量。
注意:使能Offloaded Traffic Sniffer会降低bypass kernel数据流的速度。
有关如何使用ConnectX-4网卡自带的tcpdump工具 dump RDMA流量的示例:
一、前提条件
设置
注意:如果您使用的是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。”
IROCE 工具
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
实战
- 使能Offloaded Traffic Sniffer:
[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
- 运行监听工具tcpdump
我们要监听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
- 运行server和client
查询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通信测试工具|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抓包
-
- ibdump
嗅探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过滤,否则抓不到包
-
- tcpdump (docker,Linux内核从4.9以上)
最新消息: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文件中。
-
- tcpdump (Offloaded Traffic Sniffer,ConnectX®-4以上的版本,libpcap库v1.9或更高版本)
原文: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).
$ ethtool --set-priv-flags enp130s0f0 sniffer on
(在运行tcpdump的主机上)
- 在要监听的以太网接口上设置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
./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的值
-
- 验证RDMA抓包效果(Run RDMA traffic):
- ib_send_bw/ib_write_bw
- 验证RDMA抓包效果(Run RDMA traffic):
测试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
-
使用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。 <Device> packet-capture remote interface fortygige 1/0/1 port 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. 点击<OK>按钮,再点击<Start>按钮启动捕获。此时在报文捕获窗口可看到捕获到的报文。 更多捕获规则见: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
-
服务器端运行:
rdma_server #默认端口是7471
客户端运行:
rdma_client -s 服务端IP
帮助:man rdma_server
-
-
- ib_send_bw/ib_write_bw 发送Qos的数据包
-
用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 远程报文捕获组网图
过程:
- 配置Device 交换机
# 在FortyGigE1/0/1上开启远程报文捕获功能,指定RPCAP服务端口号为2014。
<Device> packet-capture remote interface fortygige 1/0/1 port 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. 点击<OK>按钮,再点击<Start>按钮启动捕获。此时在报文捕获窗口可看到捕获到的报文。
更多捕获规则见:https://www.h3c.com/cn/d_202009/1327093_30005_0.htm#_Toc49527163
-
- 抓包记录
- tcpdump -Offloaded Traffic Sniffer
- 抓包记录
在53机器上:
ConnectX®-4以上的版本,libpcap库v1.9或更高版本)
- 使能Offloaded Traffic Sniffer:
[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
- 运行监听工具tcpdump
我们要监听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
- 运行server和client
查询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)