作者简介:万群
文章转载自DPDK与SPDK开源社区
SoftRoCE基本概念
SoftRoCE是RDMA传输的一个软件实现。它是作为Github社区项目开发的,主要贡献来自于IBM、Mellanox和System Fabric Works。现在,SoftRoCE已经为Linux上游提交做好了准备。SoftRoCE利用与RoCE相同的效率特性,在任何 NIC 上都可提供完整的 RDMA 堆栈实现。
SoftRoCE的工作原理:SoftRoCE驱动程序通过Linux网络堆栈实现InfiniBand RDMA传输。 它使具有标准以太网适配器的系统能够与硬件RoCE适配器或运行SoftRoCE的其他系统进行互操作。SoftRoCE可以模拟和使用任何RoCE支持的RDMA NICs(如Mellanox mlx4硬件RoCE适配器),它有librxe用户空间库(与libmlx4用户空间库相同)和ib_rxe内核模块(与mlx4_ib内核模块相同)。
配置SoftRoCE环境
设置Fedora25(内核为4.12.8-200)和Fedora25(内核为4.13.8-100),两台服务器背靠背连接以太网网络接口卡。 拓扑结构如下图:
您可能需要安装内核空间驱动程序和用户空间驱动程序来正确设置SoftRoCE,对于内核空间驱动程序,您可以参考以下链接: https://github.com/SoftRoCE/rxe-dev
以下步骤仅您参考:(注意,您需要在NVMe-oF target和NVMe-oF启动器上安装驱动程序。)
a. git clone https://github.com/SoftRoCE/rxe-dev.git
b. cd rxe_dev
c. cp /boot/config-$(uname -r) .config
d. make menuconfig
e. 进入 “/”并搜索 “RXE”, 选择 “1” 然后将更改保存至 .config文件
f. make –j 64
g. make modules_install
h. make install
对于用户空间驱动程序,您可以参考以下链接(https://github.com/SoftRoCE/librxe-dev ),以下步骤仅您参考:
a. 首先,安装必要的用户空间库: yum install perl-Switch
b. yum install libibverbs libibverbs-devel libibverbs-utils librdmacm librdmacm-devel librdmacm-utils
c. git clone https://github.com/SoftRoCE/librxe-dev.git
d. cd librxe-dev
e. ./configure —libdir=/usr/lib64/ —prefix=
f. make
g. make install
如何配置RDMA NIC:
a. 首先,您需要确保卸载了mlx4_ib内核模块(moprobe -rv mlx4_ib)
b. modprobe nvme_rdma
c. modprobe nvme_fabrics
d. rxe_cfg start
e. rxe_cfg add
f. rxe_cfg status
g. 现在您有了一个名为“rxe0”、“rxe1”的Infiniband设备,它将作为rdma NIC运行
使用场景:NVMe-oF
注意
1、以NVMe-oF为例;
2、这里我们以fio为例,您还可以使用perf运行io,使用RDMA模式或本地映射模式。
使用fio在NVMe-oF Target上测试的运行步骤
NVMe-oF Target
启用RDMA编译SPDK:
1 2 |
./configure --with-rdma make -j 64 |
卸载mlx_ib驱动程序并加载NVMe-oF RDMA主机驱动程序:
1 2 3 |
modprobe –rv mlx4_ib modprobe nvme_rdma modprobe nvme_fabrics |
为非RDMA NIC配置SoftRoCE:
1 2 3 |
rxe_cfg start rxe_cfg add ens785f0 (here we use i40e 40G NIC) ifconfig ens785f0 192.168.2.7 |
使用以下指令运行NVMe-oF target程序:
1 2 3 |
cd spdk ./script/setup.sh ./app/nvmf_tgt/nvmf_tgt -c app/nvmf_tgt/nvmf.conf.in |
以下是nvmf.conf.in文件,可作为参考。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[Global] [Nvmf] MaxQueuesPerSession 4 AcceptorPollRate 10000 [Nvme] TransportId "trtype:PCIe traddr:0000:81:00.0" Nvme0 TransportId "trtype:PCIe traddr:0000:83:00.0" Nvme1 RetryCount 4 Timeout 0 ActionOnTimeout None AdminPollRate 100000 HotplugEnable No [Subsystem1] NQN nqn.2016-06.io.spdk:cnode1 Listen RDMA 192.168.2.3:4420 AllowAnyHost yes Host nqn.2016-06.io.spdk:init SN SPDK00000000000001 Namespace Nvme0n1 Namespace Nvme1n1 |
NVMe-oF Initiator
卸载mlx_ib驱动程序并加载NVMe-oF RDMA主机驱动程序:
1 2 3 |
modprobe –rv mlx4_ib modprobe nvme_rdma modprobe nvme_fabrics |
为非RDMA NIC配置SoftRoCE:
1 2 3 |
rxe_cfg start rxe_cfg add ens786f0 (here we use i40e 40G NIC) ifconfig ens786f0 192.168.2.3 |
连接子系统:
1 |
nvme connect -t rdma -n "nqn.2016-06.io.spdk:cnode1" -a 192.168.2.7 -s 4420 |
运行fio工作:
1 |
fio fio_softroce.job |
fio 配置文件fio_softroce.job如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[global] invalidate=1 norandommap=1 thread=1 rw=randrw runtime=10 ioengine=libaio direct=1 bs=4096 size=1G iodepth=128 group_reporting time_based=1 [job0] filename=/dev/nvme0n1 |
断开子系统:
1 |
nvme disconnect -d /dev/nvme0n1 |
使用perf在rdma模式下运行nvme-of测试的步骤
NVMe-oF Target
步骤与fio完全相同。
NVMe-oF Initiator
断开现有的NVME设备:
1 |
nvme disconnect –d /dev/nvme0n1 |
运行安装setup.sh脚本:
1 |
./script/setup.sh |
使用RDMA模式运行perf测试:
1 |
./examples/nvme/perf/perf –q 1 –w randread –s 4096 –t 10 –r ‘trtype:RDMA adrfam:IPv4 traddr:192.168.2.3 trsvcid:4420’ |
在本地使用perf运行NVMe-oF测试的步骤
NVMe-oF Target
步骤与fio完全相同。
NVMe-oF Initiator
连接子系统:
1 |
nvme connect –t rdma –n “nqn.2016-06.io.spdk:cnode1” –a 192.168.2.3 –s 4420 |
列出已连接的nvme设备:
1 |
lsblk |
使用本地设备运行perf测试:
1 |
./examples/nvme/perf/perf –q 1 –w randread –s 4096 –t 10 |
常见问题
1、最好选择4.9以上的内核版本,不需要重新编译内核,如果内核版本低于4.9,则可能需要花费大量时间重新编译内核。
2、由于篇幅限制,我们将在日后的推送中继续讨论使用不同网卡部署的情况。
参考文献