45

用SoftRoCE测试SPDK NVMe-oF target

 5 years ago
source link: https://www.sdnlab.com/21248.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

作者简介:万群

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-1.jpg

您可能需要安装内核空间驱动程序和用户空间驱动程序来正确设置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:

Java
./configure --with-rdma make -j 64
1
2
./configure--with-rdma
make-j64

卸载mlx_ib驱动程序并加载NVMe-oF RDMA主机驱动程序:

Java
modprobe –rv mlx4_ib modprobe nvme_rdma modprobe nvme_fabrics
1
2
3
modproberv mlx4_ib
modprobe nvme_rdma
modprobe nvme_fabrics

为非RDMA NIC配置SoftRoCE:

Java
rxe_cfg start rxe_cfg add ens785f0 (here we use i40e 40G NIC) ifconfig ens785f0 192.168.2.7
1
2
3
rxe_cfg start
rxe_cfg add ens785f0(here we usei40e40GNIC)
ifconfig ens785f0192.168.2.7

使用以下指令运行NVMe-oF target程序:

Java
cd spdk ./script/setup.sh ./app/nvmf_tgt/nvmf_tgt -c app/nvmf_tgt/nvmf.conf.in
1
2
3
cd spdk
./script/setup.sh
./app/nvmf_tgt/nvmf_tgt  -capp/nvmf_tgt/nvmf.conf.in

以下是nvmf.conf.in文件,可作为参考。

Java
[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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[Global]
[Nvmf]
  MaxQueuesPerSession4
  AcceptorPollRate10000
[Nvme]
  TransportId"trtype:PCIe traddr:0000:81:00.0"Nvme0
  TransportId"trtype:PCIe traddr:0000:83:00.0"Nvme1
  RetryCount4
  Timeout0
  ActionOnTimeout None
  AdminPollRate100000
  HotplugEnable No
[Subsystem1]
  NQN nqn.2016-06.io.spdk:cnode1
  Listen RDMA192.168.2.3:4420
  AllowAnyHost yes
  Host nqn.2016-06.io.spdk:init
  SN SPDK00000000000001
  NamespaceNvme0n1
  NamespaceNvme1n1

NVMe-oF Initiator

卸载mlx_ib驱动程序并加载NVMe-oF RDMA主机驱动程序:

Java
modprobe –rv mlx4_ib modprobe nvme_rdma modprobe nvme_fabrics
1
2
3
modproberv mlx4_ib
modprobe nvme_rdma
modprobe nvme_fabrics

为非RDMA NIC配置SoftRoCE:

Java
rxe_cfg start rxe_cfg add ens786f0 (here we use i40e 40G NIC) ifconfig ens786f0 192.168.2.3
1
2
3
rxe_cfg start
rxe_cfg add ens786f0(here we usei40e40GNIC)
ifconfig ens786f0192.168.2.3

连接子系统:

Java
nvme connect -t rdma -n "nqn.2016-06.io.spdk:cnode1" -a 192.168.2.7 -s 4420
1
nvme connect-trdma-n"nqn.2016-06.io.spdk:cnode1"-a192.168.2.7-s4420

运行fio工作:

Java
fio fio_softroce.job
1
fio fio_softroce.job

fio 配置文件fio_softroce.job如下:

Java
[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
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

断开子系统:

Java
nvme disconnect -d /dev/nvme0n1
1
nvme disconnect-d/dev/nvme0n1

使用perf在rdma模式下运行nvme-of测试的步骤

NVMe-oF Target

步骤与fio完全相同。

NVMe-oF Initiator

断开现有的NVME设备:

Java
nvme disconnect –d /dev/nvme0n1
1
nvme disconnectd/dev/nvme0n1

运行安装setup.sh脚本:

Java
./script/setup.sh
1
./script/setup.sh

使用RDMA模式运行perf测试:

Java
./examples/nvme/perf/perf –q 1 –w randread –s 4096 –t 10 –r ‘trtype:RDMA adrfam:IPv4 traddr:192.168.2.3 trsvcid:4420’
1
./examples/nvme/perf/perfq1wrandreads4096t10rtrtype:RDMA adrfam:IPv4 traddr:192.168.2.3trsvcid:4420

在本地使用perf运行NVMe-oF测试的步骤

NVMe-oF Target

步骤与fio完全相同。

NVMe-oF Initiator

连接子系统:

Java
nvme connect –t rdma –n “nqn.2016-06.io.spdk:cnode1” –a 192.168.2.3 –s 4420
1
nvme connecttrdmannqn.2016-06.io.spdk:cnode1”–a192.168.2.3s4420

列出已连接的nvme设备:

Java
lsblk
1
lsblk

使用本地设备运行perf测试:

Java
./examples/nvme/perf/perf –q 1 –w randread –s 4096 –t 10
1
./examples/nvme/perf/perfq1wrandreads4096t10

常见问题

1、最好选择4.9以上的内核版本,不需要重新编译内核,如果内核版本低于4.9,则可能需要花费大量时间重新编译内核。

2、由于篇幅限制,我们将在日后的推送中继续讨论使用不同网卡部署的情况。

参考文献

  1. https://community.mellanox.com/docs/DOC-2184
  2. https://github.com/SoftRoCE
  3. http://www.roceinitiative.org/wp-content/uploads/2016/11/SoftRoCE_Paper_FINAL.pdf

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK