RoCE(RDMA over Converged Ethernet) 是一种网络协议,可实现通过以太网的远程直接访问(RDMA)
介绍
RoCE v1 协议 是一个以太网链路层协议,带有 ethertype 0x8915,它允许同一以太网广播域中的任何两个主机间的通信
RoCE v2 协议 在 IPv4 或 IPv6 协议的 UDP 上存在
- 对于 RoCE v2,通过
UDP 报文头的 Destination Port Number(目的端口号)判断该协议,RoCE v2 固定是 4791
- RoCE v2 的基本特性
- IPv4 和 IPv6 支持
- 多队列支持
- 硬件无关性
- 网络层优化
- 硬件加速
- 优缺点
- RoCE 相比于 Infiniband,主要还是省钱
- RoCE 性能上相比 Infiniband 有损失
- iWARP 相比于 RoCE 协议栈更复杂,使用较少
RoCE v2 交换机配置要求
- 选择 RoCE v2 兼容的交换机:确保网络交换机支持 RoCE v2
- 启用
PFC(Priority Flow Control): RoCE v2 依赖于 PFC 以确保流的有序传输
- RoCE 的拥塞管理依赖需要配置
DCB(Data Center Bridging,数据中心桥接),实现将传统的以太网变成无损以太网的技术:阿里云自研 HPCC 流控算法
- 配置 DCB 以确保 RoCE v2 流量得到适当的带宽和优先级
- 确保为 RoCE v2 流配置足够的带宽,以满足性能需求
- 启用
ECN(Explicit Congestion Notification):在网络拥塞时进行流量控制
查看 RoCE 支持的版本
show_gids 显示 GID,RoCEv2 对应的 INDEX 编号为 3
$ show_gids
DEV PORT INDEX GID IPv4 VER DEV
--- ---- ----- --- ------------ --- ---
...
mlx5_2 1 0 fe80:0000:0000:0000:2817:20ff:fe98:c781 v1 ens10f1v0
mlx5_2 1 1 fe80:0000:0000:0000:2817:20ff:fe98:c781 v2 ens10f1v0
mlx5_2 1 2 0000:0000:0000:0000:0000:ffff:c0a8:0204 192.168.2.4 v1 ens10f1v0
mlx5_2 1 3 0000:0000:0000:0000:0000:ffff:c0a8:0204 192.168.2.4 v2 ens10f1v0
...
切换协议
apt install mlnx-tools
$ cma_roce_mode -d mlx5_0
RoCE v2
# -m 1 表示 RoCE v1;-m 2 表示 RoCE v2
$ cma_roce_mode -d mlx5_0 -m 1
IB/RoCE v1
Soft-RoCE
Soft-RoCE(RDMA over Ethernet, RXE) 由 IBM 和 Mellanox 牵头的 IBTA RoCE 工作组实现
- 目的:降低 RoCE 部署成本、便于开发和测试 RDMA 程序(基于 Verbs API 编写的程序)
- Soft-RoCE 将卸载到硬件的封包和解析在软件层实现
- RDMA 技术通过
硬件卸载 把本来软件(CPU)做的事情放到硬件中实现,来达到加速的目的
- 配置 Soft-RoCE
是否支持 RXE
使用如下命令,确认当前内核是否支持 RXE
cat /boot/config-$(uname -r) | grep RXE
若果 CONFIG_RDMA_RXE 的值为 y 或者 m,表示当前操作系统支持使用 RXE,否则就需要重新编译内核。
安装 RXE 工具
sudo apt-get install libibverbs1 ibverbs-utils librdmacm1 libibumad3 ibverbs-providers rdma-core infiniband-diags
说明:
libibverbs1 ibverbs 动态链接库
ibverbs-utils ibverbs 示例程序
librdmacm1 rdmacm 动态链接库
libibumad3 ibumad 动态链接库
ibverbs-providers ibverbs 各厂商用户态驱动(包括 RXE)
rdma-core 文档及用户态配置文件
infiniband-diags ib 相关命令工具
- PS:
dpkg -L libibverbs1 可以查看包的具体文件
使用 ibv_devices 命令查看是否安装成功:
$ ibv_devices
device node GUID
------ ----------------
配置 RXE 网卡
- 加载驱动
rdma_rxe(可以加入到开机启动中)
$ modprobe rdma_rxe
$ lsmod | grep rdma_rxe
rdma_rxe 192512 0
ib_uverbs 188416 1 rdma_rxe
ip6_udp_tunnel 16384 1 rdma_rxe
udp_tunnel 32768 1 rdma_rxe
ib_core 524288 2 rdma_rxe,ib_uverbs
- 用户态网卡配置
- rxe_0 是新配置的 RDMA 的设备名,可任意取名
- ens33 为 Soft-RoCE 设备所绑定的网络设备名,需要是实际存在的网卡名
rdma link add rxe_0 type rxe netdev ens33
$ rdma link
link rxe_0/1 state ACTIVE physical_state LINK_UP netdev ens33
$ ibv_devices
device node GUID
------ ----------------
rxe_0 025056fffe3f1136
$ ibv_devinfo -d rxe_0
hca_id: rxe_0
transport: InfiniBand (0)
fw_ver: 0.0.0
node_guid: 0250:56ff:fe3f:1136
sys_image_guid: 0250:56ff:fe3f:1136
vendor_id: 0xffffff
vendor_part_id: 0
hw_ver: 0x0
phys_port_cnt: 1
port: 1
state: PORT_ACTIVE (4)
max_mtu: 4096 (5)
active_mtu: 1024 (3)
sm_lid: 0
port_lid: 0
port_lmc: 0x00
link_layer: Ethernet
$ ibstat
CA 'rxe_0'
CA type:
Number of ports: 1
Firmware version:
Hardware version:
Node GUID: 0x025056fffe3f1136
System image GUID: 0x025056fffe3f1136
Port 1:
State: Active
Physical state: LinkUp
Rate: 2.5
Base lid: 0
LMC: 0
SM lid: 0
Capability mask: 0x00010000
Port GUID: 0x025056fffe3f1136
Link layer: Ethernet
iproute2 检查工具:rdma
$ dpkg -S `which rdma`
iproute2: /usr/bin/rdma
$ rdma -p stat
link rxe_0/1
sent_pkts 0
rcvd_pkts 0
duplicate_request 0
out_of_seq_request 0
rcvd_rnr_err 0
send_rnr_err 0
rcvd_seq_err 0
ack_deferred 0
retry_exceeded_err 0
retry_rnr_exceeded_err 0
completer_retry_err 0
send_err 0
link_downed 0
rdma_sends 0
rdma_recvs 0
$ rdma res
0: rxe_0: pd 1 cq 1 qp 1 cm_id 0 mr 0 ctx 0 srq 0
RoCE 抓包
使用 docker 镜像 mellanox/tcpdump-rdma
docker run -it -v /dev/infiniband:/dev/infiniband -v /tmp/traces:/tmp/traces --net=host --privileged mellanox/tcpdump-rdma:latest bash
tcpdump -i mlx5_0 -s 0 -w /tmp/traces/capture1.pcap