存储笔记--NVMe原理篇

参考:http://home.eeworld.com.cn/home.php?mod=space&uid=346593&do=blog&id=272657

目录

      • 目录
  • NVMe 是什么
    • nvme 处于什么位置
    • 为什么需要nvme
    • 命令如何执行
      • 支持的admin command
      • 支持的io command
      • 下发命令流程
      • 流程步骤图
      • 详解
      • 总结


NVMe 是什么?

NVMe(Non-VolatileMemory express),是一种建立在M.2接口上的类似AHCI的一种协议,是专门为闪存类存储设计的协议。中文名 NVMe协议 外文名 Non-Volatile Memory express。NVMe具体优势包括

nvme 处于什么位置?

NVMe是一种Host与SSD之间通讯的协议,它在协议栈中隶属高层
这里写图片描述

为什么需要nvme?

  • NVMe是为SSD所生的。NVMe出现之前,SSD绝大多数走的是AHCI和SATA的协议,后者其实是为传统HDD服务的。与HDD相比,SSD具有更低的延时和更高的性能,AHCI已经不能跟上SSD性能发展的步伐了,已经成为制约SSD性能的瓶颈. SATA现在最高带宽就是600MB/s
  • 可降低延迟超过50%;
  • NVMe PCIe SSD可提供的IOPs十倍于高端企业级SATA SSD;
  • 自动功耗状态切换和动态能耗管理功能大大降低功耗;-

命令如何执行?

NVMe有两种命令,一种叫Admin Command,用以Host管理和控制SSD;另外一种就是I/O Command,用以Host和SSD之间数据的传输

支持的admin command

存储笔记--NVMe原理篇_第1张图片

支持的io command

存储笔记--NVMe原理篇_第2张图片

下发命令流程

NVMe内部:Submission Queue (SQ),Completion Queue(CQ)和Doorbell Register (DB)。
SQ和CQ位于Host的内存中,DB则位于SSD的控制器内部。
存储笔记--NVMe原理篇_第3张图片
SSD作为一个PCIe Endpoint通过PCIe连着Root Complex (RC), 然后RC连接着CPU和内存。
RC就是CPU的代言人
SQ位于Host内存中,Host要发送命令时,先把准备好的命令放在SQ中,然后通知SSD来取;CQ也是位于Host内存中,一个命令执行完成,成功或失败,SSD总会往CQ中写入命令完成状态。
Host发送命令时,不是直接往SSD中发送命令的,而是把命令准备好放在自己的内存中,那怎么通知SSD来获取命令执行呢?Host就是通过写SSD端的DB寄存器来告知SSD的:

流程步骤图

存储笔记--NVMe原理篇_第4张图片
存储笔记--NVMe原理篇_第5张图片

  • 有两种SQ和CQ,一种是Admin,另外一种是I/O,前者放Admin命令,用以Host管理控制SSD,后者放置I/O命令,用以Host与SSD之间传输数据。
  • 但系统中只有一对Admin SQ/CQ,它们是一一对应的关系;I/O SQ/CQ却可以很多,多达65535(64K减去一个SQ/CQ)
  • Host端每个Core可以有一个或者多个SQ,但只有一个CQ。给每个Core分配一对SQ/CQ好理解,为什么一个Core中还要多个SQ呢?一是性能需求,一个Core中有多线程,可以做到一个线程独享一个SQ;二是QoS需求,什么是QoS?Quality of Service,服务质量。实际系统中用多少个SQ,取决于系统配置和性能需求,可灵活设置I/O SQ个数
  • nvme 白皮书配置

存储笔记--NVMe原理篇_第6张图片

  • 作为队列,每个SQ和CQ都有一定的深度:对Admin SQ/CQ来说,其深度可以是2-4096(4K);对I/O SQ/CQ,深度可以是2-65536(64K)。队列深度也是可以配置的。AHCI只有一个命令队列,且队列深度是固定的32
  • 每条命令大小是64字节,每条命令完成状态是16字节;

详解

DB的另外一个作用,就是通知作用:Host更新SQ Tail DB的同时,也是在告知SSD有新的命令需要处理;Host更新CQ Head DB的同时,也是在告知SSD,你返回的命令完成状态信息我已经处理,同时表示谢意。

这里有一个对Host不公平的地方,Host对DB只能写,还仅限于写SQ Tail DB和CQ Head DB,不能读取DB

疑问??
1.SSD在取指的时候,是偷偷进行的,Host对此毫不知情。Host发了取指通知后,它并不清楚SSD什么时候去取命令,取了多少命令。怎么破?
存储笔记--NVMe原理篇_第7张图片
这是SSD往CQ中写入的命令完成状态信息(16字节)。是的,SSD往CQ中写入命令状态信息的同时,还把SQ Head DB的信息告知了Host!!这样,Host对SQ中Head和Tail的信息都有了,轻松玩转SQ,一开始CQ中每条命令完成条目中的”P” bit初始化为0,SSD在往CQ中写入命令完成条目时,会把”P”写成1。记住一点,CQ是在Host端的内存中,Host可以检查CQ中的所有内容,当然包括”P”了。Host记住上次的Tail,然后往下一个一个检查”P”,就能得出新的Tail了。就是这样。

总结

DB在SSD Controller端,是寄存器

DB记录着SQ和CQ的Head和Tail

每个SQ或者CQ有两个DB: Head DB 和Tail DB

Host只能写DB,不能读DB

Host通过SSD往CQ中写入的命令完成状态获取Head或者Tail

你可能感兴趣的:(linux,块设备驱动)