【网络】TCP抓包|RDMA抓包|ibdump、tcpdump用法说明

目录

一、抓包命令

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

一、抓包命令

ibdump 抓包命令

[root @ rdma64 ibdump-master]#ibdump -h
   ibdump-dump Mellanox Technologies ConnectX 网卡的 Infiniband 数据包
                可以生成文件给Wireshark进行图形流量分析

用法:
  ibdump [选项]

选项:
  -d,--ib-dev = 使用IB设备(找到默认的第一个设备)
  -i, --ib-port = <端口>使用IB设备的端口<端口>(默认1)
  -w,-write = <文件>  结果保存到文件(默认为“ sniffer.pcap”)
                         “-”代表标准输出-启用管道传输到tcpdump或tshark。
  -o,--output = <文件>是-w选项的别名。不使用-为了向后兼容
  -b,--max-burst = log2的最大突发大小
                               捕获而没有数据包丢失。
                               每个条目占用〜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抓包命令

简介: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/。

二、RDMA抓包

Mellanox 网卡

有三种方法。(抓包: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 = 使用IB设备(找到默认的第一个设备)
  -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-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文件中。

-s:截取报文的内容,默认截取96字节,-s0表示截取全部

-i:指定监听的网口

(更多参数说明见本文后面)

3.tcpdump  (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:

  1. Turn on the new ethtool private flags "sniffer" (off by default). 

    $ ethtool --set-priv-flags enp130s0f0 sniffer on

  2. 在要监听的以太网接口上设置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  RDMA网卡

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

在mellanox主机上抓包

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

实战

  1. 使能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

  1. 运行监听工具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

  1. 运行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 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抓包

    1. 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过滤,否则抓不到包

    1. 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文件中。

    1. 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等现有的抓包分析工具捕获

  1. 使能Offloaded  Traffic Sniffer:

Turn on the new ethtool private flags "sniffer" (off by default). 

$ ethtool --set-priv-flags enp130s0f0 sniffer on

(在运行tcpdump的主机上)

  1. 在要监听的以太网接口上设置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的值

    1. 验证RDMA抓包效果(Run RDMA traffic):
      1. ib_send_bw/ib_write_bw

测试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

      1.  bv_xxx_pingpong

使用bv_xxx_pingpong可以测试RDMA设备的流量发送功能:

RDMA抓包

    1. 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

    1. 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文件中。

    1. 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等现有的抓包分析工具捕获

  1. 使能Offloaded  Traffic Sniffer:

Turn on the new ethtool private flags "sniffer" (off by default). 

$ ethtool --set-priv-flags enp130s0f0 sniffer on

(在运行tcpdump的主机上)

  1. 在要监听的以太网接口上设置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

*.pcap文件用wireshark打开。

 ./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数据包,只有SEND的时候走IP,能识别为UDP包,当使用WRITE/READ时,不走IP,走的是GID,所以tcpdump不能使用ipudp过滤,否则就把RDMA包给过滤了)

测试完成后,在wireshark中打开文件。

请参阅tcpdump主页(https://linux.die.net/man/8/tcpdump)以查看更多示例。

Tcpdump 抓到的包的tos更像是dscp的值

    1. 验证RDMA抓包效果(Run RDMA traffic):
      1. ib_send_bw/ib_write_bw

测试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

      1.  bv_xxx_pingpong

使用bv_xxx_pingpong可以测试RDMA设备的流量发送功能:

# 在服务端

ibv_rc_pingpong -g 0 -d mlx5_1 -i 1

  local address:  LID 0x000c, QPN 0x000a19, PSN 0xf31d1e, GID fe80::e41d:2d03:50:e831

  remote address: LID 0x000e, QPN 0x000491, PSN 0xfefc9e, GID fe80::e41d:2d03:50:e801

8192000 bytes in 0.01 seconds = 11821.07 Mbit/sec

1000 iters in 0.01 seconds = 5.54 usec/iter

#在客户端 192.168.10.27是服务端的地址

ibv_rc_pingpong -g 0 -d mlx5_1 -i 1 192.168.10.27

  local address:  LID 0x000e, QPN 0x000491, PSN 0xfefc9e, GID fe80::e41d:2d03:50:e801

  remote address: LID 0x000c, QPN 0x000a19, PSN 0xf31d1e, GID fe80::e41d:2d03:50:e831

8192000 bytes in 0.01 seconds = 11797.66 Mbit/sec

1000 iters in 0.01 seconds = 5.55 usec/iter

说明ibv_rc_pingpong Command - Sun Datacenter InfiniBand Switch 648 Topic Set

      1. rdma_server

服务器端运行:

rdma_server    #默认端口是7471

客户端运行:

rdma_client  -s 服务端IP

帮助:man  rdma_server

      1. 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

    1. 远程捕获交换机数据包

交换机需要安装Packet Capture

:https://www.h3c.com/cn/d_202009/1327093_30005_0.htm#_Toc49527163


图1-1 远程报文捕获组网图

过程:

  1. 配置Device 交换机

# FortyGigE1/0/1上开启远程报文捕获功能,指定RPCAP服务端口号为2014

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.     输入DeviceIP地址(该地址必须和Wireshark路由可达)和绑定的RPCAP服务端口号2014

d.     点击按钮,再点击按钮启动捕获。此时在报文捕获窗口可看到捕获到的报文。

更多捕获规则见:https://www.h3c.com/cn/d_202009/1327093_30005_0.htm#_Toc49527163

    1. 抓包记录
      1. tcpdump -Offloaded Traffic Sniffer

在53机器上:

ConnectX®-4以上的版本,libpcap库v1.9或更高版本)

  1. 使能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

  1. 运行监听工具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

RMDA write的时候用的不是IP,用的是GID,所以不能用IP过滤)

  1. 运行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

      1. rdma_server

服务器端运行:

rdma_server    #默认端口是7471

客户端运行:

rdma_client  -s 服务端IP

帮助:man  rdma_server

      1. 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

    1. 远程捕获交换机数据包

交换机需要安装Packet Capture

:https://www.h3c.com/cn/d_202009/1327093_30005_0.htm#_Toc49527163

1-1 远程报文捕获组网图

过程:

  1. 配置Device 交换机

# FortyGigE1/0/1上开启远程报文捕获功能,指定RPCAP服务端口号为2014

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.     输入DeviceIP地址(该地址必须和Wireshark路由可达)和绑定的RPCAP服务端口号2014

d.     点击按钮,再点击按钮启动捕获。此时在报文捕获窗口可看到捕获到的报文。

更多捕获规则见:https://www.h3c.com/cn/d_202009/1327093_30005_0.htm#_Toc49527163

    1. 抓包记录
      1. tcpdump -Offloaded Traffic Sniffer

在53机器上:

ConnectX®-4以上的版本,libpcap库v1.9或更高版本)

  1. 使能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

  1. 运行监听工具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

  1. 运行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)

你可能感兴趣的:(存储,ceph,RDMA,linux,网络,运维)