一种NVMe扩展的实现方法及固态硬盘与流程

文档序号:15462370发布日期:2018-09-18 18:28阅读:510来源:国知局

本发明涉及存储技术领域,尤其涉及一种NVMe扩展的实现方法及固态硬盘。



背景技术:

SSD(固态硬盘)已经被广泛应用于各种场合,随着PC的性能要求提升,作为关键因素之一的存储设备的性能是影响全局性能的重点因素。

通过对目前一些主流的性能测试工具测试模型的分析,我们发现一种数据类型极大地影响测试结果。这种特殊的数据,称为No-Map(无映射)数据,其代表对应的逻辑空间不存在有效数据。

发生这种场景主要是因为SSD在出厂后从来没有写入数据或者主机端通过特殊的命令(TRIM,Security Erase等)废弃了其中数据。对于这种数据,主机只预期其返回特定的数据(如全0)。

图1是传统PCIe/NVMe接口协议下的主机与SSD读流程:

-S0:主机写入读命令到SQ(命令提交队列,Submission Queue);

-S1:主机触发SSD端的SQ Doorbell,通知SSD有新的命令到达;

-S2:SSD从主机端SQ获取读命令到本地;

-S3:SSD内部发起内部数据加载:将逻辑地址翻译成物理地址,从物理地址读取数据;

-S4:SSD将数据传输到主机端对应Buffer;

-S5:SSD格式化Completion Queue Entry,并提交到主机端的CQ;

-S6:SSD触发中断,通知主机新的命令已经完成;

-S7:Host获取CQ,解析其中状态字段并将数据返回应用层;

-S8:Host触发SSD端的CQ Doorbell,释放CQ Entry;

-S9:SSD完成对应命令处理,释放对应资源,并继续处理新的命令。

图2是SSD内部读通路示意图;主机提交读命令到SSD的前端模块;SSD前端模块将命令分割成映射单元(典型如4KB),提交到读写缓冲区管理模块;读写缓冲区管理模块从缓存Memory中(典型如DRAM)分配空间,后再提交操作请求到映射表管理模块中;映射表管理模块负责把逻辑地址转换成NAND物理地址,后再提交操作请求到后端模块,后端模块根据物理地址发起对NAND读请求,并等待NAND操作请求完成,此时数据已经加载到预先分配的Memory中,控制操作请求依次返回上层模块。前端模块接收到完成的控制操作请求后,构建数据传输命令,实际发起对主机的数据传输。从上面整个流程来看,从SSD接收到主机命令,到真正发起数据传输,中间需要经过众多环节,命令的响应延迟以及服务时间很大。

对于磁盘数据来说,存在一种特殊的数据,其代表对应的逻辑空间实际上不存在有效数据:出厂后从来没有写入数据或者主机通过特殊的命令废弃了其中数据,我们称此种数据为no-map数据(无映射数据)。对于此类型的数据,只需返回协议规定的特定数据即可(例如全0)。因此现有的处理流程还具有较大的改进空间。



技术实现要素:

针对以上缺陷,本发明目的在于如何提高对于No-Map的命令的响应速度,进而整体上提高固态硬盘读性能。

为了实现上述目的,本发明提供了一种NVMe扩展的实现方法,其特征在于SSD接收到主机端读命令后,按照该命令的逻辑空间查询SSD内部的无映射管理表,判断该命令是否为无映射命令,如果是则直接将完成队列条目中用于标识是否为无映射的映射状态位设置为1,并直接结束该命令,并返回主机;否则根据该命令的逻辑空间地址读取数据,读完成后,将映射状态位设置为0,再返回主机;主机接收到完成队列条目后先判读映射状态位是否为1,如果是则直接由主机端将该命令对应的缓存置0后返回应用或直接返回应用。

所述的NVMe扩展的实现方法,其特征在于将NVMe标准协议的完成队列条目的状态字的bit 28作为映射状态位。

所述的NVMe扩展的实现方法,其特征在于判断该命令是否为无映射命令,增加无映射检查模块,SSD的前端模块中的命令接收模块负责命令解析和逻辑地址空间提取,完成后将命令提交给无映射检查模块,所述无映射检查模块根据主机提交的读命令的逻辑地址空间判断当前读取的空间是否属于无映射no-map,如果属于则直接构建状态字Bit 28为1的条目到完成队列中,而不需要进行数据传输。

所述的NVMe扩展的实现方法,其特征在于包括no-map加速模块和no-map映射表,所述no-map映射表记录了当前固态硬盘中处于no-map的地址信息,所述no-map映射表维护两种颗粒度的两级映射表,所述无映射检查模块根据主机提交的读命令的逻辑地址空间查找no-map映射表,判断该读命令上的地址空间是否都为无映射状态,如果是则直接提交给no-map加速模块,no-map加速模块直接构建状态字Bit 28为1的条目到完成队列中,而不需要进行数据传输。

所述的NVMe扩展的实现方法,其特征在于所述无映射检查模块根据主机提交的读命令的逻辑地址空间判断当前读取的空间存在非无映射no-map时,将该读命令提交读写缓冲区管理模块,读写缓冲区管理模块按照LPA映射颗粒度(4KB)切分成连续的控制请求,提交到映射表管理模块;映射表管理模块,对于每个4KB的控制请求,分别查询逻辑物理映射表;如果为no-map的,则标志该4KB为no-map,后端模块获取到该命令一系列的4KB读控制请求后,查询其状态标志,如果是no-map的,则不再往后继模块提交NAND读写请求,而是直接提交到no-map加速模块,no-map加速模块的no-map数据传输模块直接构建NVMe传输命令,将预先格式化好的数据发送给主机。

一种固态硬盘,其特征在于主机和SSD控制器之间通过NVMe协议进行通信,SSD接收到主机端读命令后,按照该命令的逻辑空间查询SSD内部的无映射管理表,判断该命令是否为无映射命令,如果是则直接将完成队列条目中用于标识是否为无映射的映射状态位设置为1,并直接结束该命令,并返回主机;否则根据该命令的逻辑空间地址读取数据,读完成后,将映射状态位设置为0,再返回主机;主机接收到完成队列条目后先判读映射状态位是否为1,如果是则直接由主机端将该命令对应的缓存置0后返回应用或直接返回应用。

所述的固态硬盘,其特征在于将NVMe标准协议的完成队列条目的状态字的bit 28作为映射状态位。

所述的固态硬盘,其特征在于判断该命令是否为无映射命令,增加无映射检查模块,SSD的前端模块中的命令接收模块负责命令解析和逻辑地址空间提取,完成后将命令提交给无映射检查模块,所述无映射检查模块根据主机提交的读命令的逻辑地址空间判断当前读取的空间是否属于无映射no-map,如果属于则直接构建状态字Bit 28为1的条目到完成队列中,而不需要进行数据传输。

所述的固态硬盘,其特征在于包括no-map加速模块和no-map映射表,所述no-map映射表记录了当前固态硬盘中处于no-map的地址信息,所述no-map映射表维护两种颗粒度的两级映射表,所述无映射检查模块根据主机提交的读命令的逻辑地址空间查找no-map映射表,判断该读命令上的地址空间是否都为无映射状态,如果是则直接提交给no-map加速模块,no-map加速模块直接构建状态字Bit 28为1的条目到完成队列中,而不需要进行数据传输。

所述的固态硬盘,其特征在于所述无映射检查模块根据主机提交的读命令的逻辑地址空间判断当前读取的空间存在非无映射no-map时,将该读命令提交读写缓冲区管理模块,读写缓冲区管理模块按照LPA映射颗粒度(4KB)切分成连续的控制请求,提交到映射表管理模块;映射表管理模块,对于每个4KB的控制请求,分别查询逻辑物理映射表;如果为no-map的,则标志该4KB为no-map,后端模块获取到该命令一系列的4KB读控制请求后,查询其状态标志,如果是no-map的,则不再往后继模块提交NAND读写请求,而是直接提交到no-map加速模块,no-map加速模块的no-map数据传输模块直接构建NVMe传输命令,将预先格式化好的数据发送给主机。

本发明通过综合针对no-map Command读处理流程来看,由于减少了SSD到Host之间的数据传输,所以命令响应延迟以及服务时间大大地得到了降低,其实测带宽可有效突破PCIe的物理限制。

附图说明

图1是传统PCIe/NVMe接口协议下的主机与SSD读流程;

图2是SSD内部读通路示意图;

图3是两级no-map映射表构成示意图;

图4是结合CQ Entry定义修改后的NVMe层交互流程图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

图3是两级no-map映射表构成示意图,SSD内部涉及到的映射表、颗粒度以及转换规则,其中:逻辑页地址LBA:为主机端访问的最小可寻址单元,一般为512Bytes;逻辑块地址LPA:为SSD内部的逻辑映射单元,一般为4KB;无映射单元CMD No-Map Entry:一般为512KB。

LBA->LPA的转换规则,按照线性转换原则,从0开始,连续的8个LBA对应唯一的LPA(例如LBA 0–7,对应LPA 0);连续的1024个LBA对应唯一的CMD no-map entry(例如LBA 0–1023,对应CMD No-Map Entry Index 0);“逻辑到物理映射表”,简称L2P表,其表索引由LPA索引,其值表示物理地址。

“No-Map映射管理表”,其表索引由CMD No-Map Entry Index索引;其值有两个可能性:1表示对应LBA/LPA范围全部是no-map的;0表示非全no-map;要么全部有map,要么部分有map部分无map,需要结合L2P表在4KB级别做进一步查询。

对现有的NVMe Specification中协议进行改进:在SSD完成数据传输后,提交CQ Entry到主机CQ完成队列(Completion Queue)时,其格式改为协议约定好的格式。一个CQ Entry包含4个DWORD,分别为DWORD 0、DWORD 1、DWORD 2和DWORD 3,每个DWORD为32bit,其中DWORD3中bit 25~bit31定义为一个15bit的Status字段,Status字段除了bit 28/29外,其余所有bit都已经被使用,用来指示当前命令完成状况,数据是否有错等;本实施例通过使用bit28来指示整个命令的数据都是no-map。如果该字段为1,则表述该命令所有的逻辑空间都是属于no-map数据;如果为0,则表示非全no-map的。

图4是结合CQ Entry定义修改后的NVMe层交互流程图;传统PCIe/NVMe接口协议下的主机与SSD读流程中,数据需要从SSD端透过PCIe总线写入到HostBuffer,而PCIe总线是有带宽限制的(典型如Gen 3x1,有效带宽800MB/s);对于no-map的command处理流程可大大简化,并能极大地提升no-map的读性能。

F0:主机写入读命令到SQ(命令提交队列,Submission Queue);

F1:主机触发SSD端的命令提交队列通知SQ Doorbell,通知SSD有新的命令到达;

F2:SSD从主机端SQ获取读命令到本地;

F3:SSD内部对该读命令进行处理,与传统模型不同的是,按照该命令逻辑空间,查询涉及到的“No-Map映射管理表”表项,若所有表项的值都为1,则该命令我们称之为no-map命令。此类命令将按如下的新流程执行(非no-map命令可按传统模式继续处理);

F4:SSD格式化完成队列条目(Completion Queue Entry),并提交到主机端的CQ,此处我们将Status字段的bit 28标识为1;

F5:SSD触发中断,通知主机新的命令已经完成;

F6:Host获取CQ,解析其中状态字段;

F7:Host发现此Status中no-map字段为1,则使用快速引擎(如DMA);将对应Buffer直接初始化为全0,然后将数据返回应用层;

F8:Host触发SSD端的CQ Doorbell,释放CQ Entry;

F9:SSD完成对应命令处理,释放对应资源,并继续处理新的命令。

综合针对no-map Command读处理流程来看,由于减少了SSD到Host之间的数据传输,所以命令响应延迟以及服务时间大大地得到了降低,其实测带宽可有效突破PCIe的物理限制。如PCIe Gen 3x1的情形,对于no-map读带宽能够提升到4GB+/s,远远大于原来的800MB/s。

作为进一步的优化项,如果主机不关心no-map数据的具体内容,我们可以F7环节省略掉Host端Buffer格式化全0过程,由此,对于no-map的读带宽能够提升到数十GB每秒。

以上所揭露的仅为本发明一种实施例而已,当然不能以此来限定本发明之权利范围,本领域普通技术人员可以理解实现上述实施例的全部或部分流程,并依本发明权利要求所作的等同变化,仍属于本发明所涵盖的范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1