NVMe-oF Over RDMA(RoCE) 配置指南
1.First | 序
此篇记录 NVMe-oF Over RDMA(RoCE) 配置过程
1.1.What is NVMe-oF | 什么是 NVMe-oF
以下释义来自于
ChatGPT
NVMe-oF(Non-Volatile Memory Express over Fabrics是一种将NVMe(非易失性存储器表达)协议扩展到网络环境中的技术
NVMe 本身是一种用于固态硬盘(SSD) 的高速存储协议,能够充分发挥基于NAND闪存 的存储设备的性能
NVMe-oF 则是将 NVMe 协议通过不同的网络协议(如RDMA、Ethernet、Fibre Channel等)传输到远程存储设备,从而支持分布式存储系统
1.2.What is RDMA | 什么是 RDMA
以下释义来自于
ChatGPT
RDMA(远程直接内存访问,Remote Direct Memory Access)是一种数据传输技术
它允许计算机系统之间在网络上直接访问彼此的内存,而不需要经过操作系统的干预或复制到中间缓冲区
通过这种方式,RDMA 显著减少了数据传输的延迟和CPU负载 ,并提供了比传统网络协议(如TCP/IP)更高的带宽
1.3. What is NVMe over RDMA | 什么是 NVMe over RDMA
即 RDMA 通过 RDMA QP 实现 NVMe Admin 和 I/O 命令的传输
并定义了一组命令用于支持命令包、回复包以及数据包的收发
即
- RDMA_SEND
- RAMD_SEND_INVALIDATE
- RDMA_READ
- RDMA_WRITE
1.4. Tips | 贴士
NVMe-oF 的实现需要两台物理机
在 NVMe-oF 的定义上分别是
host- 即连接到
target的计算机
- 即连接到
target- 共享其
NVMe块设备的计算机
- 共享其
也可简单将
target理解为Server|Host则为Client
1.5. Preconditions | 前提条件
-
RDMA已生效Ex PIC | 示例图片

-
以下内核模块正常启用
nvmetnvmet_rdmanvme_fabrics
若尚未正常启用请使用
modprobe命令启用所需模块
持久化启用内核模块请编辑/etc/modules-load.d/*.conf文件Ex PIC | 示例图片

- 以下软件包已安装
nvmetclinvme-cli
1.6.OS Version | 示例环境
1.6.1.OS | 系统

1.6.2.SW | 软件
-
nvme-cli
-
nvmetcli
1.6.3.NIC | 网络适配器
HPE Eth 4x25Gb 1p 620QSFP28 Adptrlink qedr0/1 state ACTIVE physical_state LINK_UP netdev enp1s0f010.7.5.200/24


1.6.4.NVMe-oF host
Huawei SP333 STL2IEA2A 2-Port NIClink mlx5_0/1 state ACTIVE physical_state LINK_UP netdev p3p110.7.5.100
2.Setting | 设置
目录 Tips | 贴士 提到过需要分别配置 host & target
我们按照以下顺序配置 NVMe-oF
- 配置
NVMe-oF target - 配置
NVMe-oF host
2.1.Setting NVMe-oF target | 配置 NVMe-oF target
需先安装
nvmetcli命令
2.1.1.nvmetcli shell
键入 nvmetcli 命令进入 shell
先来看下结构
➜ nvmetcli
/> ls
o- / ................................................................................. [...]
o- hosts ........................................................................... [...]
o- ports ........................................................................... [...]
o- subsystems ...................................................................... [...]
/>
Ex PIC | 示例图片

2.1.2.创建新端口
/> cd ports
/ports> create 1
/ports> ls 1/
o- 1 ..................................... [trtype=, traddr=, trsvcid=, inline_data_size=-1]
o- ana_groups ...................................................................... [...]
| o- 1 ................................................................. [state=optimized]
o- referrals ....................................................................... [...]
o- subsystems ...................................................................... [...]
/ports>
Ex PIC | 示例图片

2.1.3.创建 NVMe 子系统
/ports> cd /subsystems
/subsystems> create NVMf_RDMA
/subsystems> cd NVMf_RDMA/
/subsystems/NVMf_RDMA> ls
o- NVMf_RDMA ....................... [version=2.1, allow_any=0, serial=67ab14c77069b2dcf9c1]
o- allowed_hosts ................................................................... [...]
o- namespaces ...................................................................... [...]
/subsystems/NVMf_RDMA>
Ex PIC | 示例图片

2.1.4.创建新的名称空间,并在其中设置 NVMe 设备
/subsystems/NVMf_RDMA> cd namespaces
/subsystems/N...MA/namespaces> create 1
/subsystems/N...MA/namespaces> cd 1
/subsystems/N.../namespaces/1> set device path=/dev/nvme0n1
Parameter path is now '/dev/nvme0n1'.
/subsystems/N.../namespaces/1>
Ex PIC | 示例图片

2.1.5.启用先前创建的 namespaces
/subsystems/N.../namespaces/1> enable
The Namespace has been enabled.
/subsystems/N.../namespaces/1> ls
o- 1 ...... [path=/dev/nvme0n1, uuid=95d9b6d9-3441-4cec-b906-2b430c7b9e7b, grpid=1, enabled]
/subsystems/N.../namespaces/1>
Ex PIC | 示例图片

2.1.6.允许所有主机使用该子系统
/subsystems/NVMf_RDMA> ls
o- NVMf_RDMA ....................... [version=2.1, allow_any=0, serial=67ab14c77069b2dcf9c1]
o- allowed_hosts ................................................................... [...]
o- namespaces ...................................................................... [...]
o- 1 .. [path=/dev/nvme0n1, uuid=95d9b6d9-3441-4cec-b906-2b430c7b9e7b, grpid=1, enabled]
/subsystems/NVMf_RDMA> set attr allow_any_host=1
Parameter allow_any_host is now '1'.
Ex PIC | 示例图片

2.1.7.使目标可通过 RDMA 使用
-
先来看一下目前的配置参数
/> ls o- / ......................................................................................................................... [...] o- hosts ................................................................................................................... [...] o- ports ................................................................................................................... [...] | o- 1 ......................................................................... [trtype=, traddr=, trsvcid=, inline_data_size=-1] | o- ana_groups .......................................................................................................... [...] | | o- 1 ..................................................................................................... [state=optimized] | o- referrals ........................................................................................................... [...] | o- subsystems .......................................................................................................... [...] o- subsystems .............................................................................................................. [...] o- NVMf_RDMA ........................................................... [version=2.1, allow_any=1, serial=67ab14c77069b2dcf9c1] o- allowed_hosts ....................................................................................................... [...] o- namespaces .......................................................................................................... [...] o- 1 ...................................... [path=/dev/nvme0n1, uuid=95d9b6d9-3441-4cec-b906-2b430c7b9e7b, grpid=1, enabled] />
Ex PIC | 示例图片

-
使目标可通过 RDMA 使用
/> cd /ports/1/ /ports/1> set addr adrfam=ipv4 trtype=rdma traddr=10.7.5.200 trsvcid=4420 Parameter adrfam is now 'ipv4'. Parameter trtype is now 'rdma'. Parameter traddr is now '10.7.5.200'. Parameter trsvcid is now '4420'. /ports/1>
Ex PIC | 示例图片

2.1.8.将子系统链接到该端口
/ports/1> cd subsystems
/ports/1/subsystems> create NVMf_RDMA
/ports/1/subsystems>
Ex PIC | 示例图片

2.1.9.Verify | 验证
Ex PIC | 示例图片

dmesg info
[ 1205.732400] [ T2708] nvmet: adding nsid 1 to subsystem NVMf_RDMA
[ 2023.869822] [ T2708] nvmet_rdma: enabling port 1 (10.7.5.200:4420)
2.2.Setting NVMe-oF host | 配置 NVMe-oF host
接下来我们配置 NVMe-oF host
步骤如下
- Installing command line client
- Discovering NVMe-oF targets
- Connecting to NVMe-oF targets
- Verify | 验证
2.2.1.Installing command line client
首先安装 nvme-cli
zypper install nvme-cli
2.2.2.Discovering NVMe-oF targets
使用 nvme discover 命令发现 NVMe-oF targets 上可用的 NVMe subsystems
命令格式为
sudo nvme connect -t transport -a DISCOVERY_CONTROLLER_ADDRESS -s SERVICE_ID -n SUBSYSTEM_NQN
Example:
nvme discover -t rdma -a 10.7.5.200 -s 4420

2.2.3.Connecting to NVMe-oF targets
连接至发现的 NVMe subsystems
命令格式为
sudo nvme connect -t transport -a DISCOVERY_CONTROLLER_ADDRESS -s SERVICE_ID -n SUBSYSTEM_NQN
Example:
nvme connect -t rdma -a 10.7.5.200 -s 4420 -n NVMf_RDMA
2.2.4.Verify | 验证
分别使用如下命令验证 NVMe-oF targets 是否正确连接
- nvme list
- lsblk | grep "nvme0n1"
Example:
➜ ~ nvme list
Node Generic SN Model Namespace Usage Format FW Rev
--------------------- --------------------- -------------------- ---------------------------------------- ---------- -------------------------- ---------------- --------
/dev/nvme0n1 /dev/ng0n1 67ab14c77069b2dcf9c1 Linux 0x1 128.04 GB / 128.04 GB 512 B + 0 B 6.13.1-1
➜ ~ lsblk | grep "nvme0n1"
nvme0n1 259:1 0 119.2G 0 disk
➜ ~
3.Test | 测试
确定正确连接后使用如下工具检测性能
fioioping
nvme0n1挂载点如下
nvme0n1 259:1 0 119.2G 0 disk /mnt/nvme0n1
3.1.fio
对照
NVMe-oF target & NVMe-oF host
-
NVMe-oF hostfio Disk Speed Tests (Mixed R/W 50/50) (Partition /dev/nvme0n1): --------------------------------- Block Size | 4k (IOPS) | 64k (IOPS) ------ | --- ---- | ---- ---- Read | 133.29 MB/s (33.3k) | 127.48 MB/s (1.9k) Write | 133.64 MB/s (33.4k) | 128.15 MB/s (2.0k) Total | 266.93 MB/s (66.7k) | 255.64 MB/s (3.9k) | | Block Size | 512k (IOPS) | 1m (IOPS) ------ | --- ---- | ---- ---- Read | 118.31 MB/s (231) | 101.55 MB/s (99) Write | 124.59 MB/s (243) | 108.31 MB/s (105) Total | 242.90 MB/s (474) | 209.87 MB/s (204) YABS completed in 1 min 44 sec -
NVMe-oF targetfio Disk Speed Tests (Mixed R/W 50/50) (Partition /dev/nvme0n1): --------------------------------- Block Size | 4k (IOPS) | 64k (IOPS) ------ | --- ---- | ---- ---- Read | 133.33 MB/s (33.3k) | 127.89 MB/s (1.9k) Write | 133.68 MB/s (33.4k) | 128.56 MB/s (2.0k) Total | 267.01 MB/s (66.7k) | 256.45 MB/s (4.0k) | | Block Size | 512k (IOPS) | 1m (IOPS) ------ | --- ---- | ---- ---- Read | 120.19 MB/s (234) | 98.53 MB/s (96) Write | 126.57 MB/s (247) | 105.09 MB/s (102) Total | 246.76 MB/s (481) | 203.62 MB/s (198)
可以发现性能基本持平甚至更优秀
3.2.ioping
对照
NVMe-oF target & NVMe-oF host
-
NVMe-oF host
-
NVMe-oF target
Thanks & Copy



