SPDK NVMe of RDMA 部署

news2025/5/11 14:38:23

使用SPDK NVMe of RDMA 实现多NVMe设备共享

一、编译、安装spdk

1.1、下载

1.1.1 下载spdk源码
首先,我们需要从GitHub上克隆SPDK的源码仓库。打开终端,输入以下命令:

git clone -b v22.01 https://github.com/spdk/spdk.git
cd spdk

1.1.2 下载子模块

接下来,我们需要初始化并更新SPDK的子模块。

git submodule update --init

1.1.3 安装依赖

为了确保编译过程顺利进行,我们需要安装SPDK所需的依赖项。运行以下命令来自动安装这些依赖:

sudo ./scripts/pkgdep.sh

1.1.4 编译

现在,我们开始编译SPDK。

./configure --with-rdma --with-shared
sudo make

1.1.5 执行单元测试

编译完成后,我们需要运行单元测试来验证SPDK是否安装成功。

./test/unit/unittest.sh

最后如果输出 all unit test passed,代SPDK安装成功

在这里插入图片描述

1.2、配置设备

1.2.1 绑定设备

在开始之前,我们需要将NVMe设备绑定到SPDK。运行以下命令来完成绑定:

sudo scripts/setup.sh

# 正确结果:
# 0000:0b:00.0 (15ad 07f0): nvme -> uio_pci_generic

# 查看状态
sudo ./scripts/setup.sh status

# 解绑设备
sudo ./scripts/setup.sh reset

在这里插入图片描述

0000:b4:00.00000:b5:00.0是设备编号,下面会用到

二、服务端配置

  1. 启动 nvmf_tgt

在服务端,我们需要启动nvmf_tgt来提供NVMe over Fabrics服务。打开一个新的终端,运行以下命令:

build/bin/nvmf_tgt

终端将输出类似以下的内容:

[zhousk@slave02 spdk]$ build/bin/nvmf_tgt -i 0
[2025-04-28 19:26:00.347292] Starting SPDK v22.01 git sha1 47737f1 / DPDK 21.11.0 initialization...
[2025-04-28 19:26:00.347451] [ DPDK EAL parameters: [2025-04-28 19:26:00.347487] nvmf [2025-04-28 19:26:00.347515] -c 0x1 [2025-04-28 19:26:00.347543] --log-level=lib.eal:6 [2025-04-28 19:26:00.347567] --log-level=lib.cryptodev:5 [2025-04-28 19:26:00.347623] --log-level=user1:6 [2025-04-28 19:26:00.347651] --base-virtaddr=0x200000000000 [2025-04-28 19:26:00.347709] --match-allocations [2025-04-28 19:26:00.347737] --file-prefix=spdk0 [2025-04-28 19:26:00.347789] --proc-type=auto [2025-04-28 19:26:00.347815] ]
EAL: No available 1048576 kB hugepages reported
EAL: No free 2048 kB hugepages reported on node 1
TELEMETRY: No legacy callbacks, legacy socket not created
[2025-04-28 19:26:00.532151] app.c: 601:spdk_app_start: *NOTICE*: Total cores available: 1
[2025-04-28 19:26:00.673833] reactor.c: 943:reactor_run: *NOTICE*: Reactor started on core 0
[2025-04-28 19:26:00.673911] accel_engine.c: 510:spdk_accel_engine_initialize: *NOTICE*: Accel engine initialized to use software engine.
  1. 在另一个终端,使用rpc.py脚本来配置NVMe over Fabrics
# 1. 启动 RDMA
scripts/rpc.py nvmf_create_transport -t RDMA -u 8192 -i 131072 -c 8192

# 2. 将 NVMe 控制器附加到 SPDK 的块设备层
# 0000:b4:00.0 是上文的 BDF
./scripts/rpc.py bdev_nvme_attach_controller -b NVMe1 -t PCIe -a 0000:b4:00.0
# output: NVMe1n1

# 3. 创建 subsystem
# cnode1、SPDK00000000000001 可以自定义
./scripts/rpc.py nvmf_create_subsystem nqn.2016-06.io.spdk:cnode1 -a -s SPDK00000000000001 -d SPDK_Controller1

# 4. 添加 namespace
./scripts/rpc.py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 NVMe1n1
# NVMe1n1 是 2 中的输出

# 5. 添加监听
# -a 是本机 ip,-s 是端口,可修改
./scripts/rpc.py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t rdma -a 192.168.200.202 -s 4420 -f ipv4

# 获取 subsystem 信息
./scripts/rpc.py nvmf_get_subsystems


# 下面是删除操作(可选)

# 删除 subsystem
./scripts/rpc.py nvmf_delete_subsystem nqn.2016-06.io.spdk:cnode1
# 删除 ns
# ns_id 通过 nvmf_get_subsystems 获取
./scripts/rpc.py nvmf_remove_ns <nsid>
# 移除监听
./scripts/rpc.py nvmf_subsystem_remove_listener nqn.2016-06.io.spdk:cnode1 -t rdma -a 192.168.200.202 -s 4420
  1. 获取 subsystem 信息
./scripts/rpc.py nvmf_get_subsystems

输出下面这些信息

[
  {
    "nqn": "nqn.2014-08.org.nvmexpress.discovery",
    "subtype": "Discovery",
    "listen_addresses": [],
    "allow_any_host": true,
    "hosts": []
  },
  {
    "nqn": "nqn.2016-06.io.spdk:cnode1",
    "subtype": "NVMe",
    "listen_addresses": [
      {
        "transport": "RDMA",
        "trtype": "RDMA",
        "adrfam": "IPv4",
        "traddr": "192.168.200.202",
        "trsvcid": "4420"
      }
    ],
    "allow_any_host": true,
    "hosts": [],
    "serial_number": "SPDK00000000000001",
    "model_number": "SPDK_Controller1",
    "max_namespaces": 32,
    "min_cntlid": 1,
    "max_cntlid": 65519,
    "namespaces": [
      {
        "nsid": 1,
        "bdev_name": "NVMe1n1",
        "name": "NVMe1n1",
        "nguid": "35354A30581000030025384700000003",
        "uuid": "35354a30-5810-0003-0025-384700000003"
      }
    ]
  }
]

此时 nvmf_tgt 显示

[2025-04-28 19:26:24.621233] rdma.c:2668:nvmf_rdma_listen: NOTICE: *** NVMe/RDMA Target Listening on 192.168.200.202 port 4420 ***

这样就完成了!!!

三、客户端配置

在客户端,我们可以使用SPDK自带的测试工具来验证NVMe over Fabrics的配置是否成功。

./build/examples/perf -r 'trtype:RDMA adrfam:IPv4 traddr:192.168.200.202 trsvcid:4420' -q 128 -o 4096 -w read -t 10

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2373195.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Redis】缓存和分布式锁

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【中间件】企业级中间件剖析 一、缓存&#xff08;Cache&#xff09; 概述 Redis最主要的应用场景便是作为缓存。缓存&#xff08;Cache&#xff09;是一种用于存储数据副本的技术或组件&#xff0c;…

OpenLayers 精确经过三个点的曲线绘制

OpenLayers 精确经过三个点的曲线绘制 根据您的需求&#xff0c;我将提供一个使用 OpenLayers 绘制精确经过三个指定点的曲线解决方案。对于三个点的情况&#xff0c;我们可以使用 二次贝塞尔曲线 或 三次样条插值&#xff0c;确保曲线精确通过所有控制点。 实现方案 下面是…

大模型微调指南之 LLaMA-Factory 篇:一键启动LLaMA系列模型高效微调

文章目录 一、简介二、如何安装2.1 安装2.2 校验 三、开始使用3.1 可视化界面3.2 使用命令行3.2.1 模型微调训练3.2.2 模型合并3.2.3 模型推理3.2.4 模型评估 四、高级功能4.1 分布训练4.2 DeepSpeed4.2.1 单机多卡4.2.2 多机多卡 五、日志分析 一、简介 LLaMA-Factory 是一个…

GLPK(GNU线性规划工具包)介绍

GLPK全称为GNU Linear Programming Kit(GNU线性规划工具包)&#xff0c;可从 https://sourceforge.net/projects/winglpk/ 下载源码及二进制库&#xff0c;最新版本为4.65。也可从 https://ftp.gnu.org/gnu/glpk/ 下载&#xff0c;仅包含源码&#xff0c;最新版本为5.0。 GLPK是…

PCB设计实践(十三)PCB设计中差分线间距与线宽设置的深度解析

一、差分信号的基本原理与物理背景 差分信号技术通过两条等幅反相的传输线实现信号传输&#xff0c;其核心优势体现在电磁场耦合的对称性上。根据麦克斯韦方程组的对称解原理&#xff0c;两条线产生的电磁场在远场区域相互抵消&#xff0c;形成以下特性&#xff1a; 1. 共模噪…

2025python学习笔记

一.Python语言基础入门 第一章 01.初识Python Python的起源&#xff1a; 1989年&#xff0c;为了打发圣诞节假期&#xff0c;Gudio van Rossum吉多范罗苏姆&#xff08;龟叔&#xff09;决心开发一个新的解释程序&#xff08;Python维形&#xff09;1991年&#xff0c;第一个…

【并发编程】基于 Redis 手写分布式锁

目录 一、基于 Redis 演示超卖现象 1.1 Redis 超卖现象 1.2 超卖现象解决方案 二、Redis 的乐观锁机制 2.1 原生客户端演示 2.2 业务代码实现 三、单机部署 Redis 实现分布式锁 3.1 分布式锁的演变和升级 3.2 setnx 实现分布式锁 3.2.1 递归调用实现分布式锁 3.2.2 循…

Jsp技术入门指南【十二】自定义标签

Jsp技术入门指南【十二】自定义标签 前言一、什么是标签二、标签的类型有哪些&#xff1f;1. 空标签2. 带有属性的标签3. 带主体的标签 三、自定义标签的部件3.1 自定义标签的四步骤3.2 标签处理程序3.3 自定义标签的开发及使用步骤第一步&#xff1a;创建标签助手类第二步&…

Java—— 泛型详解

泛型概述 泛型是JDK5中引入的特性&#xff0c;可以在编译阶段约束操作的数据类型&#xff0c;并进行检查。 泛型的格式&#xff1a;<数据类型> 注意&#xff1a;泛型只能支持引用数据类型。 泛型的好处 没有泛型的时候&#xff0c;可以往集合中添加任意类型的数据&#x…

GPT-4o, GPT 4.5, GPT 4.1, O3, O4-mini等模型的区别与联系

大模型时代浪潮汹涌,作为其中的领军者,OpenAI 其推出的系列模型以强大的能力深刻影响着整个行业,并常常成为业界其他公司对标和比较的基准。因此,深入了解 OpenAI 的大模型,不仅是为了使用它们,更是为了理解当前大模型的能力边界和发展趋势,这对于我们评估和选择其他各类…

Kubernetes生产实战(十二):无工具容器网络连接数暴增指南

当线上容器突然出现TCP连接数暴涨&#xff0c;而容器内又没有安装任何调试工具时&#xff0c;如何快速定位问题&#xff1f;本文将分享一套经过大型互联网公司验证的排查方案&#xff0c;涵盖从快速应急到根因分析的全流程。 一、快速锁定问题容器 查看pod 连接数方式&#x…

MySQL的Order by与Group by优化详解!

目录 前言核心思想&#xff1a;让索引帮你“排好序”或“分好组”Part 1: ORDER BY 优化详解1.1 什么是 Filesort&#xff1f;为什么它慢&#xff1f;1.2 如何避免 Filesort&#xff1f;—— 利用索引的有序性1.3 EXPLAIN 示例 (ORDER BY) Part 2: GROUP BY 优化详解2.1 什么是…

软件测试——用例篇(3)

目录 一、设计测试用例的具体方法 1.1等价类 1.1.1等价类概念介绍 1.1.2等价类分类 1.2边界值 1.2.1边界值分析法 1.2.2边界值分类 1.3正交法 1.3.1正交表 1.3.2正交法设计测试用例步骤 1.4判定表法 1.4.1判定表 1.4.2判定表方法设计测试用例 1.5 场景法 1.6错误…

在 Win11 下安装 Wireshark 的详细步骤

目录 一、了解 Wireshark1. 作用和功能2. 使用步骤 二、下载安装包三、运行安装包四、使用 Wireshark1. 抓包2. 窗口介绍3. 过滤器&#xff08;显示 / 捕获过滤器&#xff09;4. 保存过滤后的报文1&#xff09;显示过滤器表达式&#xff08;了解&#xff09;2&#xff09;过滤表…

AI编程: 使用Trae1小时做成的音视频工具,提取音频并识别文本

背景 在上个月&#xff0c;有网页咨询我怎么才能获取视频中的音频并识别成文本&#xff0c;我当时给他的回答是去问一下AI&#xff0c;让AI来给你答案。 他觉得我在敷衍他&#xff0c;大骂了我一顿&#xff0c;大家觉得我的回答对吗&#xff1f; 小编心里委屈&#xff0c;我…

RTC实时时钟DS1337S/PT7C4337WEX国产替代FRTC1337S

NYFEA徕飞公司的FRTC1337S串行实时时钟是一种低功耗时钟/日历&#xff0c;被设计成可以无缝替代市场上流行的DS1337S和PT7C4337WEX(SOP8)两种型号, 具有两个可编程的时钟闹钟和一个可编程方波输出。 地址和数据通过2线双向总线串行传输。时钟/日历提供秒、分钟、小时、天、日期…

Vue3.5 企业级管理系统实战(十七):角色管理

本篇主要探讨角色管理功能&#xff0c;其中菜单权限这里先不实现&#xff0c;后续在菜单管理中再进行实现。接口部分依然是使用 Apifox mock 的。 1 角色 api 在 src/api/role.ts 中添加角色相关 api&#xff0c;代码如下&#xff1a; //src/api/role.ts import service fro…

QTableWidget实现多级表头、表头冻结效果

最终效果&#xff1a; 实现思路&#xff1a;如果只用一个表格的话写起来比较麻烦&#xff0c;可以考虑使用两个QTableWidget组合&#xff0c;把复杂的表头一个用QTableWidget显示&#xff0c;其他内容用另一个QTableWidget。 #include "mainwindow.h" #include &qu…

A2A大模型协议及Java示例

A2A大模型协议概述 1. 协议作用 A2A协议旨在解决以下问题&#xff1a; 数据交换&#xff1a;不同应用程序之间的数据格式可能不一致&#xff0c;A2A协议通过定义统一的接口和数据格式解决这一问题。模型调用&#xff1a;提供标准化的接口&#xff0c;使得外部应用可以轻松调…

CMake 入门实践

CMake 入门实践 第一章 概念与基础项目1.1 CMake 基础认知1.2 最小 CMake 项目1.3 构建流程验证 第二章 多文件项目管理2.1 项目结构2.2 源码示例2.3 CMake 配置 第三章 库文件管理实战3.1 项目结构3.2 核心配置3.3 接口设计 第四章 构建类型与编译优化4.1 构建类型配置4.2 构建…