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