用于非易失性存储器的存储器高效持续键值储存的制作方法

文档序号:16399905发布日期:2018-12-25 20:04阅读:359来源:国知局
用于非易失性存储器的存储器高效持续键值储存的制作方法

本申请要求于2017年6月13日提交的代理人案卷号no.sda-3265p-us(wdt-1209p)的标题为“memoryefficientpersistentkey-valuestorefornon-volatilememories”的美国临时申请no.62/519,094的优先权和权益,其全部内容通过引用并入本文。

本发明涉及非易失性存储器,并且更具体地,涉及用于非易失性存储器的存储器高效持续键值储存。

背景技术

键值储存(key-valuestore,kvs)通常用于各种大规模数据密集型的数据库应用中。由于其高可扩展性和简单性,这些数据库应用对大数据集(dataset)具有随机存取,并且选择键值储存而不是常规的关系型数据库(relationaldatabase)。已经对基于闪存的kvs完成了若干研究工作,以利用闪存特性来提高性能并减少主机的主存储器的使用。这些kvs工作在闪存中保存键值(kv)对并且在主存储器(例如,动态随机存取存储器或dram)中保存索引结构(或每kv对的元数据),以支持快速插入、删除和查找操作。然而,随着数字数据量每两年翻一倍并且于2020年接近44泽字节(44万亿千兆字节),kvs的性能仍然受限于大输入/输出(i/o)开销(闪存大约比dram慢100倍)和主存储器大小。

与快速增长的键值(kv)数据集相比,由于dram容量增长相对缓慢,主存储器大小在可扩展性和性能上带来具有挑战性的问题。已经观察到,由于对不同kv工作负载的增加的i/o开销(由于散列列表冲突导致的储存中链接列表遍历)所导致的超过10至250倍的减速。

新兴的快速字节可寻址非易失性存储器(envm)技术(诸如reram和3dxpoint)预计将提供比闪存高两个数量级的性能。然而,现有的固态装置(ssd)架构对闪存特性进行了优化,并且由于架构和i/o接口(例如,pcie、sata)限制而不足以充分利用envm的全部潜力。

为了改善储存性能并降低kvs的主机主存储器需求,提出了一种改善的ssd架构,其在处理大规模键值数据集时提供了更好的性能。



技术实现要素:

根据一个方面,公开了包括非易失性存储器(nvm)和键值储存(kvs)处理器的固态装置(ssd)。非易失性存储器(nvm)配置为储存键值数据结构。kvs处理器配置为从主机接收键值储存(kvs)命令。kvs处理器还配置为基于接收的kvs命令对键值数据结构进行键值储存(kvs)操作。进行键值储存(kvs)操作可以包括使用索引结构来基于接收的kvs命令处理键值数据结构。kvs处理器还配置为基于kvs操作将响应提供给主机。

根据另一个方面,公开了一种用于操作固态装置(ssd)的方法。该方法在ssd的非易失性存储器(nvm)处储存键值数据结构。该方法从主机接收键值储存(kvs)命令。该方法在ssd处基于接收的kvs命令识别索引结构的条目。该方法基于识别的条目从键值数据结构识别键值数据的组。该方法在ssd处基于接收的kvs命令处理来自键值数据的识别的组的一个或多个键值数据。该方法基于对一个或多个键值数据的处理来将响应提供给主机。

根据另一个方面,公开了一种用于操作固态装置(ssd)的设备。该设备包括用于键值数据结构的非易失性储存的构件和用于键值储存(kvs)处理的构件。用于键值储存(kvs)处理的构件包括用于从主机接收键值储存(kvs)命令的构件、用于基于接收的kvs命令对键值数据结构进行键值储存(kvs)操作的构件、以及用于基于kvs操作将响应提供给主机的构件。用于进行键值储存(kvs)操作的构件包括基于kvs命令生成散列值。

附图说明

图1图示了根据本公开的实施例的包括键值储存(kvs)处理器的固态装置(ssd)的框图。

图2图示了根据本公开的实施例的键值储存(kvs)处理器的框图。

图3图示了根据本公开的实施例的在主机和固态装置(ssd)之间的装置架构的图。

图4图示了根据本公开的实施例的在主机和固态装置(ssd)之间的具有若干线程的装置架构的图。

图5图示了根据本公开的实施例的用于由固态装置(ssd)处理来自主机的键值储存(kvs)命令的方法的流程序列图。

图6图示了根据本公开的实施例的用于由固态装置(ssd)处理来自主机的非键值储存(kvs)命令的方法的流程序列图。

图7(其包括图7a-7c)图示了根据本公开的实施例的由固态装置(ssd)进行来自主机的get命令的序列图。

图8(其包括图8a-8b)图示了根据本公开的实施例的由固态装置(ssd)进行来自主机的put命令的序列图。

图9(其包括图9a-9c)图示了根据本公开的实施例的由固态装置(ssd)进行来自主机的另一个put命令的序列图。

图10(其包括图10a-10c)图示了根据本公开的实施例的由固态装置(ssd)进行来自主机的delete命令的序列图。

图11图示了根据本公开的实施例的用于由固态装置(ssd)处理来自主机的各种命令的方法的示例性流程图。

图12图示了根据本公开的实施例的用于由固态装置(ssd)处理来自主机的键值储存(kvs)命令的示例性流程图。

具体实施方式

本公开提供了包括非易失性存储器(nvm)和键值储存(kvs)处理器的固态装置(ssd)。非易失性存储器(nvm)配置为储存键值数据结构。kvs处理器配置为从主机接收键值储存(kvs)命令。键值储存(kvs)命令的示例包括get命令、put命令和delete命令。kvs处理器还配置为基于接收的kvs命令对键值数据结构进行键值储存(kvs)操作。进行键值储存(kvs)操作可以包括使用索引结构来基于接收的kvs命令处理键值数据结构。kvs处理器还配置为基于kvs操作将响应提供给主机。

对kvs处理的其他方法主要使用缓存和高效的索引方案来改善性能并减少i/o开销,而所公开的固态装置(ssd)可以将键值数据和索引结构保存在ssd中,因此减少发送到主机的键值数据量。此外,所公开的方法可以将键值储存操作卸载到ssd,以利用nvm的低时延、高内部带宽以及跨多个控制器的并行性。所公开的ssd可以实现ssd内的索引能力,并且具有实现诸如get、put和delete的键值操作的储存中处理引擎(例如,kvs处理器),以对键值(kv)数据集进行高效操作。

图1图示了包括具有键值储存(kvs)处理功能的固态装置(ssd)的系统100的框图。系统100包括固态装置(ssd)102和主机104。ssd102是储存装置(例如,ssd储存装置)。ssd102通过一个或多个互连106耦接到主机104。一个或多个互连106在ssd102和主机104之间提供了物理输入/输出(i/o)数据连接。在ssd102和主机104之间行进的数据可以称为i/o开销。数据可以包括指令、命令和/或响应。

主机104可以是具有对数据储存或取回的需求和用于与ssd102通信的兼容接口的任何系统和/或装置。例如,主机104可以是计算装置、个人计算机、便携式计算机、工作站、服务器、路由器、网络装置、个人数字助理、数字相机、数字电话或其组合。主机104可以包括若干主机。主机104可以是与ssd102分开(例如,物理分开)的装置。在一些实施例中,主机104包括ssd102。在其他实施例中,ssd102相对于主机104是远程的,或者被包含在与主机104通信耦接的远程计算系统中。例如,主机104可以通过无线通信链路与ssd102通信。

主机104将命令提供给ssd102,用于在主机104和ssd102之间传输数据。例如,主机104可以将写入命令提供给ssd102,用于将数据写入到ssd102,或者主机可以将读取命令提供给ssd102,用于从ssd102读取数据。ssd102可以通过一个或多个互连106将对写入命令或读取命令的响应提供给主机104。如将在以下进一步描述的,ssd102能够处理不同类型的命令,包括来自主机104的键值储存(kvs)命令和非键值储存(kvs)命令。kvs命令和非kvs命令在以下进一步描述。

ssd储存装置102包括主机接口110、桥接器112、缓冲器114、交叉开关(crossbar)116、键值储存(kvs)处理器118、处理器120(或替代地,nvm处理器120)、随机存取存储器(ram)122、非易失性存储器(nvm)接口124(其还可以称为闪速存储器接口)、以及非易失性存储器(nvm)126(诸如,nand闪速存储器)。

主机接口110经由桥接器112和交叉开关116耦接到处理器120。注意到,主机接口110可以以不同方式耦接到处理器120。例如,主机接口110可以直接耦接到处理器120。在另一个示例中,主机接口110可以经由桥接器120耦接到处理器120,而不需要耦接到交叉开关116。主机接口110便于在主机104和ssd102的其他组件(诸如处理器120和/或kvs处理器118)之间的通信。主机接口110可以是任何类型的通信接口,诸如集成驱动器电子设备(ide)接口、通用串行总线(usb)接口、串行外设(sp)接口、高级技术附件(ata)或串行高级技术附件(sata)接口、小型计算机系统接口(scsi)、ieee1394(火线)接口等。

桥接器112经由缓冲器114耦接到键值储存(kvs)处理器118。在一些实现方式中,桥接器112可以是主机接口110的部分。缓冲器114帮助管理kvs处理器118和桥接器112之间的数据流。kvs处理器118经由交叉开关116耦接到处理器120。kvs处理器118可以表示一个或多个kvs处理器。在一些实现方式中,kvs处理器118耦接到处理器120,而不经过交叉开关116。交叉开关116帮助管理在kvs处理器118和处理器120之间行进的数据流,以及桥接器112和处理器120之间的数据流。ssd102的各种组件可以通过使用通信协议(例如,高级可扩展接口(axi)协议)彼此通信。在一些实现方式中,交叉开关116可以是桥接器112的部分。

桥接器112配置为确定来自(经由主机接口110)主机104的命令是kvs命令还是非kvs命令。当该命令是非kvs命令时,桥接器112可以经由交叉开关116将该命令指引或发送到处理器120。当该命令是kvs命令时,桥接器112可以将该命令指引或发送到kvs处理器118。kvs命令由kvs处理器118进行处理,并且处理的kvs命令然后被指引或发送到处理器120。kvs命令的示例包括get命令、put命令和delete命令。处理kvs命令的示例在以下至少图2、5、7a-7c、8a-8b、9a-9c和10a-10c中进一步描述。因此,ssd102提供的一个功能是处理不同类型的命令的能力。这使得ssd102能够操作除了ssd之外的宽范围的装置、系统、主机和/或应用,并且与之一起工作。此外,在ssd处处理键值数据的能力减少了主机和ssd之间的i/o开销,因此加速了ssd的总体性能。

处理器120经由nvm接口124耦接到ram存储器122以及nvm126。处理器120控制ssd102的操作。在各种方面中,处理器120通过主机接口110从主机104接收命令,并且进行命令(例如,kvs命令、非kvs命令),以在主机104和nvm126之间传输数据。如上所提到的,当该命令是kvs命令时,处理器120可以通过kvs处理器118接收命令。此外,处理器120可以管理从存储器122的读取和对存储器122的写入,用于进行由处理器120所实现的各种功能,并且以维护和管理储存在存储器122中的缓存的信息。

处理器120和/或kvs处理器118可以包括任何类型的处理装置(诸如微处理器、微控制器、嵌入式控制器、逻辑电路、软件、固件等等),用于控制ssd102的操作。在一些方面中,本文所描述的由处理器120进行的功能中的一些或全部可以代替地由ssd102的另一个组件进行。例如,ssd102可以包括微处理器、微控制器、嵌入式控制器、逻辑电路、软件、固件或任何种类的处理装置,用于进行本文所描述的由处理器120进行的一个或多个功能。在一些实现方式中,kvs处理器118可以是处理器120的部分。根据其他方面,本文所描述的由处理器120进行的功能中的一个或多个代替地由主机104进行。在另外的其他方面中,本文所描述的由处理器120进行的功能中的一些或全部可以代替地由另一个组件(诸如包括非易失性存储器元件和磁性储存元件的混合驱动器中的处理器)进行。

存储器122可以是能够储存数据的任何存储器、计算装置或系统。例如,存储器122可以是随机存取存储器(ram)、动态随机存取存储器(dram)、双倍数据速率(ddr)dram、静态随机存取存储器(sram)、同步动态随机存取存储器(sdram)、闪速储存、可擦除可编程只读存储器(eprom)、电可擦除可编程只读存储器(eeprom)等。在各种方面中,在主机104和nvm26之间传输数据期间,处理器120使用存储器122或其部分来储存数据。例如,存储器122和存储器122的一部分可以是高速缓存存储器。

nvm126经由nvm接口124从处理器120接收数据,并且储存该数据。nvm126可以是任何类型的非易失性存储器,诸如闪速储存系统、nand型闪速存储器、固态装置(ssd)、闪速存储器卡、安全数字(sd)卡、通用串行总线(usb)存储器装置、紧凑型闪速卡、智能媒体装置、闪速储存阵列等。

键值储存(kvs)处理器

如上所提到的,ssd102包括键值储存(kvs)处理器118,其使得ssd102能够处理键值kv数据库上的kvs命令。kv数据库将数据排列为单个不透明集合。这使得可以储存的数据类型具有更大的灵活性。此外,对于相同数量的数据集,kv数据库比其他数据库结构(诸如关系型数据库(rbd))使用更少的存储器。kvs命令用于存取kv数据库。kvs命令是专用于kv数据库的命令。这些kvs命令相对于kv数据库进行非常特定的功能。在kv数据库外部,这些kvs命令不工作。kvs命令的示例是get命令、put命令以及delete命令。

图2图示了kvs处理器118的框图。kvs处理器118可以表示一个或多个kvs处理器。kvs处理器118配置为基于kvs命令对键值数据结构进行键值储存(kvs)操作。键值储存(kvs)操作可以包括散列操作,其在以下至少图7a-7c和12中进一步描述。

kvs处理器118包括一个或多个键值储存(kvs)核心200、散列控制器202、调度器204、索引器206、分配器208和直接存储器存取(dma)控制器210。kvs核心200耦接到散列控制器202、调度器204、索引器206、分配器208和dma控制器210。dma控制器210耦接到交叉开关116。散列控制器202耦接到调度器204。

调度器204管理来自(经由主机接口110、桥接器112、缓冲器1140)主机104的命令,并且响应于主机104。调度器204可以从缓冲器114接收命令220,并且按照先进先出(fifo)调度它们。相似地,调度器204可以按照先进先出(fifo)将响应222发送到缓冲器114。在一些实现方式中,调度器204可以将轮循调度(roundrobinscheduling)应用于各种命令。调度器204可以将命令指引到kvs核心200的各个核心。这允许kvs处理器118处理彼此并行的若干命令。在kv数据集中的散列冲突的实例中,调度器204还可以调度要由相同核心顺序地处理的命令。散列冲突随着kv数据集增加而增加,散列冲突在以下至少图7a-7c中进一步描述。

散列控制器202对kvs命令进行散列计算。散列计算可以包括基于与从主机接收的命令相关联的键来计算散列值。在一些实现方式中,散列计算可以包括使用散列功能来将任意大小的数据(例如,键)映射到固定大小的数据(例如,散列值)。散列功能可以用于将键映射到键值数据结构,其中键可以与索引结构一起使用,以指向键值数据结构中的储存一个或多个键和数据组合的组(例如,贮体)。可能的键的数目典型地大于索引结构中的条目(例如,散列值)的数目。索引结构中的每个条目(例如,散列值)将指向键值数据结构中的特定位置(例如,组、贮体、组的特定键值组合)。特定位置可以是组的键值组合的特定位置。散列功能可能为不同的键生成相同的散列值,这已知为散列冲突。因此,不同的键可能是键值数据结构中的相同组(例如,贮体)的部分。键值数据结构中的特定位置(例如,组、贮体)可以储存多于一个键和值组合(例如,一个或多个储存的键和储存的值组合)。键值数据结构的特定位置可以包括一个或若干物理地址。在一些实现方式中,键值数据结构的特定位置可以是指键值数据结构的位置或键值数据结构的若干位置。散列在以下至少图7a-7c中进一步详细描述。

索引器206配置为进行对索引结构的查找,并且提供键值数据结构的特定组(例如,贮体)的物理地址位置。索引器206还进行对索引结构的新物理地址的更新。索引器206还可以使用位图结构来提供有效指针检查。

分配器208配置为管理ssd102内部的可用的和使用的区块(例如,储存区块、存储器区块)。分配器208可以在ssd102内部分配和/或归还存储器区块。分配器208可以使用位图结构来管理存储器区块。dma控制器210配置为经由交叉开关116从nvm载入和/或储存数据到本地存储器。kvs核心200配置为进行不同的kvs命令,诸如get命令、put命令和delete命令。kvs核心200可以从散列控制器202接收索引结构。kvs核心200可以与索引器206通信,以获得物理地址指针。kvs核心200可以与dma控制器210通信,以将数据载入到本地存储器。kvs核心200可以与分配器208通信,以进行区块的分配和/或归还。

装置架构

图3和图4图示了当装置(例如,主机)耦接到包括kvs功能的ssd时,可以如何在装置侧(例如,主机装置)打包(package)和处理数据。在常规的系统主机中,经由系统软件i/o堆栈对储存数据的每次存取都引发显著的操作系统和文件系统开销。在图3和图4中描述的(多个)装置架构通过提供对键值储存数据的直接存取来增强现有的软件堆栈,以改善总体性能。图3图示了在主机和包括kvs功能的固态装置(ssd)之间的示例性装置架构的图。装置架构300包括应用层302、键值储存(kvs)库层304、输入/输出(i/o)堆栈层306(例如,文件系统和操作系统i/o堆栈)、以及装置驱动器层308。装置架构300允许装置(例如,主机)与包括kvs功能的固态装置(ssd)320进行通信。

应用层302指定应用专用命令和数据(例如,网络浏览器命令、网站数据)。kvs库层304包括关于获得、更新、放置和/或删除储存在键值数据结构中的数据的命令。kvs库层304的命令包括get命令、put命令和delete命令。kvs库层304将转换应用层302数据,使得其可以在键值数据结构中进行处理。i/o堆栈层306可以将kvs地址转换成装置地址。例如,i/o堆栈层306可以将键值数据结构地址转换成装置地址(例如,主机地址)。装置驱动器层308是允许装置(例如,主机)与储存体320通信的接口。在一些实现方式中,储存体320可以是ssd102。

如图3所示,包括装置架构300的装置(例如,主机)上的应用可以以多种方式与ssd通信。在一个实现方式中,应用(例如,浏览器应用)可以通过应用层302、kvs库层304、i/o堆栈层306和装置驱动器层308与储存体320进行通信。在一些实现方式中,应用(例如,浏览器应用)可以通过应用层302和kvs库层304与储存体320进行通信,绕开装置架构300的其他架构层的一个或多个功能和/或转换。例如,来自kvs库层304的一些或所有kvs命令可以不需要转换。这可能是因为储存体320包括kvs功能,因此储存体320能够处理kvs库层304(诸如,kvs命令)。

图4图示了在主机和包括kvs功能的固态装置(ssd)之间的示例性装置架构的图,其中若干线程在主机和ssd之间运行。图4图示了主机可以通过若干通信信道(例如,信道1、信道2、信道3、……信道n)与ssd通信,其中每个信道包括线程。第一线程400使用第一信道,第二线程410使用第二信道,且第三线程420使用第三信道。线程可以彼此并行地操作。每个线程包括应用层302、键值储存(kvs)库层304、输入/输出(i/o)堆栈层306和装置驱动器层308。每个线程可以包括门铃寄存器、命令队列(例如,kvs命令)和响应队列。

固态装置(ssd)处理键值储存(kvs)命令和非kvs命令的示例性流程序列

图5和6图示了处理键值储存(kvs)命令和非kvs命令的固态装置(ssd)的流程序列。图5和图6中示出的流程序列可以由本公开中描述的ssd(诸如ssd102)中的任一个进行。另外,出于清楚的目的,图5和图6中示出的流程序列不必示出进行图5和图6中描述的操作的ssd的所有组件。例如,当在ssd的不同组件之间行进时,所描述的数据(例如,命令、响应)中的一个或多个可以行进通过一个或多个缓冲器和/或一个或多个交叉开关。在一些实现方式中,图5和图6所示的流程序列可以包括由ssd进行的其他操作。

图5图示了由耦接到主机(例如,主机104)的ssd501进行的流程序列500。流程序列500包括由ssd501处理kvs命令。ssd501包括主机接口502、桥接器504、键值储存(kvs)处理器506、处理器508和非易失性存储器(nvm)510。在一个方面中,nvm实现为nand存储器。

如图5所示,主机接口502将键值储存(kvs)命令发送(在512处)到桥接器504。kvs命令可以由主机接口502从主机(例如,104)接收。kvs命令的示例包括get命令、put命令和delete命令。在一些实现方式中,当命令由主机发送和/或由ssd接收时,kvs命令是不包括要处理的数据的(多个)物理地址的命令(例如,没有物理地址信息的命令)。桥接器504确定(在514处)命令是kvs命令,并且将kvs命令发送(在516处)到kvs处理器506。kvs处理器506处理(在518处)kvs命令,这可以包括进行散列计算以生成散列值以及使用索引结构来识别在键值数据结构中的位置(例如,组、键值组合)。在一些实现方式中,识别位置包括识别键和值组合在nvm510中的物理地址。在一些实现方式中,识别位置包括识别与nvm510中的键和值组合的组相关联的物理地址。

kvs处理器506将包括数据地址的命令发送(在520处)到处理器508。处理器508处理(在522处)来自kvs处理器506的命令。处理器508将命令发送(在524处)到nvm510。nvm510基于该命令存取(在526处)数据。存取数据可以包括在nvm510的特定物理地址处读取数据和/或在nvm510的特定物理地址处写入数据。

nvm510将对命令的响应发送(在528处)到处理器508,其中该响应被处理(在530处)。响应可以包括数据(例如,键、值、指针、确认、错误)。处理器508将该响应发送(在532处)到kvs处理器506。kvs处理器506处理(在534处)响应,并且将响应发送(在536处)到桥接器504。桥接器504处理(在538处)响应,并且将响应发送(在540处)到主机接口502。主机接口502将响应发送到主机(例如,104)。以上流程序列500可以多次顺序地进行或者与其他命令(例如,kvs命令、非kvs命令)并行地进行。

图6图示了由耦接到主机(例如,主机104)的ssd501进行的流程序列600。流程序列600包括由ssd501处理非kvs命令。ssd501包括主机接口502、桥接器504、键值储存(kvs)处理器506、处理器508和非易失性存储器(nvm)510。

如图6所示,主机接口502将非键值储存(kvs)命令发送(在612处)到桥接器504。非kvs命令可以由主机接口502从主机(例如,104)接收。非kvs命令包括不特别限于键值储存数据库的命令。换言之,非kvs命令是可以在非键值储存数据库中使用的命令。非kvs命令的示例包括读取命令和/或写入命令。在一些实现方式中,当命令由主机发送和/或由ssd接收时,非kvs命令是包括要处理的数据的(多个)物理地址的命令。桥接器504确定(在614处)命令是非kvs命令,并且将非kvs命令发送(在616处)到处理器508。在一些实现方式中,非kvs命令可以包括地址信息(例如,nvm510上的数据的物理地址)。非kvs命令绕开kvs处理器506。处理器508处理(在622处)来自桥接器504的非kvs命令。处理器508将命令发送(在524处)到nvm510。nvm510基于该命令存取(在626处)数据。存取数据可以包括在nvm510的特定物理地址处读取数据和/或在nvm510的特定物理地址处写入数据。

nvm510将对命令的响应发送(在628处)到处理器508,其中该响应被处理(在630处)。响应可以包括各种数据(例如,键、值、指针、确认、错误)。处理器508将该响应发送(在632处)到桥接器504。响应绕开kvs处理器506。桥接器504处理(在638处)响应,并且将响应发送(在640处)到主机接口502。主机接口502将响应发送到主机(例如,104)。以上流程序列600可以多次顺序地进行或者与其他命令(例如,kvs命令、非kvs命令)并行地进行。

图7(其包括图7a-7c)图示了进行键值储存(kvs)命令的固态装置(ssd)的流程序列。特别地,图7图示了由ssd进行的来自主机的get命令的序列。

如图7a所示,ssd从主机接收get命令710。get命令710指定ssd获得与键(k3)相关联的值。ssd的kvs处理器700对键(k3)进行散列操作,该散列操作生成散列值720。散列值720然后用于索引结构704上,以从键值数据结构702识别的组。在该特定情形下,散列值720指向索引结构704中的识别的组0的条目。组0指向键值数据结构702中的键(k1)和值(v1)组合730。在一些实现方式中,索引结构的用于组0的条目包括指针,该指针是键(k1)和值(v1)组合730在键值数据结构702(其储存在ssd的nvm中)中的物理地址。键值数据结构的组可以是空的,或者包括一个或多个键值数据(例如,键和值组合)。即使索引结构704中的指针指向键(k1)和值(v1)组合730,但是指针可以认为是对键值数据结构702的组0的指针。不同的实现方式可以以不同的方式储存索引结构704。ssd从键值数据结构702取回和读取键(k1)和值(v1)组合730,并且然后将组合730的键(k1)与命令710的键(k3)进行比较。在这种情形下,键不匹配,并且ssd取回下一个键和值组合。下一个键和值组合由定位键(k1)和值(v1)组合730的指针来指定。该指针可以是下一个键和值组合的物理地址。在该示例中,下一个键和值组合是键(k2)和值(v2)组合。

图7b图示了ssd取回键(k2)和值(v2)组合732,其也是组0的部分。ssd从键值数据结构702取回和读取键(k2)和值(v2)组合732,并且然后将组合732的键(k2)与命令710的键(k3)进行比较。键这次也不匹配,并且ssd取回下一个键和值组合。下一个键和值组合的位置储存为键(k2)和值(v2)组合732中的指针(例如,物理地址指针)。该指针指向键(k3)和值(v3)组合。

图7c图示了ssd取回键(k3)和值(v3)组合734,其也是组0的部分(这可以意味着它们是相同贮体的部分)。ssd从键值数据结构702取回和读取键(k3)和值(v3)组合734,并且然后将键和值组合734的键(k3)与命令710的键(k3)进行比较。键现在匹配,并且ssd将响应740提供给主机,其中该响应包括来自键和值组合734的值(v3)。

在该配置中,因为散列冲突,在相同的组(例如,相同的贮体)中存在多个键和值组合。在其他处理操作下,通过互连106将所有键和值组合发送到主机104,在ssd和主机之间创建了不必要的i/o开销。这减慢了ssd的总体性能。然而,通过仅发送匹配的键和值组合,在ssd和主机之间的i/o开销上实质上减少。尽管ssd的处理器(例如,kvs处理器)可能比主机的处理器更慢,但是通过不必发送所有键和值组合而取得的优势超过了通过使用位于ssd处的处理器可能出现的任何缺点,尤其是在数据库非常大并且在数据集中发生散列冲突的情形下。以上场景也应用于其他类型的kvs命令。

图8(其包括图8a-8b)图示了进行键值储存(kvs)命令的固态装置(ssd)的流程序列。特别地,图8图示了由ssd进行的来自主机的put命令的序列,其中put命令包括写入新的键和值组合。

如图8a所示,ssd从主机接收put命令810。put命令810指定ssd储存新的键和值组合。特别地,put命令810指定储存键(k5)和值(v5)组合834。ssd的kvs处理器800对键(k5)进行散列操作,该散列操作生成散列值820。散列值820然后用于索引结构804上,以从键值数据结构802识别的组。在该特定情形下,散列值820指向索引结构804中的识别的组1的条目。组1指向键值数据结构802中的键(k4)和值(v4)组合830。在一些实现方式中,索引结构的用于组1的条目包括指针,该指针是键(k4)和值(v4)组合830在键值数据结构802中的物理地址。该键值数据结构802储存在ssd的nvm中。键值数据结构的组可以是空的,或者包括一个或多个键值数据(例如,键和值组合)。即使索引结构804中的指针指向键(k4)和值(v4)组合830,但是指针可以认为是对键值数据结构802的组1的指针。ssd从键值数据结构802取回和读取键(k4)和值(v4)组合830,并且然后将组合830的键(k4)与命令810的键(k5)进行比较。在这种情形下,键不匹配,并且ssd从组中取回下一个键和值组合。下一个键和值组合由定位键(k4)和值(v4)组合830的指针来指定。该指针可以是下一个键和值组合的物理地址。然而,在该示例中,在组1中不存在其他键和值组合。由于在组1中不存在其他键和值组合,ssd可以将键(k5)和值(v5)组合834添加在键(k4)和值(v4)组合830之后。

图8b图示了ssd在nvm的键值数据结构802中写入键(k5)和值(v5)组合834。在写入键(k5)和值(v5)组合834之前,ssd可以为键(k5)和值(v5)组合834分配(多个)存储器区块(例如,物理地址)。ssd更新键(k4)和值(v4)组合830的指针,使得该指针指向键(k5)和值(v5)组合834的物理地址。一旦已经储存了键(k5)和值(v5)组合834,ssd可以将响应840提供给主机。响应840可以包括对已经储存在键值数据结构802中的键(k5)和值(v5)组合834的确认。在一些实现方式中,代替指针,键(k5)和值(v5)组合834可以包括一些指示符,该指示符是组中的最后的键和值组合。在一些实现方式中,如果不存在键和值组合的指针,则可以假定其是组中的最后的键和值组合。

图9(其包括图9a-9c)图示了进行键值储存(kvs)命令的固态装置(ssd)的流程序列。特别地,图9图示了由ssd进行的来自主机的put命令的序列,其中put命令包括更新键和值组合。

如图9a所示,ssd从主机接收put命令910。put命令910指定ssd储存键和值组合。特别地,put命令910指定储存键(k5)和值(v6)组合。ssd的kvs处理器900对键(k5)进行散列操作,该散列操作生成散列值920。散列值920然后用于索引结构904上,以从键值数据结构902识别的组。在该特定情形下,散列值920指向索引结构904中的识别的组1的条目。组1指向键值数据结构902中的键(k4)和值(v4)组合930。在一些实现方式中,索引结构的用于组1的条目包括指针,该指针是键(k4)和值(v4)组合930在键值数据结构902中的物理地址。该键值数据结构902储存在ssd的nvm中。键值数据结构的组可以是空的,或者包括一个或多个键值数据(例如,键和值组合)。即使索引结构904中的指针指向键(k4)和值(v4)组合930,但是指针可以认为是对键值数据结构902的组1的指针。ssd从键值数据结构902取回和读取键(k4)和值(v4)组合930,并且然后将组合930的键(k4)与命令910的键(k5)进行比较。在这种情形下,键不匹配,并且ssd在组中取回下一个键和值组合。下一个键和值组合由定位键(k4)和值(v4)组合930的指针来指定。该指针可以是组中的下一个键和值组合的物理地址。在该示例中,下一个键和值组合是键(k5)和值(v5)组合。

图9b图示了ssd取回键(k5)和值(v5)组合932(其也是组1的部分)。ssd从键值数据结构902取回和读取键(k5)和值(v5)组合932,并且然后将键和值组合932的键(k5)与命令910的键(k5)进行比较。键这次匹配,并且ssd更新键(k5)和值(v5)组合932,使得v5已经由v6替换。键(k5)和值(v6)组合934现在已经替换先前的键和值组合932。

图9c图示了ssd在nvm的键值数据结构902中写入(k5)和值(v6)组合934。键和值组合可以储存在nvm的与先前的键和值组合932不同的物理地址或者相同的物理地址中。ssd还需要更新键(k4)和值(v4)组合的指针,使得该指针指向键(k5)和值(v6)组合934的物理地址。一旦已经储存了键(k5)和值(v6)组合和/或指针已经更新,ssd可以将响应940提供给主机。响应940可以包括对已经储存在键值数据结构902中的键(k5)和值(v6)组合的确认。如果可应用,则键(k5)和值(v6)组合可以具有指引到组中的另一个键和值组合的指针。

图10(其包括图10a-10c)图示了进行键值储存(kvs)命令的固态装置(ssd)的流程序列。特别地,图10图示了由ssd进行的来自主机的delete命令的序列。

如图10a所示,ssd从主机接收delete命令1010。delete命令1010指定ssd移除键和值组合。特别地,delete命令1010指定删除键(k2)和值(v2)组合。ssd的kvs处理器1000对键(k2)进行散列操作,该散列操作生成散列值1020。散列值1020然后用于索引结构1004上,以从键值数据结构1002识别的组。在该特定情形下,散列值1020指向索引结构1004中的识别的组0的条目。组0指向键值数据结构1002中的键(k1)和值(v1)组合1030。在一些实现方式中,索引结构的用于组0的条目包括指针,该指针是键(k1)和值(v1)组合1030在键值数据结构1002中的物理地址。该键值数据结构1002储存在ssd的nvm中。键值数据结构的组可以是空的,或者包括一个或多个键值数据(例如,键和值组合)。即使索引结构1004中的指针指向键(k1)和值(v1)组合1030,但是指针可以认为是对键值数据结构1002的组0的指针。ssd从键值数据结构1002取回和读取键(k1)和值(v1)组合1030,并且然后将键和值组合1030的键(k1)与命令1010的键(k5)进行比较。在这种情形下,键不匹配,并且ssd从组中取回下一个键和值组合。下一个键和值组合由定位键(k1)和值(v1)组合1030的指针来指定。该指针可以是下一个键和值组合的物理地址。在该示例中,来自组的下一个键和值组合是键(k2)和值(v2)组合。

图10b图示了ssd取回键(k2)和值(v2)组合1032(其也是组0的部分)。ssd从键值数据结构1002取回和读取键(k2)和值(v2)组合1032,并且然后将键和值组合1032的键(k2)与命令1010的键(k2)进行比较。键这次匹配。

ssd可以做几件事情中的一个。在一个实现方式中,ssd可以更新键(k1)和值(v1)组合1030的指针,以指向键(k3)和值(v3)组合1034的物理地址,而不是指向键(k2)和值(v2)组合1032。这有效地从键值数据结构1002移除了键(k2)和值(v2)组合1032,而不实际地从nvm的物理地址中删除它。在一些实现方式中,ssd可以归还储存键(k2)和值(v2)组合1032的(多个)存储器区块(例如,物理地址),这意味着特定的(多个)存储器区块不再由键值数据结构1002使用,并且可用于储存新的数据。

图10c图示了ssd更新键和值组合1030的指针,使得其指向键和值组合1034,而不是键和值组合1032。在更新指针之后,ssd可以将响应1040提供给主机。响应1040可以包括对已经在键值数据结构1002中删除键(k2)和值(v2)组合1032的确认。在另一个实现方式中,ssd可以改写(writeover)键值数据结构1032的物理地址,以从键值数据结构1002删除键和值组合1032。在这样的实例中,ssd将仍然更新键和值组合1030的指针,以指向键和值组合1034。

由固态装置(ssd)处理键值储存(kvs)命令和非kvs命令的方法的示例性流程图

图11和12图示了由固态装置(ssd)处理键值储存(kvs)命令和非kvs命令的方法的流程图。图11和12中示出的方法可以由本公开中描述的ssd中的任一个进行,例如ssd102。另外,出于清楚的目的,图11和12中示出的方法不必要示出由ssd进行的所有操作。在一些实现方式中,图11和12中示出的方法可以包括可以由ssd进行的其他操作。在一些实现方式中,方法的顺序可以改变。

图11图示了用于处理从主机接收的一个或多个命令的方法1100的流程图。该方法1100可以由ssd(例如,104、501)进行。该方法从主机接收(在1102处)命令。命令可以由主机接口(例如,110)接收。该方法确定(在1104处)命令是否是键值储存(kvs)命令。可以由桥接器112和/或主机接口110做出该确定。该方法1100可以通过查找该命令是否包括仅可以由键值(kv)数据库使用的命令来确定该命令是否是kvs命令。在一些实现方式中,该方法可以通过查找该命令是否具体包括get命令、put命令或delete命令来确定该命令是否是kvs命令。在一些实现方式中,当命令包括get命令、put命令或delete命令时,该方法确定命令是kvs命令。

当方法确定(在1104处)命令不是kvs命令时,该方法在非易失性存储器(nvm)中继续进行对键值数据结构的特定位置的存取(在1108处)。非kvs命令的示例可以包括读取命令和/或写入命令。对键值数据结构的存取(在1108处)可以由nvm处理器进行。对键值数据结构的存取(在1108处)可以包括读取nvm的物理地址和/或在nvm的物理地址处进行写入。

当方法确定(在1104处)命令是kvs命令时,该方法在非易失性存储器(nvm)中继续进行,用索引结构进行(在1106处)键值储存(kvs)操作,以识别键值数据结构在非易失性存储器(nvm)中的特定位置。进行(在1106处)kvs操作可以包括进行一个或多个散列计算和/或散列操作,以识别一个或多个散列值,其可以对应于索引结构的条目。进行kvs操作的示例在图12中进行描述。一旦已经进行(在1106处)kvs操作,该方法在nvm处基于kvs操作、索引结构和键值数据结构存取(在1108处)键值数据结构。该方法基于存取的数据将响应提供(在1110处)给主机。图11的方法1100可以对若干命令(例如,kvs命令和/或非kvs命令)迭代进行。

图12图示了用于处理从主机接收的一个或多个kvs命令的方法1200的流程图。图12的方法1200的示例图示在图7-10中。接收的命令是包括键的kvs命令。该方法1200可以由ssd(例如,104、501)进行。该方法可以在从主机接收包括键的命令之后开始。该方法可以在方法确定所接收的命令是kvs命令之后开始。命令可以由主机接口(例如,110)接收。该方法对由ssd接收的命令中的键进行(在1202处)散列计算或散列操作。散列操作基于伴随命令(例如,kvs命令)的键计算散列值。散列操作可以将任意大小的键映射到固定大小的数据(例如,散列值)。散列操作可以包括散列功能(例如,jenkins散列功能)。散列功能可以用于将键映射到键值数据结构,在这种情况下,键可以与索引结构一起使用,以指向键值数据结构中的储存一个或多个键和数据组合的组(例如,贮体)。可能的键的数目典型地大于索引结构中的条目(例如,散列值)的数目。索引结构的每个条目(例如,散列值)将指向键值数据(例如,键和值组合)在键值数据结构中的特定位置或组(例如,贮体)。例如,每个条目可以是提供键和值组合在键值数据的特定组中的物理地址的指针。该物理地址可以表示特定组的位置,即使不是所有键和值组合都储存在该物理地址处。散列功能可能为不同的键生成相同的散列值。因此,键值数据在键值数据结构中的特定位置或组(例如,贮体)可以储存多于一个的键和值组合。注意到,尽管不同的键和值组合可以是来自键值数据结构的相同位置或相同组的键值数据的部分,但它们可以储存在储存装置的不同物理地址中。键值数据的组可以是空的,或者包括一个或多个键和值组合。

该方法基于散列操作从索引结构识别(在1204处)条目或组。每个条目或组与散列值相关联。识别的条目或组可以指向包括一个或多个键和值组合的键值数据的组。在一些实现方式中,键值数据的组可以是空的。该方法基于索引结构的识别的条目来识别(在1206处)键值数据的组,并且从来自键值数据结构的键值数据的识别的组存取(在1206处)至少一个键和值组合。一旦已经识别了键值数据的组,该方法可以处理键值数据的识别的组,这可以包括存取、取回、比较和/或储存键值数据。存取至少一个键和值组合可以包括在nvm的特定位置(例如,物理地址)处读取和/或写入数据。该方法确定(在1208处)与接收的命令相关联的键是否匹配来自从识别的组所存取的键和值组合的键。

如果键匹配,则方法继续进行,提供(在1212处)包括来自存取的键和值组合的值的响应。在一些实现方式中,提供响应可以包括在键值数据结构的特定位置处写入键和值组合。然而,如果键不匹配,则方法确定(在1210处)对于键值数据的识别的组是否存在另一个键和值组合。如果方法确定(在1210处)对于该组不存在另一个键和值组合,则方法提供(在1212处)包括错误消息和/或不匹配消息的响应。

如果方法确定(在1210处)对于键值数据的识别的组存在另一个键和值组合,则方法继续进行,确定(在1208处)与接收的命令相关联的键是否匹配来自从键值数据的识别的组所存取的其他键和值组合的另一个键。图12的方法1200可以对若干命令迭代进行。

尽管以上描述含有本发明的许多具体实施例,但这些不应当解释为对本发明范围的限制,而是作为其具体实施例的示例。因此,本发明的范围不应当由所图示的实施例来确定,而是应当由所附权利要求及其等同来确定。

如上所述的各种特征和过程可以彼此独立地使用,或者可以以各种方式组合。所有可能的组合和子组合均旨在落入本公开的范围内。此外,在一些实现方式中可以省略某些方法、事件、状态或过程框。本文所描述的方法和过程也不限于任何特定的序列,并且与其相关的框或状态可以以适当的其他序列来进行。例如,所描述的任务或事件可以以不同于具体公开的顺序进行,或者可以将多个组合在单个框或状态中。示例任务或事件可以串行地、并行地或以一些其他适当的方式进行。可以向所公开的示例实施例添加任务或事件或者从其移除任务或事件。本文所描述的示例系统和组件可以不同于所描述地进行配置。例如,与所公开的示例实施例相比,元件可以添加、移除或重新布置。

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