NVME CMB原理和常规使用方案详解

什么是CMB

在NVMe Express 1.2 Spec中开始支持一个特性,那就是CMB(Controller Memory Buffer),是指SSD控制器内部的读写存储缓冲区,与HMB(Host Memory Buffer)的不同处在于所使用的内存地址位于控制器自己的内存中,而不是位于主机内存中,但它们使用队列的方式都是一样的。

如何获取CMB的配置信息

在NVMe SSD Controller 中有两个寄存器CMBLOC和CMBSZ是描述CMB的基本信息。在主机中可以使用NVMe-cli工具查看寄存器信息(nvme show-regs /dev/nvme0n1 -H)。

CMBLOC(Controller Memory Buffer Location),是指存储区的位置信息,其中OFST(Offset)表示存储区的偏移地址,单位是CMBSZ.SZ,注意要是4KB对齐。BIR(Base Indicator Register)则表示PCI BAR(基地址寄存器)的序号,。

CMBSZ(Controller Memory Buffer Size),是指存储区的大小信息。其中Size是指CMB中可用空间的长度,注意单位也是CMBSZ.SZ。Size Units(SZU)表示CMB的单位是多少,从下表中我们可以看到,只要device有足够的空间,CMB的大小可以配置得非常大的。

A -该设备的制造商已经在PCIe数据库中注册了其供应商ID和设备ID。这意味着你得到了一个人类可读的描述。

B—该设备有3个PCIe BAR: BAR0为16KB,是任何合法NVMe设备都必须具有的标准NVMe BAR。

第三个BAR是控制器内存缓冲区(CMB),它既可以用于NVMe队列,也可以用于NVMe数据。

F -由于这个设备是一个NVMe设备,它被绑定到标准的Linux内核NVMe驱动程序。

CMBs的一些应用

1. 将部分(或全部)NVMe队列放置在CMB而不是主机内存中,减少延迟。

2. 使用CMB作为DMA缓冲区允许卸载NVMe拷贝。可以提高主机性能,同时减轻主机CPU负担。

3.使用CMB作为DMA缓冲允许RDMA网卡直接将NVMe- of数据放入NVMe SSD中。减少延迟和CPU负载。

CMB的软件- SPDK

  • 存储性能开发工具包(Storage Performance Development Kit, SPDK)是一个免费和开源(FOSS)的高性能存储用户空间框架。
  • 关注NVMe和NVMe- of。
  • 2018年2月新增代码,在CMBs允许的情况下启用P2P NVMe copies。
  • 一个简单的应用程序使用这个新的API的例子也在SPDK的例子(cmb_copy)。

cmb_copy是一个示例应用程序,使用SPDK的api通过P2P dma在NVMe ssd之间复制数据。这绕过了CPU的内存和PCIe子系统。

A -从SSD A拷贝9MB到SSD B。

B—PCIe交换机上行端口的数据小于1MB。

C - SPDK命令行

CMB的软件 - The Linux Kernel

  • 一个名为p2pdma的P2P框架被提议用于Linux内核。
  • 比NVMe CMBs更通用。任何PCIe设备都可以使用它(网卡、gpgpu等)。
  • PCIe驱动可以注册内存(例如cmb)或请求访问内存的DMA。
  • 初始补丁使用p2pdma优化NVMe-oF目标代码。

p2pdma框架可以用来改进NVMe-of目标。这里我们展示了一个通用NVMe-oF系统的结果。

p2pdma可以减少CPU内存负载x50, CPU PCIe负载x25。NVMe offload还可以将CPU核心负载降低50倍。

  • NVMe-oF p2pdma测试的硬件设置如下图所示。
  • 软件安装由一个修改过的Linux内核和标准的NVMe-oF配置工具(主要是nvme-cli和nvmet)组成。
  • Linux内核使用了额外的NVMe offload和Peer-2-Peer DMAs支持,使用由Eideticom NVMe设备提供的NVMe CMB。

CMB软件路标

NVMe cmb作为标准已经有一段时间了。然而,直到现在它们才开始变得可用,软件才开始使用它们。

  1. SPDK和Linux内核是CMB软件的两个主要位置今天启用。
  • SPDK: NVMe P2P拷贝。NVMe-oF更新来了。SPDK Peer-2-Peer DMAs: https://spdk.io/doc/peer_2_peer.html
  • Linux内核。P2pdma框架即将上游。将扩展到支持其他NVMe/PCIe资源(例如门铃) https://www.kernel.org/doc/html/latest/driver-api/pci/p2pdma.html

2. 持久化内存区域增加了非易失性CMBs,也将需要(大量)软件支持。它们将在PCIe总线上启用一条通往持久内存存储的路径。

参考资料

Enabling the NVMe™ CMB and PMR Ecosystem:

https://nvmexpress.org/wp-content/uploads/Session-2-Enabling-the-NVMe-CMB-and-PMR-Ecosystem-Eideticom-and-Mell....pdf​nvmexpress.org/wp-content/uploads/Session-2-Enabling-the-NVMe-CMB-and-PMR-Ecosystem-Eideticom-and-Mell....pdf

p2pdma Linux kernel patches

https://github.com/sbates130272/linux-p2pmem​github.com/sbates130272/linux-p2pmem

https://github.com/sbates130272/p2pmem-test

SPDK Peer-2-Peer DMAs:

https://spdk.io/doc/peer_2_peer.html

kernel p2pdma: https://www.kernel.org/doc/html/latest/driver-api/pci/p2pdma.html

支持NVME CMB设备

https://www.intel.com/content/www/u

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

回归预测 | Matlab实现RIME-CNN-SVM霜冰优化算法优化卷积神经网络-支持向量机的多变量回归预测

回归预测 | Matlab实现RIME-CNN-SVM霜冰优化算法优化卷积神经网络-支持向量机的多变量回归预测 目录 回归预测 | Matlab实现RIME-CNN-SVM霜冰优化算法优化卷积神经网络-支持向量机的多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.RIME-CNN-SVM霜冰优化算…

【Linux】深入理解系统文件操作(1w字超详解)

1.系统下的文件操作: ❓是不是只有C\C有文件操作呢?💡Python、Java、PHP、go也有,他们的文件操作的方法是不一样的啊 1.1对于文件操作的思考: 我们之前就说过了:文件内容属性 针对文件的操作就变成了对…

轧钢测径仪在螺纹钢负公差轧制中的四大作用!

螺纹钢为什么要进行负公差轧制? 在标准允许范围内,越接近负公差,那么在合格规范内,所损耗的原材料越少,而螺纹钢轧制速度快,更是以吨的量进行成交,因此控制的原材料积少成多,对其成本…

因存在色情内容,夸克被罚50万元

媒体经济的繁荣、自媒体、直播等各种形式的信息传播疯狂发展,但是各种形式的信息资源大规模生产时,“色情”,“暴力”的图像和视频不可控的滋生,特别是某些 APP 或浏览器。一旦打开,满屏都是“哥哥,快来啊”…

java判断上午下午的方法

一、代码 import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale;public class Main1 {public static void main(String[] args) {Date nowDate new Date();SimpleDateFormat sdf new SimpleDateFormat("aa", Locale.ENGLISH);Strin…

AI大模型在短视频处理和剪辑中的应用,文末送书

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师…

矢量图形编辑软件illustrator 2023 mac中文软件特点

illustrator 2023 mac是一款矢量图形编辑软件,用于创建和编辑排版、图标、标志、插图和其他类型的矢量图形。 illustrator 2023 mac软件特点 矢量图形:illustrator创建的图形是矢量图形,可以无限放大而不失真,这与像素图形编辑软…

【Jenkins】新建任务FAQ

问题1. 源码管理处填入Repository URL,报错:无法连接仓库:Error performing git command: ls-remote -h https://github.com/txy2023/GolangLearning.git HEAD 原因: jenkins全局工具配置里默认没有添加git的路径,如果…

全方位 Linux 性能调优经验总结

Part1Linux性能优化 1性能优化 性能指标 高并发和响应快对应着性能优化的两个核心指标:吞吐和延时 图片来自: www.ctq6.cn 应用负载角度:直接影响了产品终端的用户体验系统资源角度:资源使用率、饱和度等 性能问题的本质就是系统资源已经…

【排序算法】 归并排序详解!深入理解!思想+实现!

🎥 屿小夏 : 个人主页 🔥个人专栏 : 算法—排序篇 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言🌤️归并排序的思想☁️基本思想☁️归并的思想实现☁️分治法 &#x1f3…

java 版本企业招标投标管理系统源码+多个行业+tbms+及时准确+全程电子化

项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及审…

一文彻底理解python浅拷贝和深拷贝

目录 一、必备知识二、基本概念三、列表,元组,集合,字符串,字典浅拷贝3.1 列表3.2 元组3.3 集合3.4 字符串3.5 字典3.6 特别注意可视化展示浅拷贝总结 四、列表,元组,集合,字符串,字…

Python+Robotframework实现http接口自动化测试详解

前言 下周即将展开一个http接口测试的需求,刚刚完成的java类接口测试工作中,由于之前犯懒,没有提前搭建好自动化回归测试框架,以至于后期rd每修改一个bug,经常导致之前没有问题的case又产生了bug,所以需要…

LED数码管的静态显示与动态显示(Keil+Proteus)

前言 就是今天看了一下书上的单片机实验,发现很多的器件在Proteus中都不知道怎么去查找,然后想做一下这个实验,尝试能不能实现,LED数码管的两个还可以实现,但是用LED点阵显示器的时候他那个网络标号不知道是什么情况&…

openGauss学习笔记-111 openGauss 数据库管理-管理用户及权限-用户权限设置

文章目录 openGauss学习笔记-111 openGauss 数据库管理-管理用户及权限-用户权限设置111.1 给用户直接授予某对象的权限111.2 给用户指定角色111.3 回收用户权限 openGauss学习笔记-111 openGauss 数据库管理-管理用户及权限-用户权限设置 111.1 给用户直接授予某对象的权限 …

【uniapp】uniapp实现input输入显示数字键盘:

文章目录 一、官网文档:二、文档:三、效果:【1】number:iPhone原生数字键盘不显示小数点【2】digit:【3】digit和inputmode: 一、官网文档: input | uni-app官网 二、文档: 三、效果…

正点原子嵌入式linux驱动开发——Linux 多点电容触摸屏

随着智能手机的发展,电容触摸屏也得到了飞速的发展。相比电阻触摸屏,电容触摸屏有很多的优势,比如支持多点触控、不需要按压,只需要轻轻触摸就有反应。ALIENTEK的三款RGB LCD屏幕都支持多点电容触摸,本章就以ATK7016这…

git命令清单

一、设置和配置 1.初始化一个新的仓库&#xff1a; git init2.克隆&#xff08;Clone&#xff09;一个远程仓库到本地&#xff1a; git clone <repository_url>3.配置用户信息&#xff1a; git config --global user.name "Your Name" git config --global…

matlibplot绘图设置标签角度

如下图所示&#xff0c;当我们绘图的时候有时候会遇到标注太长显示不全&#xff0c;这时候需要修改标注的角度来实现&#xff1a; **plt.xticks(rotation70)**设置x轴旋转70度 import matplotlib.pyplot as plt import numpy as np CHN[13.6081.06**i for i in range(1,31)] U…

C语言数组首地址学习1

C语言数组名也是数组首地址&#xff1b;数组首地址&#xff0c;也就是数组首元素地址&#xff1b; 数组首地址也可以用第0个元素加&表示&#xff0c;数值a的首地址是&a[0]&#xff1b; #include <stdio.h> int main(){int nums[5];int i;//从控制台读取用户输…