NVMe 基础

news2024/11/24 4:29:22

        NVMe(Non-Volatile Memory Express)是一种高速、低延迟的I/O接口协议,专为闪存存储设备设计,包括固态硬盘(SSD)和其他非易失性存储设备。NVMe协议是为取代早期的AHCI(Advanced Host Controller Interface)协议而开发的。AHCI协议在处理大量I/O时速度会变慢,NVMe采用了更高效的命令队列和并发操作,能够支持更高的I/O吞吐量和更低的延迟,从而大大提高了系统的性能。

       NVMe协议是基于设备逻辑接口的总线传输协议规范,用于访问通过PCI Express(PCIe)总线附加的非易失性存储器介质。尽管不一定必须和PCIe结合使用,但NVMe协议与PCIe的结合使用可以进一步提升存储performance。

NVME interrupt

        1.中断合并,为了减少controller向host发出中断请求的频率,从而减少host处理中断服务程序开销;

        2.中断合并两种方式:

                聚合阈值是指在每个中断向量上IO命令的completion entry的数量;

                聚合时间是指controller生成一个中断信号给host的最大延迟

        3.中断聚合依赖controller,有可能controller not support

        4.PCIE提供了三种中断方式:INTx,MSI,MSI-X

submission queue&completion queue

        1.SQ/CQ在Host 内存中;

        2.两种类型的SQ/CQ:Admin和I/O,

          一种是Admin,用来放Admin命令,用以主机管理控制SSD

          一种是IO,用来放IO命令,用以主机与SSD之间传输数据

        3.系统中只能有一对Admin SQ/CQ,但可以有很多对I/O SQ/CQ;

                IO SQ/CQ不是一生下来就有的,它们需要通过Admin命令创建

        4.I/O SQ与CQ可以是一对一的关系,也可以是一对多的关系;

        5.SQ和CQ都有一定的深度,对Admin SQ/CQ来说,其深度可以是2 ~ 4096(4K)

                 对IO SQ/CQ来说,其深度可以是2 ~ 65536(64K),队列深度是可以配置的(SQ和CQ的个数也是可以配置的)

                    NVME的性能可以通过配置队列个数和队列深度来灵活调节的

        6.每条命令大小是64字节,每条命令完成状态是16字节;

queue

        生产者往队列的尾部写入东西,消费者从队列的头部取出东西   

        1)对SQ来说,host是它的生产者(主机向SQ的尾部写入指令),SSD是它的消费者(SSD从SQ的头部取出指令执行)

        2)对CQ来说,SSD是它的生产者(SSD向CQ的尾部写入命令的执行结果),host是它的消费者(主机从CQ的头部读取命令的执行结果)

DoorBell

        1.DoorBell是SSD控制器端的寄存器,记录SQ和CQ的头部和尾部

        2.每个SQ或CQ都有两个对应的DoorBell,即Head DoorBell和Tail DoorBell

        3.DB有两个功能:

                a.记录SQ&CQ的head 、tail

        对SQ来说,SSD是消费者,它只和queue head打交道,清楚SQ head在哪里,所以SQ         head DB由SSD自己维护;但它不知道队伍有多长,后面还有多少命令等待执行,但是Host知道,所以SQ Tail DB由Host来更新。SSD结合SQ的头和尾,就知道还有多少命令在SQ中等待执行了。

        对CQ来说,SSD是生产者,它很清楚CQ tail在哪里,所以CQ Tail DB由自己更新,但是SSD不知道Host处理了多少条命令完成信息,需要Host告知,因此CQ Head DB由Host更新。SSD根据CQ的头和尾,就知道CQ能不能以及能接受多少命令完成信息。

                b.inform 的作用

        Host更新SQ Tail DB的同时,也是在告知SSD有新的命令需要处理;Host更新CQ Head DB的同时,也是在告知SSD,你返回的命令完成状态信息我已经处理

NVMe-MI

        在一个存储系统中,将设备管理与业务分离是一个良好的设计,比如在Nvme协议中就有一个Admin命令集,与IO命令分开。为了能够更规范合理得对NVMe SSD进行管理,NVMe-MI协议应运而生。

        Nvme-MI(Management Interface),定义了一套完整的NVMe SSD管理方式,独立于NVMe协议且为NVMe服务。NVMe-MI(NVMe Management Interface)Spec是NVMe Spec家族中的一员,它的诞生和发展是建立在带外管理和NVMe Base Spec基础上的

SSD controller 行为

       1. controller init flow:

                设置PCI和PCIe register
                等待CSTS.RDY变为0
                配置AQA、ASQ、ACQ register
                配置CC register
                将CC.EN 置1
                等待CSTS.RDY置1
                Host通过identity cmd,确定controller 的数据结构,确定NS的配置
                Host通过get feature cmd获取IO SQ/CQ info,然后配置中断机制
                Host分配适当的IO CQ/SQ队列
                如果Host希望获取controller的错误或者健康信息,可以添加异步事件请求命令

        2.controller shutdown&powerloss

                shutdown
                Host停止提交新的IO命令,但允许未完成的命令继续完成
                Host删除所有的IO SQ,删除所有的SQ队列后,所有未完成的命令将被撤销
                Host删除所有IO CQ
                Host将CC.SHN置为01b,表示正常关机;关机程序完成时,将CSTS.SHST置10b
                powerloss
                Host停止提交新的IO cmd
                Host将CC.SHN置10b,表示异常关机;关机程序完成时,将CSTS.SHST置10b

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

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

相关文章

bufbomb 报错 ./stdio-common/vfprintf-internal.c: No such file or directory.

注意&#xff1a;此方法针对HUST特供 bufbomb 的 level2&#xff0c;其它情况不保证有效。 有同学可能发现&#xff0c;当跳入bang函数时&#xff0c;无论是gdb还是直接执行&#xff0c;都会出现以下报错 其实若是再仔细排查一下&#xff0c;会发现实际上只有跳到 <bang0&…

呼出气一氧化碳:评估呼吸健康与戒烟状态的关键指标

一氧化碳&#xff08;CO&#xff09;是一种无色、无味、有毒的气体&#xff0c;通常由不完全燃烧产生。在生物学领域&#xff0c;CO作为一种重要的信使分子&#xff0c;在多种生物过程中发挥着作用。特别值得一提的是&#xff0c;它作为血红素加氧酶&#xff08;HO&#xff09;…

基于二级片内硬件堆栈的后向CFI 验证方法研究,第4章 硬件设计与实现(二)

4.3 批处理验证实现 批处理验证是为了进一步降低硬件资源消耗和降低系统功耗提出的二级片内硬件堆栈的另一种实现方法&#xff0c;批处理验证的硬件结构图如图4.7所示&#xff0c;也由指令检测单元、返回地址缓冲区、MAC计算单元、MAC存储单元组成。 图4.7 批处理验证硬件框图…

基于SpringBoot+Vue的咖啡商城(带文档)

项目介绍: 基于SpringBootVue的咖啡商城&#xff08;带文档&#xff09; 网上咖啡商城系统&#xff0c;咖啡商城系统 前后端分离&#xff0c;Java开发&#xff0c;Vue框架&#xff0c;Redis分布式缓存&#xff0c;MyBatis 运行环境&#xff1a;JDK1.8MySQLMavenRedisNode.js 项…

【Python-MP4文体提取】

Python-MP4文体提取 ■ pip 和 setuptools工具■ OpenCV和Tesseract■ Tesseract OCR V5.0安装教程&#xff08;Windows&#xff09;■ 1. 运行程序出现如下问题&#xff1a;我们需要安装Tesseract OCR■ 2. 下载Tesseract-OCR■ 3. 安装Tesseract-OCR■ 4. 添加到环境变量的系…

Linux磁盘扩容并设置挂载点

背景 使用pve创建了一个虚拟机&#xff0c;各种环境配置都安装好了之后发现分配的磁盘空间太小了&#xff0c;默认的就30多个G&#xff0c;这还没咋玩呢就满了&#xff0c;像扩容却找遍了这个pve都没找到扩容按钮&#xff0c;并且我这个磁盘不是lvm结构的&#xff0c;所以好像…

01攻防世界web-Training-WWW-Robots

写在前面&#xff1a; 一入网安深似海&#xff0c;学习需要毅力和强大的坚持。 1.Training-WWW-Robots 题目 解题过程 访问网址后面加上/robots.txt 进入fl0g.php文件&#xff0c;找到flag 相关知识点1.Robots&#xff1a; 理解一下robotS文件中的user-agent: 以及Disallow…

学习Rust的第三天:猜谜游戏

Welcome to the third day of learning rust, I am referring to the book “The Rust Programming Language” by Steve Klabnik. Today we build a guessing game in rust. 欢迎来到学习Rust的第三天&#xff0c;基于Steve Klabnik的《The Rust Programming Language》一书。…

数据生成 | Matlab实现基于SNN浅层神经网络的数据生成

数据生成 | Matlab实现基于SNN浅层神经网络的数据生成 目录 数据生成 | Matlab实现基于SNN浅层神经网络的数据生成生成效果基本描述模型描述程序设计参考资料 生成效果 基本描述 1.Matlab实现基于SNN浅层神经网络的数据生成&#xff0c;运行环境Matlab2021b及以上&#xff1b; …

微软卡内基梅隆大学:无外部干预,GPT4等大语言模型难以自主探索

目录 引言&#xff1a;LLMs在强化学习中的探索能力探究 研究背景&#xff1a;LLMs的在情境中学习能力及其重要性 实验设计&#xff1a;多臂老虎机环境中的LLMs探索行为 实验结果概览&#xff1a;LLMs在探索任务中的普遍失败 成功案例分析&#xff1a;Gpt-4在特定配置下的探…

TS在interface和type的区别

在TypeScript中&#xff0c;interface和type都是用来定义类型的方式 (1)语法&#xff1a; interface 关键字用于定义接口,一般定义对象类型,可以描述对象的形状&#xff0c;即一个对象应该具有哪些属性和方法。interface可以声明对象应该具有的结构和属性。 type 关键字用于…

Java 中文官方教程 2022 版(三十二)

原文&#xff1a;docs.oracle.com/javase/tutorial/reallybigindex.html 一个基本的打印程序 原文&#xff1a;docs.oracle.com/javase/tutorial/2d/printing/printable.html 本节解释了如何创建一个基本的打印程序&#xff0c;显示打印对话框&#xff0c;并将文本“Hello Worl…

导入芯片原厂SDK Mirror源码到gerrit

下载镜像代码 repo init --mirror --repo-url ssh://xx/repo.git -u ssh://xx/manifests.git -m manifest.xml repo sync 创建AOSP project 对All Project权限修改 创建repo 在刚才下载的codebase根目录执行如下命令&#xff1a; repo forall -c echo $REPO_PROJECT; ssh -p 29…

Linux使用docker安装RocketMQ并登录管理界面

Linux使用docker安装RocketMQ并登录管理界面 1、创建 /opt/rocketmq/docker-compose.yml和/opt/rocketmq/broker.conf两个配置文件 2、docker-compose.yml&#xff0c;并配置管理页面端口为8090 version: 3.5 services:rmqnamesrv:image: foxiswho/rocketmq:servercontainer_…

Ubuntu 22.04进行远程桌面连接

文心一言 Ubuntu 22.04进行远程桌面连接&#xff0c;无论是连接到Windows 10还是另一个Ubuntu 22.04&#xff0c;都可以通过不同的方式实现。以下是具体的步骤&#xff1a; 连接到Windows 10 在Windows 10上开启远程桌面功能&#xff1a;首先&#xff0c;需要在Windows 10上…

linux系统特殊符号

分号可以对命令分割&#xff0c;如下图&#xff0c;单独使用ls与pwd&#xff0c;与使用分号进行分割 井号可以将后面内容注释掉&#xff0c;以及作为root身份提示符 $可以取出变量的值&#xff0c;同时也是普通用户身份提示符 反斜杠可以将特殊字符转义为普通字符 花括号可以用…

(五)PostgreSQL的管理工具pgAdmin

PostgreSQL的管理工具pgAdmin pgAdmin 是一款流行的开源图形界面管理工具&#xff0c;用于 PostgreSQL 数据库的管理和开发。它提供了一个易于使用的界面&#xff0c;允许用户执行各种数据库任务&#xff0c;如创建和修改数据库对象&#xff08;表、视图、索引等&#xff09;、…

一文看懂标准版和Pro版的区别

在CRMEB的众多产品中&#xff0c;有这样两款产品经常被拿来比较&#xff0c;它们就是CRMEB的标准版和Pro版商城系统&#xff0c;今天&#xff0c;我们就来盘一下这两款系统之间究竟有哪些不同。 1、Pro版系统性能更卓越 CRMEB Pro版采用Tp6 SwooleRedis高性能框架开发&#…

组件与组件之间的传递-事件总线

两个组件之间的数据传递&#xff08;属于非父子组件通讯&#xff09; 当项目中只是两个组件的少量数据传递时使用事件总线这种方法会比较方便&#xff0c;但当遇到大量数据传递时推荐使用vuex 思路 组件与组件之间不能直接传递&#xff0c;这是候可以创建一个EventBus.js文件…

【火猫TV】Spirit.Collapse-不清楚队伍的问题出在哪里

1、近日Spirit战队三号位选手Collapse在精英联赛期间接受采访时表示&#xff1a;不清楚队伍目前的问题出在哪里&#xff0c;可能只是因为我们如今的状态和表现都不太好吧。转载&#xff1a;火猫TV资讯 【队伍目前的问题】 “我不是很清楚目前我们的问题出在哪里&#xff0c;可…