6.1 AHCI 到 NVMe
AHCI协议。NVMe协议。
HDD 和早期的 SSD 绝大多数都是使用SATA接口,跑的是AHCI,它是一种系统接口标准。
后来,AHCI 和 SATA 不能满足高性能和低时延 SSD 的需求,SSD 需要更快、更高效的协议和接口。因此 NVMe 出现了。
NVMe 出现之前,SSD 绝大多数用的是 AHCI + SATA 的组合。
1. 什么是NVMe???
答:NVMe,即Non-Volatile Memory Express,是非易失性存储器标准,是跑在PCIe接口上的协议标准。
2. NVMe 和 AHCI 相比,它的优势体现在哪里???
(1)低时延(Latency)
(2)高性能(Throughput&IOPS)
(3)低功耗
NVMe加入了自动功耗状态切换和动态能耗管理功能。第八章具体介绍。
6.2 NVMe 综述
NVMe是一种主机(Host)和 SSD 之间通信的协议,它在协议栈中隶属高层。
NVMe 作为命令层和应用层协议,理论上可以适配在任何接口协议上。但 NVMe 协议的原配是 PCIe,因此,后续章节都是基于NVMe + PCIe。
NVMe 所制定的任何命令,都交给PCIe去完成。虽然也可以交给别的接口完成,但交给PCIe的性能好。
NVMe定制了主机和 SSD 之间通信的命令以及命令是如何执行的。NVMe有两种命令:一种是Admin命令,用以主机管理和控制 SSD;一种是 I / O 命令,用以主机和 SSD之间数据的传输。
命令有了,主机是如何把这些命令发送给 SSD 执行的呢???
答:NVMe有三宝:Submission Queue(SQ)、Completion Queue(CQ)和 Doorbell Register(DB)。SQ 和 CQ 位于主机的内存中,DB 位于 SSD 的控制器内部。
图中,NVMe子系统一般就是SSD。
即,SQ 是用来放命令的,并通知SSD来取命令;CQ 是命令执行完之后存放命令的执行状态的;DB 是用来通知 SSD 来获取命令并执行的。
NVMe 是如何处理命令的???
答:一共需要八步。
第一步:主机写命令到 SQ;
第二步:主机通过写 SQ 的 Tail DB,通知 SSD 来取命令;
第三步:SSD 收到命令后,到 SQ 中取命令;
第四步:SSD 执行指令;
第五步:指令执行完成,SSD往CQ中写指令执行的结果;
第六步:SSD发中断通知主机指令完成;
第七步:收到中断,主机处理CQ,查看指令的完成状态;
第八步:主机处理完CQ中的指令执行结果,通过DB回复SSD,指令执行结果已处理。
6.3 SQ、CQ 和 DB
主机往 SQ 中写入命令,SSD 往 CQ 中写入命令完成的结果。SQ 和 CQ 的关系,可以是一对一,也可以是多对一。
SQ 和 CQ 的种类:
(1)Admin 类型。放 Admin 命令,用以主机管理控制 SSD;
(2)IO 类型。放 IO 命令,用以主机和 SSD 之间的数据传输。
IO SQ / CQ 是通过 Admin 命令创建的。
主机端每个 CPU 核(Core)可以有一个或多个 SQ,但只有一个 CQ。为什么一个CPU核中要分配多个SQ呢?原因如下:
原因一:性能需求。一个CPU核中有多线程,可以做到一个线程独享一个SQ;
原因二:QoS,Quality of Service,即服务质量。
可以有一个或多个 SQ,但只有一个 CQ。为什么一个 CPU 核中要分配多个 SQ 呢?
SQ/CQ小结:
DB 小结: