Photo by Marc PEZIN / Unsplash

NVMe-oF Over RDMA(RoCE) 配置指南

指南 | Guides 2025年2月27日

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 | 示例图片


  • 以下内核模块正常启用

    • nvmet
    • nvmet_rdma
    • nvme_fabrics

    若尚未正常启用请使用 modprobe 命令启用所需模块
    持久化启用内核模块请编辑/etc/modules-load.d/*.conf文件

    Ex PIC | 示例图片


  • 以下软件包已安装
    • nvmetcli
    • nvme-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 Adptr
    • link qedr0/1 state ACTIVE physical_state LINK_UP netdev enp1s0f0
    • 10.7.5.200/24
HPE Eth 4x25Gb 1p 620QSFP28 Adptr | 上机和初始化记录
1x1.First | 序 HPE Eth 4x25Gb 1p 620QSFP28 Adptr == QL45214HLCU-HP HPE 对其的概述为 * 620-QSFP28 1-port Ethernet adapter - 4 lanes 25GB, quad small form factor (QSFP) * Part Number * 840134-001 是一款采用 Qlogic 45604 芯片拥有单 QSFP28 端口和四个 25GB 通道的 NIC 即支持使用 1p QSFP28 100G 拆分出 4p SFP 25G 2x1.Features | 特征 以下内容摘取自 QuickSpecs
HPE Eth 4x25Gb 1p 620QSFP28 Adptr | RDMA(RoCE V2) 配置与测试
1x1.First | 序 书接上回 HPE Eth 4x25Gb 1p 620QSFP28 Adptr | 上机和初始化记录1x1.First | 序 HPE Eth 4x25Gb 1p 620QSFP28 Adptr == QL45214HLCU-HP HPE 对其的概述为 * 620-QSFP28 1-port Ethernet adapter - 4 lanes 25GB, quad small form factor (QSFP) * Part Number * 840134-001 是一款采用 Qlogic 45604 芯片拥有单 QSFP28 端口和四个 25GB 通道的 NIC 即支持使用 1p QSFP28

1.6.4.NVMe-oF host

  • Huawei SP333 STL2IEA2A 2-Port NIC
    • link mlx5_0/1 state ACTIVE physical_state LINK_UP netdev p3p1
    • 10.7.5.100

2.Setting | 设置

目录 Tips | 贴士 提到过需要分别配置 host & target

我们按照以下顺序配置 NVMe-oF

  1. 配置 NVMe-oF target
  2. 配置 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 使用

  1. 先来看一下目前的配置参数

        /> 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 | 示例图片

  1. 使目标可通过 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

步骤如下

  1. Installing command line client
  2. Discovering NVMe-oF targets
  3. Connecting to NVMe-oF targets
  4. 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 | 测试

确定正确连接后使用如下工具检测性能

  • fio
  • ioping

nvme0n1 挂载点如下

nvme0n1 259:1    0 119.2G  0 disk /mnt/nvme0n1

3.1.fio

对照 NVMe-oF target & NVMe-oF host

  • NVMe-oF host

    fio 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 target

    fio 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


储存管理指南
在 SLES 上管理存储设备
Storage Administration Guide
Administer storage devices on SLES

标签

xzllll

三分钟热度三分钟收获