RDMA Block 设备驱动介绍
我们现在测试使用的 Chelsio T4 及 T5 系列万兆以太网卡支持 iWARP RDMA 功能,查阅文档之后发现此系列的万兆网卡除了支持常用的基于 IP 协议的 iSCSI 以及 NFS-RDMA 之类的功能,Chelsio 还特别提供了基于 RDMA 的 Block 设备驱动(以下简称 RBD 驱动)。
RDMA 技术本身我就不做详细介绍了,Chelsio 提供的 RBD 驱动则支持通过 iWARP 网卡的 RDMA 连接在 Linux 系统中虚拟新的块设备,其架构如下图所示,可以看到也是 target - initiator 模式:
基于 iWARP 的 RBD 对比 iSCSI 等技术可以显著提高性能及降低延迟,虽然 RBD 驱动目前仍然处于测试阶段,只支持 Linux 系统,而且也存在一些限制:
- 最大 RBD I/O 大小为 128 KB;
- Outstanding I/O 最大为 256;
- 目前物理和逻辑扇区都固定为 4 KB。
但看起来并不妨碍我们拿来做一些简单的测试的。
测试环境
- Chelsio T420-CR 双口 10Gbps 万兆网卡;
- 万兆网卡都使用 PCI-E 2.0 x 8 插槽;
- 服务器和客户端均采用 Linux 64 位 3.18 版本 kernel;
- 万兆网卡及 RDMA Block 设备驱动使用 ChelsioUwire-2.11.1.0 版本;
- 服务器和客户端使用直连方式连接。
测试步骤
配置万兆网卡
首先分别在服务器和客户端安装 ChelsioUwire 驱动,如果一切正常的话系统应该能自动加载 cxgb4
万兆网卡驱动及对应的 iWARP 驱动:
~ # lsmod | grep iw iw_cxgb4 145655 0 iw_cm 21013 1 rdma_cm ib_core 53913 13 xprtrdma,svcrdma,ib_ipoib,rdma_ucm,ib_ucm,ib_uverbs,ib_umad,rdma_cm,ib_cm,ib_sa,ib_mad,iw_cxgb4,iw_cm cxgb4 300161 1 iw_cxgb4
提示
为了让需要支持 RDMA 的应用程序也能正常使用 InfiniBand Verbs API 功能,建议同时安装 Chelsio 万兆网卡的
cxgb4
驱动对应的 RDMA 用户模式驱动程序libcxgb4
(libcxgb4-rdmav2.so)。
如果没有正确加载 iWARP 驱动那也可以尝试手工加载 RDMA 相关驱动:
~ # modprobe iw_cxgb4 ~ # modprobe rdma_ucm
接下来为万兆网卡配置 IP 地址,为了测试性能考虑可以将两端的万兆网卡 MTU 值修都改为 9000,假设服务器和客户端的 IP 地址分别为:
- 10.10.1.1
- 10.10.1.2
测试 RDMA 连接
这里我使用 rping
工具测试 RDMA 连接,rping
工具可以兼容所有支持 RDMA 功能的协议,例如:InfiniBand、RoCE、iWARP 等。CentOS 等系统中可以安装 librdmacm
软件包支持 rping
工具,对应的 Ubuntu 等系统中也可以使用 rdmacm-utils
软件包。
rping
命令的 -a
参数指定要监听(服务器端)或者连接(客户端)的地址,对于 Infiniband 需要启用并配置 IPoIB 网卡并使用 IPoIB 接口设备的 IP 地址,而对于 RoCE 和 iWARP 则可以直接使用网卡接口设备的 IP 地址。
我测试的 Chelsio 万兆网卡就是支持 iWARP 的,因此可以直接使用上面列出的网卡 IP 地址进行测试,分别看看服务端和客户端的使用方式和测试结果,rping
命令的 -s
参数指定当前主机做服务端:
~ # rping -s -a 10.10.1.1 -v server ping data: rdma-ping-0: ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqr server ping data: rdma-ping-1: BCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrs server ping data: rdma-ping-2: CDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst server ping data: rdma-ping-3: DEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstu server DISCONNECT EVENT... wait for RDMA_READ_ADV state 9
rping
命令的 -c
参数指定客户端,-a
参数指定服务器端地址,-C
参数和普通的 ping
命令类似:
~ # rping -c -a 10.10.1.1 -v -C 4 ping data: rdma-ping-0: ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqr ping data: rdma-ping-1: BCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrs ping data: rdma-ping-2: CDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrst ping data: rdma-ping-3: DEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstu client DISCONNECT EVENT...
看起来 RDMA 连接是正常的,下面就可以编译 RDMA Block 设备驱动测试了。
测试 RBD 驱动
Chelsio RBD 驱动也在 ChelsioUwire 软件包中,假设一切安装正常,首先我们可以在服务器端建立卷设备,然后加载 RBD target 模式驱动:
~ # modprobe rbdt
至于 initiator 客户端则加载对应 RBD 驱动,并使用 rbdctl
命令添加 RDMA Block target:
~ # modprobe rbdi ~ # rbdctl -n -a 10.10.1.1 -d /dev/lv/rdmat -p 65000
上面 rbdctl
的 -a
参数指定 RBD 服务器端 iWARP 网卡 IP 地址,-d
参数指定需要访问的卷设备,-p
参数指定端口。
添加完成之后可以分别确认 target 和 initiator 端是否正常,先看看 target 端是否有正常的连接日志:
~ # tail /var/log/messages Apr 20 17:06:42 node1 kernel: [17765.479389] rbdt: setting up rdma target on 0.0.0.0:65000 Apr 20 17:16:24 node1 kernel: [18348.143852] rbdt: connected 10.10.1.1:65000<->10.10.1.2:35010!
initiator 端应该能正确看到新的 RBD 设备了:
~ # tail /var/log/messages Jan 20 17:13:07 node2 kernel: [ 2741.710561] rbdi: connected 10.10.1.2:35010<->10.10.1.1:65000! Jan 20 17:13:07 node2 kernel: [ 2741.710658] rbdi: initialized /dev/rbdi0 (51201024 sectors; 209719394304 bytes)
这样就可以使用 /dev/rbdi0
设备进行各种读写性能相关测试了,根据 Chelsio 官方的测试数据,RBD 驱动的性能要比 Network Block Device(NBD 设备)好不少,已经比较接近 target 端本地读写的性能,而且延迟也控制的很好,我就不贴出详细数据咯。
另外运行过程中也可以查看 RBD 驱动的实时运行状态,下面是我在 RBD target 端看到的统计结果(kernel 需要开启 debugfs 支持):
~ # cat /sys/kernel/debug/rbdt/rdmat/stats reqs_started 656320 reqs_completed 656320 immd_writes 0 immd_reads 0 stall_sq_full 0 stall_ordq_full 0 max_outstanding_reqs 256 cq_waits 221261 max_rcq_polled 160 max_scq_polled 246
看的我一头雾水。
嘿嘿,还是需要对RDMA相关了解一些才行的