在我们日常的工作中,经常会遇见一台机器与另外一台机器网络不通的情况,我们常用的排查方式是使用ping命令。ping命令是基于使用ICMP协议(网络层)实现的,而rdma网络(roce)是基于UDP(传输层)而实现的。所以这个时候ping的方法就失效了。本文介绍一种类似于ping命令的方法来判断rdma网络是否正常,即:ibv_rc_pingpong,具体方法如下:
一、准备工作,需要先找到rdma设备名
1、根据IP地址找到网卡名,使用ifconfig即可
2、根据网卡名找到rdma设备名:ls /sys/class/net/enp133s0f1/device/infiniband/
[root@host6 ~]# ls /sys/class/net/enp133s0f1/device/infiniband/
mlx5_1
如果是mlx网卡,可以直接使用命令 ibdev2netdev进行查看
[root@host6 ~]# ibdev2netdev
mlx5_0 port 1 ==> enp133s0f0 (Up)
mlx5_1 port 1 ==> enp133s0f1 (Up)
3、找到ip地址使用的rdma设备的gid号
ibv_devinfo -d mlx5_1 -v
二、使用ibv_rc_pingpong进行网络检测
1、在服务端启动监听,指定rdma设置名与gid号
[root@host7 ~]# ibv_rc_pingpong -d mlx5_1 -g 5
local address: LID 0x0000, QPN 0x000acc, PSN 0x372b17, GID ::ffff:192.168.3.2
2、在客户端发起连接,进行测试。如下图所示正常输出,表示rdma链路正常。
[root@host6 ~]# ibv_rc_pingpong -d mlx5_1 -g 5 192.168.3.2
local address: LID 0x0000, QPN 0x000ac0, PSN 0xc89798, GID ::ffff:192.168.3.1
remote address: LID 0x0000, QPN 0x000acc, PSN 0x372b17, GID ::ffff:192.168.3.2
8192000 bytes in 0.01 seconds = 10036.14 Mbit/sec
1000 iters in 0.01 seconds = 6.53 usec/iter
此外,ibv_rc_pingpong的详细使用参数如下所示,可根据具体情况进行选择使用。
[root@host6 ~]# ibv_rc_pingpong -h
ibv_rc_pingpong: invalid option -- 'h'
Usage:
ibv_rc_pingpong start a server and wait for connection
ibv_rc_pingpong <host> connect to server at <host>
Options:
-p, --port=<port> listen on/connect to port <port> (default 18515)
-d, --ib-dev=<dev> use IB device <dev> (default first device found)
-i, --ib-port=<port> use port <port> of IB device (default 1)
-s, --size=<size> size of message to exchange (default 4096)
-m, --mtu=<size> path MTU (default 1024)
-r, --rx-depth=<dep> number of receives to post at a time (default 500)
-n, --iters=<iters> number of exchanges (default 1000)
-l, --sl=<sl> service level value
-e, --events sleep on CQ events (default poll)
-g, --gid-idx=<gid index> local port gid index
-o, --odp use on demand paging
-O, --iodp use implicit on demand paging
-P, --prefetch prefetch an ODP MR
-t, --ts get CQE with timestamp
-c, --chk validate received buffer
-j, --dm use device memory
-N, --new_send use new post send WR API