Chelsio RDMA Block设备驱动测试

RDMA Block 设备驱动介绍

我们现在测试使用的 Chelsio T4 及 T5 系列万兆以太网卡支持 iWARP RDMA 功能,查阅文档之后发现此系列的万兆网卡除了支持常用的基于 IP 协议的 iSCSI 以及 NFS-RDMA 之类的功能,Chelsio 还特别提供了基于 RDMA 的 Block 设备驱动(以下简称 RBD 驱动)。

RDMA 技术本身我就不做详细介绍了,Chelsio 提供的 RBD 驱动则支持通过 iWARP 网卡的 RDMA 连接在 Linux 系统中虚拟新的块设备,其架构如下图所示,可以看到也是 target - initiator 模式:

RDMA Block 设备驱动架构

基于 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