NVMe是一种针对PCIe SSD的高性能、可扩展的主机控制器接口。它的显著特征是支持通过多队列来处理IO命令,达到显著提高性能的效果。NVMe协议制定了Host与SSD控制器之间交互的命令,以及命令是如何执行的。命令有两种:一种叫Admin Command,用于Host管理和控制NVMe SSD;另一种叫I/O Command,用于Host和NVMe SSD之间数据的传输。
1. 管理命令
下面是NVMe 1.3支持的管理命令列表:
1)Delete I/O Submission Queue/Delete I/O Completion Queue/Create I/O Submission Queue/Create I/O Completion Queue
创建或删除IO提交,完成队列。
2)Get Log Page
获取指定log page的内容,比如smart log,self test log,error log等信息都是通过这个命令获取。
3)Identify
Identify命令返回一个数据缓冲区,其中描述了有关NVM子系统、controller或namespace的信息。比如active的namespace,所有的namespace,当前的controller等信息。
4)Abort
Abort命令用于终止先前提交给Admin Submission Queue或I/O Submission Queue的特定命令。要中止的命令可能已经完成,当前正在执行,或者可能处于队列中。
5)Set Features/Get Features
指定或获取Feature的属性。feature包括电源状态,温度阈值等。
6)Asynchronous Event Request
2. I/O命令
下面是NVMe 1.3支持的I/O命令列表:
1) Flush
Flush命令用于请求将易失性写缓存的内容变为非易失性。 如果启用了易失性写缓存,那么Flush命令将把与指定命名空间相关的数据和元数据刷到非易失性介质中。
2)Write
写data到NVMe controller提供的LBA,如果SSD支持的话,也可以写入meta。Host也可以指定要包含的保护信息(PI)作为写操作的一部分。
3)Read
从NVMe controller提供的LBA中读取data,如果SSD支持的话,也可以读取meta。Host也可以在读的时候检查PI信息。
4)Write Uncorrectable
字面意思是写如错误,实际上是标记指定范围的LBA为invalid。当LBA被标记为invalid后,如果读到这个LBA,会返回读失败(Unrecovered Read Error status)。如果要清除invalid标记,需要在被标记的LBA上执行Write命令,“覆盖”之前的标记。
5)Compare
Compare命令从存储介质中读取指定的LBA,并将读取的数据与传入的比较数据缓冲区(Compare命令传入的)进行比较。如果读取的数据和比较数据缓冲区中的数据是相同的,则命令返回成功。如果存在任何不同,则命令返回Compare Failure。
6)Write Zeroes
将指定LBA范围的数据写0.
7)Dataset Management
用于指定LBA范围的属性。包括数据读写频率、访问大小和其他可用于优化性能和可靠性的信息。不是常用命令。
8)Reservation Register/Reservation Release/Reservation Acquire/Reservation Report
Reservation提供了一整套可以让一个、两个或者更多的Hosts共同访问一个shared namespace的机制。Reservation权限就像是一个shared namespace 的管理员权限,得到reservation权限的host 对这个shared namespace 可以做任意的读写操作。但是在成为管理员之前需要先用Reservation Register命令注册成为注册人员(registrant),从而建立host和namespace之间的连接, 这个操作的意义相当于通过register 的key 建立起host id 和namespace 之间的register 关系。Reservation Release是让Host放弃这个namespace的管理员权限。Reservation Acquire是获取对应的权限。Reservation Report会返回当前的reservation状态。