问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

NVMe 基础

创作时间:
作者:
@小白创作中心

NVMe 基础

引用
CSDN
1.
https://blog.csdn.net/qq_36677517/article/details/136670747

NVMe(Non-Volatile Memory Express)是一种高速、低延迟的I/O接口协议,专为闪存存储设备设计,包括固态硬盘(SSD)和其他非易失性存储设备。随着NVMe SSD在个人电脑和服务器中的普及,了解NVMe协议的工作原理变得越来越重要。本文将详细介绍NVMe的基础知识,包括其中断机制、队列管理、门铃机制以及控制器行为等核心概念。

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

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号