具体实施方式
图1描述了包括非易失性存储装置102的系统100的一个实施例。在描述的实施例中,系统100包括主机计算系统114、吞吐量管理设备122和存储装置102。主计算系统114可以是计算机,例如,服务器、笔记本电脑、台式机、移动设备或者本领域公知的其他计算设备。主机计算系统114通常包括诸如存储器、处理器、总线和本领域公知的其他部件的部件。
主机计算系统114对存储装置102中的数据进行存储,并通过通信连接与存储装置102进行数据通信。存储装置102可以位于主机计算系统114的内部,也可以位于主机计算系统114的外部。通信连接可以是总线、网络或者允许在主机计算系统114和存储装置102之间传输数据的其他连接方式。在一个实施例中,存储装置102通过PCI连接(例如,PCI express(“PCI-e”))连接到主机计算系统114。存储装置102可以是插入到主机计算系统114上的PCI-e接口的卡。
描述的实施例中的存储装置102执行数据存储操作,例如,读取、写入、擦除等。在某些实施例中,存储装置102的电源连接和通信连接是主机计算系统114和存储装置102之间的同一个物理连接的一部分。例如,存储装置102可以通过下述方式接入到电源:PCI、PCI-e、串行高级技术附件(“串行ATA”或者“SATA”)、并行ATA(“PATA”)、小型计算机系统接口(“SCSI”)、IEEE 1394(“火线(FireWire)”)、光纤信道、通用串行总线(“USB”)、PCIe-AS或者与主机计算系统114的其他连接。
存储装置102为主机计算系统114提供非易失性存储。图1示出的存储装置102为包括存储控制器104、写入数据流水线106、读取数据流水线108和非易失性的非易失性存储介质110的非易失性的非易失性存储装置102。存储装置102可以包括附加部件,为了提供存储装置102的简单视图而没有示出所述附加部件。
非易失性存储介质110对数据进行存储以使得即使当没有对存储装置102供电时仍然预留数据。在某些实施例中,非易失性存储介质110包括固态存储介质,例如,闪存、纳米随机存取存储器(“NRAM”)、磁阻RAM(“MRAM”)、动态RAM(“DRAM”)、相变RAM(“PRAM”)、赛道存储器、忆阻存储器、基于纳米线的存储器、基于硅-氧化物的亚10纳米工艺存储器、石墨烯存储器、硅-氧化物-氮化物-氧化物-硅(“SONOS”)、电阻随机存取存储器(“RRAM”)、可编程金属化单元(“PMC”)、导电桥接RAM(“CBRAM”)等。同时,在描述的实施例中,存储装置102包括非易失性存储介质110,在其他实施例中,存储装置102可以包括磁介质,例如,硬盘、磁带等,存储介质102还可以包括光学介质或者其他非易失性数据存储介质。存储装置102还可以包括对非易失性存储介质110中的数据的存储和检索进行协调的存储控制器104。存储控制器104可以使用一个或者多个索引定位和检索数据,并对存储在存储装置102中的数据执行其他操作。例如,存储控制器104可以包括清理器(grommer),其用于执行数据清理操作,例如,垃圾收集。
如所示出的,在某些实施例中,存储装置102实施了写入数据流水线106和读取数据流水线108,下面将对该例子进行更加详细地描述。当将数据从主机计算系统114传输到非易失性存储介质110时,写入数据流水线106可以对数据执行特定的操作。这些数据可以包括,例如错误校正码(ECC)的生成、加密、压缩或者其他操作。读取数据流水线108可以对正从非易失性存储介质110读出并发送到主机计算系统114的数据执行类似的和潜在的逆操作。
在一个实施例中,主机计算系统114除了存储装置102之外还包括一个或者多个其他部件,例如,附加存储装置、图形处理器、网卡等。鉴于本公开,本领域技术人员将会理解不同类型的部件可以包括在主机计算系统114中。所述部件可以位于主机计算系统114的内部或者外部。在一个实施例中,一些所述部件可以是连接到主机计算系统114并通过主机计算系统114接收功率的PCI或者PCI-e卡。
在某些实施例中,驱动器118或者可选的存储接口116是应用程序接口(“API”),并且用于将命令和其他数据转换成适于发送到存储控制器104的格式。在另一个实施例中,驱动器118包括存储控制器104的一个或者多个功能。例如,驱动器118可以包括下面描述的全部或者部分模块,并且可以包括用于存储装置106的一个或者多个索引或者映射。包含存储系统102的驱动器118、一个或者多个存储控制器104和一个或者多个存储装置106具有连接到文件系统/文件服务器的存储接口116,并且文件系统/文件服务器中的传统配置有利地推入(即,卸载)到存储系统102中。
如在本申请中使用的逻辑标识符是不同于存储数据单元的数据的物理地址的数据单元的标识符。如在本申请中使用的数据单元是逻辑地分组到一起的任意一组数据。数据单元可以是文件、对象、便宜/独立的磁盘/驱动器数据带的冗余阵列(“RAID”)的数据段、或者用于数据存储中的其他数据组。数据单元可以是可执行的代码、数据、元数据、目录、索引、可以存储到存储装置中的任何其他类型的数据、或者它们的组合。可以通过名字、逻辑地址、物理地址、地址范围或者用于标识数据单元的其他常规的标识来标识数据单元。逻辑标识符包括数据单元标识符(例如,文件名)、对象标识符、索引节点、通用唯一标识符(“UUID”)、全局唯一标识符(“GUID”)、或者其他数据单元标签,并且还可以包括逻辑块地址(“LBA”)、柱面/磁头/扇区(“CHS”)、或者其他低级别逻辑标识符。逻辑标识符一般包括可以映射到物理位置的任何逻辑标签。
在某些实施例中,存储装置106将数据以顺序的、基于日志的格式存储到非易失存储介质110中。例如,当修改数据单元时,从一个物理存储位置读出该数据单元的数据,修改所述数据,并随后将其写入到不同的物理存储位置。将数据写入到数据存储装置106的顺序和次序可以包括在非易失性存储装置102上执行的存储操作的次序的事件日志。通过遍历事件日志(和/或重放存储操作的次序),可以构建或者重建存储元数据,例如,正向索引。
在典型的随机存取装置中,逻辑标识符几乎与随机存取装置的物理地址一对一的对应。典型随机存取装置中的这种一对一的映射(不包括为坏块映射预留的随机存取装置上的少量的物理地址)还与下述关系相关,所述关系为与逻辑标识符相关的存储容量和与物理地址相关的物理容量之间的接近于一对一的关系。例如,如果逻辑标识符是逻辑块地址(“LBA”),则与LBA相关的每个逻辑块都具有固定的容量。随机存储装置上的对应的物理块通常与逻辑块的容量相同。这使得典型的文件服务器114/文件系统能够通过管理逻辑标识符(例如,LBA)管理随机存取装置上的物理容量。这种LBA到PBA映射的连续性一般依赖于文件系统,并且文件系统利用该连续性对存储在数据存储装置上的数据进行碎片整理。类似地,某些系统可以使用该连续性来定位特定物理磁道上的数据以改进性能,如被称作磁盘“短行程(short stroking)”的技术的情况。高度可预测的LBA到PBA的映射在某些应用中对于通过直接管理逻辑地址空间来间接管理物理存储空间中的数据存储来说是重要的。
然而,存储系统102可以是日志结构的文件系统,这样就没有用于确定LBA到PBA的映射的“固定的”关系或者算法,或者在另一个实施例中,存储系统102可以是随机存取,但是可以由多于一个的客户端110或者文件服务器114/文件系统访问该存储系统102,以使得分配给每个客户端110或者文件服务器114/文件系统的逻辑标识符表示的存储容量远大于典型系统的逻辑到物理标识符的一对一的关系。存储系统102还可以是精简配置的,以使得一个或者多个客户端110中的每一个具有远大于存储系统102中的存储装置106的存储容量的分配逻辑地址范围。在系统100中,存储系统102管理并分配逻辑标识符,以使得逻辑标识符和物理标识符之间没有预先定义的一对一或者接近于一对一的关系。
因为与典型的存储系统相比,系统100允许对存储容量进行更加有效的管理,所以系统100是有利的。例如,对于可以由多个客户端110访问的典型的随机存取装置来说,如果给每个客户端都分配特定容量的存储空间,那么即使占用的存储空间的实际容量非常少,存储空间通常也会存在并且不会再分配该存储空间。因为系统100降低了连接到存储装置106的标准精简配置系统的复杂度,所以系统100还是有利的。标准精简配置系统具有包括在空间逻辑地址空间中的逻辑标识符和物理存储位置之间的逻辑到逻辑的映射的精简配置层。因为消除了映射的多个层并且在最低层进行了精简配置(逻辑到物理的映射),所以系统100更加有效。
图2是示出根据本发明的非易失性存储装置102中的包括写入数据流水线106和读取数据流水线108的非易失性存储装置控制器202的一个实施例200的框图。非易失性存储控制器202可以包括多个存储控制器0-N104a-n,每一个控制非易失性存储介质110。在描述的实施例中,示出了两个非易失性控制器:非易失性控制器0 104a和存储控制器N 104n,并且每个控制器控制各自的非易失性存储介质110a-n。在描述的实施例中,存储控制器0104a控制数据信道,以使得相连的非易失性存储介质110a存储数据。存储控制器N 104n控制与存储的数据相关的索引元数据信道,并且相关的非易失性存储介质110n存储索引元数据。在可替换的实施例中,非易失性存储装置控制器202包括单个非易失性控制器104a和单个非易失性存储介质110a。在另一个实施例中,具有多个存储控制器104a-n和相关的非易失性存储介质110a-n。在一个实施例中,连接到它们的相关的非易失性存储介质110a-110n-1的一个或者多个非易失性控制器104a-104n-1控制数据,而连接到它的相关的非易失性存储介质110n的至少一个存储控制器104n控制索引元数据。
在一个实施例中,至少一个非易失性控制器104是现场可编程门阵列(“FPGA”),并且控制器的功能被编程到FPGA中。在特定的实施例中,所述FPGA是FPGA。在另一个实施例中,存储控制器104包括专门设计为存储控制器104的部件,例如,专用集成电路(“ASIC”)或者自定义逻辑方案。每个存储控制器104通常包括写入数据流水线106和读取数据流水线108,将参考图3对其做进一步的描述。在另一个实施例中,至少一个存储控制器由组合FPGA、ASIC和自定义逻辑部件构成。
非易失性存储介质110是设置在存储体(bank)214中的非易失性存储元件阵列216、218、220,并且通过双向存储输入/输出(“I/O”)总线210并行地访问所述存储元件阵列。在一个实施例中,存储I/O总线210能够在任何时间进行单向通信。例如,当数据正写入到非易失性存储介质110时,就不能从该非易失性存储介质110读取数据。在另一个实施例中,数据可以同时在两个方向流动。然而,如本文所使用的与数据总线相关的双向,其指的是数据通路,该数据通路在某个时刻仅在一个方向上可以具有数据流,但是当双向数据总线上的一个方向中的数据流停止时,数据可以在该双向数据总线上的相反方向中流动。
非易失性存储元件(例如,SSS 0.0 216a)通常被配置为电路板上的芯片(一个或者多个裸芯片的封装)或者裸芯片。如所描述的,即使这几个元件一起封装到芯片封装、堆叠芯片封装或者某些其他封装元件,非易失性存储元件(例如,216a)仍然独立操作或者半独立于其他非易失性存储元件(例如,218a)。如所描述的,将一行非易失性存储元件216a、216b、216m指定为存储体214。如所描述的,可以有“n”个存储体214a-n,并且在非易失性存储介质110中的n x m个非易失性存储元件阵列216、218、220中每个存储体有“m”个非易失性存储元件216a-m、218a-m、220a-m。当然,不同的实施例包括的n和m值可以不同。在一个实施例中,非易失性存储介质110a的每个存储体214包括20个非易失性存储元件216a-216m,并且具有8个存储体214。在一个实施例中,非易失性存储介质110a的每个存储体214包括24个非易失性存储元件216a-216m,并且具有8个存储体214。除了n x m个非易失性存储元件阵列216a-216m、218a-218m、220a-220m之外,还可以对一个或者多个附加列(P)进行寻址,并且这些附加列与一个或者多个行的其他非易失性存储元件216a、216b、216m并行操作。在一个实施例中,增加的P列存储跨越特定存储体的m个存储元件的ECC块(即,ECC代码字)部分的奇偶校验数据。在一个实施例中,每个非易失性存储元件216、218、220由单层单元(“SLC”)装置组成。在另一个实施例中,每个非易失性存储元件216、218、220由多层单元(“MLC”)组成。
在一个实施例中,将共享存储I/O总线210a上的公用线211的非易失性存储元件(例如,216b、218b、220b)封装到一起。在一个实施例中,非易失性存储元件216、218、220在每个封装中可以具有一个或多个裸芯片,其中,一个或者多个封装垂直堆叠,并且可以独立地访问每个裸芯片。在另一个实施例中,非易失性存储元件(例如,SSS 0.0 216a)在每个裸芯片中可以具有一个或者多个垂直裸芯片,并且在每个封装可以具有一个或者多个裸芯片,其中,一个或者多个封装垂直的堆叠,并且可以独立地访问每个垂直裸芯片。在另一个实施例中,非易失性存储元件SSS 0.0 216a在每个裸芯片中可以具有一个或者多个垂直裸芯片,并且在每个封装中可以具有一个或者多个裸芯片,其中,某些或者全部所述一个或者多个裸芯片垂直堆叠,并且可以独立地访问每个垂直裸芯片。
在一个实施例中,两个裸芯片垂直地堆叠,并且四个堆叠一组,以形成8个存储元件(例如,SSS 0.0-SSS 8.0)216a、218a…220a,每一个都在单独的存储体214a、214b…214n中。在另一个实施例中,24个存储元件(例如,SSS 0.0-SSS 0.24)216a、216b…216m形成逻辑存储体214a,这样8个逻辑存储体中的每一个都具有24个存储元件(例如,SSS 0.0-SSS8.24)216、218…220。将数据通过存储I/O总线210发送到非易失性存储介质110,进而到特定组的存储元件中的所有存储元件(SSS 0.0-SSS 8.0)216a、218a…220a。存储控制总线212a用于选择特定的存储体(例如,存储体0 214a),以使得将通过连接到所有存储体214的存储I/O总线210接收到的数据正好写入到选择的存储体214a。
在一个实施例中,存储I/O总线210由一个或者多个独立的I/O总线(包括210a.a-m…210n.a-m的“IIOBa-m”)构成,其中,每列中的非易失性存储元件共享一个并行连接到每个非易失性存储元件216、218、220的独立的I/O总线。例如,存储I/O总线210a的一个独立的I/O总线210a.a可以物理地连接到每个存储体214a-n中的第一个非易失性存储元件216a、218a、220a。存储I/O总线210b的第二个独立的I/O总线210a.b可以物理地连接到每个存储体214a-n的第二非易失性存储元件216b、218b、220b。可以同时和/或并行地访问存储体214a中的每个非易失性存储元件216a、216b、216m(如图2中示出的一行非易失性存储元件)。在一个实施例中,其中非易失性存储元件216、218、220包括堆叠封装的裸芯片,特定堆叠中的所有封装都物理连接到同一个独立的I/O总线。如本文所使用的,“同时”还包括接近同时地访问,其中在稍微不同的时间间隔访问装置以避免切换噪声。在该上下文中使用的“同时”不同于依次地单独发送命令和/或数据的顺序或者顺次的访问。
通常,使用存储控制总线212独立地选择存储体214a-n。在一个实施例中,使用芯片使能或者芯片选择来选择存储体214。在芯片选择和芯片使能都可用的情况下,存储控制总线212可以选择一堆封装内的一个封装。在其他实施例中,存储控制总线212使用其他命令选择一堆封装内的一个封装。还可以通过在存储I/O总线210和存储控制总线212上传输的地址信息和控制信号的组合选择非易失性存储元件216、218、220。
在一个实施例中,每个非易失性存储元件216、218、220都被划分成擦除块,并且每个擦除快都被划分成页面。可以将非易失性存储元件216、218、220上的擦除块称作物理擦除块或者“PEB”。典型的页面的大小为2048个字节(“2kB”)。在一个例子中,非易失性存储元件(例如,SSS 0.0)包括两个寄存器并且可以将其编程为两个页面,这样具有两个寄存器的非易失性存储元件216、218、220就具有4kB的容量。由20个非易失性存储元件216a、216b、216m组成的存储体214则将具有80kB的页面容量,可以通过存储I/O总线210的独立的I/O总线输出的同样的地址访问所述页面。
可以将非易失性存储元件216a、216b、…216m组成的存储体214中的该组80kB的页面称作逻辑页面或者虚拟页面。类似地,可以将存储体214a的每个存储元件216a、216b、…216m的擦除块分组以形成逻辑擦除块(也可以将其称作虚拟擦除块)。在一个实施例中,当在非易失性存储元件内接收擦除命令时,擦除非易失性存储元件内的页面的擦除块。而随着技术的发展,期望非易失性存储元件216、218、220内的擦除块、页面、内存片或者其他逻辑和物理分区的尺寸和数量随着时间而改变,期望很多实施例与新的配置一致是可能的,并且期望很多实施例与本文的一般描述一致。
通常,当将包写入到非易失性存储元件216内的特定位置时,在存储I/O总线210上发送物理地址,并且所述物理地址后面跟着的是所述包,其中,想要将所述包写入到特定存储体的特定存储元件的特定物理擦除块所特有的特定页面内的位置。物理地址包括了非易失性存储元件216将包指引到页面内的指定位置所用到的足够的信息。因为存储元件列(例如,SSS 0.0-SSS N.0 216a、218a、……220a)中的所有存储元件都连接到存储I/O总线接口210a的同一个独立的I/O总线(例如,210a.a),以到达合适的页面并避免将包写入到存储元件列(例如,SSS 0.0-SSS N.0 216a、218a、……220a)中的分配有类似的地址的页面,通过存储控制总线212a选择包括具有要写入包的正确页面的非易失性存储元件SSS 0.0 216a的存储体214a,并且不选择非易失性存储介质110a中的其他存储体214b…214n。
类似地,满足存储I/O总线210上的读取命令需要存储控制总线212上的信号来选择单个存储体214a和该存储体214a内的合适的页面。在一个实施例中,读取命令读取整个页面,并且因为在存储体214a中有多个并行的非易失性存储元件216a、216b、…216m,所以利用读取命令读取的是整个逻辑页面。然而,如下文将要解释的与存储体交错(bankinterleave)有关的内容,可将读取命令分解成多个子命令。类似地,在写入操作中可以将整个逻辑页面写入到存储体214a的非易失性存储元件216a、216b、…216m中。
可以在存储I/O总线210上发送用于对擦除块进行擦除的擦除块擦除命令,所述存储I/O总线210具有用于擦除特定擦除块的特定擦除块地址。通常,存储控制器104a可以通过存储I/O总线210的并行通道(独立的I/O总线210a-n.a-m)发送用于擦除逻辑擦除块的擦除块擦除命令,每个所述并行通道具有用于擦除特定擦除块的特定擦除块地址。同时,通过存储控制总线212选择特定存储体(例如,存储体0 214a),以防止擦除没有选择的存储体(例如,存储体1-N 214b-n)中的具有类似地址的擦除块。可选地,通过存储控制总线212选择不特定的存储体(例如,存储体0 214a)(或者选择所有的存储体),以能够擦除并行的所有存储体(存储体1-N214b-n)中具有类似地址的擦除块。可以使用存储I/O总线210和存储控制总线212的组合将其他命令发送到特定位置。本领域技术人员将会意识到使用双向存储I/O总线210和存储控制总线212选择特定存储位置的其他方式。
在一个实施例中,包被顺序地写入到非易失性存储介质110。例如,存储控制器104a发送包到存储元件216的存储体214a的存储写入缓冲器,并且当缓冲器充满的时候,就将包写入到指定的逻辑页。存储控制器104a随后将存储写入缓冲器再次充满包,并且当缓冲器充满的时候,将包写入到下一个逻辑页。下一个逻辑页可能位于同一个存储体214a中,或者位于另一个存储体(例如,214b)中。继续该进程,一个逻辑页面接着一个逻辑页面,通常直到逻辑擦除块充满为止。在另一个实施例中,随着该进程的继续,流可以连续穿过逻辑擦除块的边界,从一个逻辑擦除块到另一个逻辑擦除块。
在读取、修改、写入操作中,与请求数据相关的包在读取操作中被定位并读取。已经修改过的修改的请求数据的数据段不会写入到读取它们的位置。相反,将修改的数据段再次转换成包,并将其顺序地写入到当前正在写入的逻辑页面中的下一个可用的位置。修改各个包的索引项,以使其指向包括修改的数据段的包。与相同的还未修改的请求数据相关的包的索引中的一个或者多个项将包括指向未修改的包的原始位置的指针。因此,如果保存了原始的请求数据,例如,保存请求数据的以前的版本,那么原始请求数据在索引中就将具有指向作为原始写入的所有包的指针。新请求的数据将在索引中具有指向某些包的指针和指向当前正写入的逻辑页面中的修改的包的指针。
在复制操作中,索引包括用于映射到存储在非易失性存储介质110中的多个包的原始请求数据的项。当执行了复制操作时,产生请求数据的新副本,并且在将请求数据的新副本映射到原始包的索引中产生新项。请求数据的新副本也写入到非易失性存储介质110,其中,它的位置映射到索引中的新项。请求包的新副本可用于标识原始请求数据内的包,其中,在已经改变了原始请求数据,而原始数据还没有传送到请求数据的副本并且索引丢失或者损坏的情况下,参考所述原始请求数据内的包。
有利的是,顺序地写入包有助于更均匀地使用非易失性存储介质110并且允许固态存储装置控制器202监测非易失性存储介质110中的存储热点和各种逻辑页面的使用等级。顺序地写入包还有助于强大的、高效的垃圾收集系统,下面将对其进行详细描述。本领域技术人员将会意识到顺序存储包的其他益处。
在各种实施例中,非易失性存储装置控制器202还包括数据总线204、局部总线206、缓冲控制器208、缓冲器0-N 22a-n、主控制器224、直接存储存取(“DMA”)控制器226、存储器控制器228、动态存储器阵列230、静态随机存储器阵列232、管理控制器234、管理总线236、到系统总线240的桥接器238、以及其他逻辑电路242,下面将对其进行描述。在其他实施例中,系统总线240耦合到一个或者多个网络接口卡(“NIC”)244(一些网络接口卡可以包括远程DMA(“RDMA”)控制器246)、一个或者多个中央处理单元(“CPU”)248、一个或者多个外部存储控制器250和相关联的外部存储器阵列252、一个或多个存储控制器254、对等控制器256和专用处理器258,下面将对其进行描述。连接到系统总线240的部件244-258可以位于主机计算系统114或者其他装置中。
通常,存储控制器104通过存储I/O总线210将数据传输到非易失性存储介质110。在非易失性存储器设置在存储体214中并且每个存储体214包括可以并行访问的多个存储元件216a、216b、216m的典型的实施例中,存储I/O总线210是总线阵列,用于每列存储元件216、218、220的一个存储I/O总线横跨存储体214。如本文所使用的,术语“存储I/O总线”可以指一个存储I/O总线210或者独立的数据总线阵列,其中,所述阵列的单个数据总线独立地彼此之间传输不同的数据。在一个实施例中,访问一列存储元件(例如,216a、218a、220a)的每个存储I/O总线210可以包括用于在一列存储元件216a、218a、220a中访问的存储分区(例如,擦除块)的逻辑到物理的映射。如果第一存储区域失败、部分失败、无法访问或者具有某些其他问题,则该映射(或者坏块重映射)允许映射到存储分区的物理地址的逻辑地址重新映射到不同的存储分区。
还可以通过系统总线240、桥接器238、局部总线206、缓冲器222并最终通过数据总线204将数据从请求装置155传输到存储控制器104。数据总线204通常连接到由缓冲控制器208控制的一个或者多个缓冲器222a-n。缓冲控制器208通常控制数据从局部总线206传输到缓冲器222,以及通过数据总线204传输到流水线输入缓冲器306和输出缓冲器330。缓冲控制器208通常控制如何可以将从请求装置传送来的数据临时存储到缓冲器222中并随后传送到数据总线204上,或者反之亦然,以考虑到不同的时钟域、防止数据冲突等。缓冲控制器208通常与主控制器224联合操作以协调数据流。当数据到达时,数据将先到达系统总线240,再通过桥接器238传输到局部总线206。
通常,如主控制器224和缓冲控制器208所指示的,数据从局部总线206传输到一个或者多个数据缓冲器222。数据随后从缓冲器222流出进入到数据总线204,通过非易失性控制器104,并到达非易失性存储介质110,例如,NAND闪存或者其他存储介质。在一个实施例中,使用一个或者多个数据信道传输数据和与数据一起到达的相关的带外元数据(“元数据”),所述一个或者多个数据信道包括一个或者多个存储控制器104a-104n-1和相关的非易失性存储介质110a-110n-1,同时至少一个信道(存储控制器104n,非易失性存储介质110n)专用于带内元数据,例如,索引信息和在非易失性存储装置102内部产生的其他元数据。
局部总线206通常是双向总线或者一组总线,其允许在非易失性存储装置控制器202内部的装置之间以及非易失性存储装置102内部的装置和连接到系统总线240的装置244-258之间传输数据或者命令。桥接器238有助于局部总线206和系统总线240之间的通信。本领域技术人员将会意识到其他实施例,例如,环形结构或者切换星形配置以及桥接器23和总线240、206、204、210的功能元件。
系统总线240通常是主机计算系统114的总线,或者是安装或连接非易失性存储装置102的其他装置的总线。在一个实施例中,系统总线240可以是PCI-e总线、串行高级技术附件(“串行ATA”)总线、并行ATA等。在另一个实施例中,系统总线240是外部总线,例如,小型计算机系统接口(“SCSI”)、火线、光纤信道、USB、PCIe-AS等。可以将非易失性存储装置102封装,以内部地安装到装置或者作为外部连接的装置。
非易失性存储装置控制器202包括控制非易失性存储装置102内的较高级别的功能的主控制器224。在各种实施例中,主控制器224通过解析对象请求和其他请求控制数据流,指示创建索引以将与数据相关的对象标识符映射到相关数据、协调DMA请求等的物理位置。本文描述的很多功能全部或者部分由主控制器224控制。
在一个实施例中,主控制器224使用嵌入式控制器。在其他实施例中,主控制器224使用局部存储器,例如,动态存储器阵列230(动态随机存取存储器“DRAM”)、静态存储器阵列232(静态随机存取存储器“SRAM”)等。在一个实施例中,使用主控制器224控制局部存储器。在另一个实施例中,主控制器224通过存储器控制器228访问局部存储器。在另一个实施例中,主控制器224运行Linux服务器并且可以支持各种常用的服务器接口,例如,万维网、超文本标记语言(“HTML”)等。在另一个实施例中,主控制器224使用纳米处理器(nano-processor)。可以使用可编程的或者标准逻辑或者上文列出的控制器类型的任何组合来构造主控制器224。本领域技术人员将会意识到主控制器224的很多实施例。
在一个实施例中,存储装置/非易失性存储装置控制器202管理多个数据存储装置/非易失性存储介质110a-n,主控制器224划分内部控制器(例如,存储控制器104a-n)之间的工作负载。例如,主控制器224可以划分要写入到数据存储装置(例如,非易失性存储介质110a-n)的对象,以使得对象的一部分存储到每个连接的数据存储装置。该特征是允许快速存储和访问对象的增强的性能。在一个实施例中,使用FPGA实现主控制器224。在另一个实施例中,可以通过管理总线236、通过网络连接到NIC 244的系统总线240、或者连接到系统总线240的其他装置,来更新主控制器224内的固件。
在一个实施例中,管理对象的主控制器224对块存储进行仿真,以便主机计算系统114或者连接到存储装置/非易失性存储装置102的其他装置将所述存储装置/非易失性存储装置102视作块存储装置,并将数据发送到所述存储装置/非易失性存储装置102中的特定物理地址。主控制器224随后对块进行划分,并存储将作为对象的数据块。主控制器224随后将块和与块一起发送的物理地址映射到由主控制器224确定的实际位置。所述映射存储到对象索引中。通常,对于块仿真来说,在计算机(例如,主机计算系统114或者希望将存储装置/非易失性存储装置102用作块存储装置的其他装置)的驱动器中配备有块装置应用程序接口(“API”)。
在另一个实施例中,主控制器224与NIC控制器244和嵌入式RDMA控制器246协调工作,以实时地发送数据和命令集的RDMA传输。NIC控制器244可以隐藏在不透明的端口后面以便能够使用自定义的驱动器。此外,主机计算系统114上的驱动器可以通过I/O存储驱动器访问计算机网络116,所述I/O存储驱动器使用标准堆栈API并且与NIC 244相结合地操作。
在一个实施例中,主机控制器224也是独立驱动(“RAID”)控制器的冗余阵列。在数据存储装置/非易失性存储装置102与一个或者多个其他数据存储装置/非易失性存储装置102网络连接的情况下,主控制器224可以是用于单级RAID、多级RAID、渐进式RAID等的RAID控制器。主控制器224还允许将一些对象存储到RAID阵列中,并且不用RAID存储其他对象。在另一个实施例中,主控制器224可以是分布式RAID控制器元件。在另一个实施例中,主控制器224可以包括多个RAID、分布式RAID以及如本文其他地方所描述的其他功能元件。在一个实施例中,主控制器224控制数据在RAID类结构中的存储,其中,奇偶校验信息存储在逻辑页面的一个或者多个存储元件216、218、220中,所述奇偶校验信息对存储在同一个逻辑页面的其他存储元件216、218、220中的数据进行保护。
在一个实施例中,主控制器224与单个或者冗余网络管理器(例如,开关)协同工作,以建立路由、平衡带宽利用率、失效备援(failover)等。在另一个实施例中,主控制器224与集成专用逻辑(通过局部总线206)和相关的驱动器软件协同工作。在另一个实施例中,主控制器224与连接的专用处理器258或者逻辑(通过外部系统总线240)和相关的驱动器软件协同工作。在另一个实施例中,主控制器224与远程专用逻辑(通过计算机网络116)和相关的驱动器软件协同工作。在另一个实施例中,主控制器224与局部总线206或者连接到硬盘驱动器(“HDD”)存储控制器的外部总线协同工作。
在一个实施例中,主控制器224与一个或者多个存储控制器254通信,其中,存储装置/非易失性存储装置102可以作为通过SCSI总线、因特网SCSI(“iSCSI”)、光纤信道等连接的存储装置。同时,存储装置/非易失性存储装置102可以自主地管理对象,并且可以作为对象文件系统或者分布式对象文件系统出现。还可以由对等控制器256和/或专用处理器258访问主控制器224。
在另一个实施例中,主控制器224与自主集成管理控制器协同工作,以定期验证FPGA码和/或控制器软件、在运行(复位)时验证FPGA码和/或在上电(复位)期间验证控制器软件、支持外部复位请求、支持由于看门狗超时而发出的复位请求、支持电压、电流、功率、温度和其他环境度量的测量以及阈值中断的设置。在另一个实施例中,主控制器224管理垃圾的收集以释放擦除块,从而再次利用释放的擦除块。在另一个实施例中,主控制器224管理损耗均衡。在另一个实施例中,主控制器224允许将数据存储装置/非易失性存储装置102划分成多个逻辑装置,并且允许基于分区的介质加密。在另一个实施例中,主控制器224支持具有先进的、多位ECC校正的存储控制器104。本领域技术人员将意识到存储控制器202中或者更具体地在非易失性存储装置102中的主控制器224的其他特征和功能。
在一个实施例中,非易失性存储装置控制器202包括存储器控制器228,其控制动态随机存储器阵列230和/或静态随机存储器阵列232。如上所述,存储器控制器228可以是独立的或者与主控制器224集成。存储器控制器228通常控制某些类型的易失性存储器,例如,DRAM(动态随机存储器阵列230)和SRAM(静态随机存储器阵列232)。在其他例子中,存储器控制器228还控制其他存储器类型,例如,电可擦除可编程只读存储器(“EEPROM”)等。在其他实施例中,存储器控制器228控制两种或者更多种存储器类型,并且存储器控制器228可以包括多于一个的控制器。通常,存储器控制器228控制尽可能多的SRAM 232,SRAM 232可用并且由DRAM 230补充该SRAM 232。
在一个实施例中,对象索引存储在存储器230、232中,并且随后将所述对象索引定期卸载到非易失性存储介质110n或者其他非易失性存储器的通道中。本领域技术人员将会意识到存储器控制器228、动态存储器阵列230和静态存储器阵列232的其他使用和配置。
在一个实施例中,非易失性存储装置控制器202包括DMA控制器226,其控制存储装置/非易失性存储装置102和一个或者多个外部存储控制器250以及相关的外部存储器阵列252和CPU248之间的DMA操作。需要指出的是,将外部存储控制器250和外部存储器阵列252称作外部的,原因在于它们位于存储装置/非易失性存储装置102的外部。另外,DMA控制器226还可以通过NIC 244和相关的RDMA控制器246对利用请求装置进行的RDMA操作进行控制。
在一个实施例中,非易失性存储装置控制器202包括连接到管理总线236的管理控制器234。通常,管理控制器234对环境指标和存储装置/非易失性存储装置102的状态进行管理。管理控制器234可以监控管理总线236上的装置温度、风扇速度、电源设置等。管理控制器234可以支持对FPGA码存储和控制器软件的可擦除可编程只读存储器(“EEPROM”)的读取和编程。通常,管理总线236连接到存储装置/非易失性存储装置102的各种部件。管理控制器234可以在局部总线206上传输报警和中断等,或者可以包括到系统总线240或者其他总线的单独的连接。在一个实施例中,管理总线236是内置集成电路(“I2C”)总线。本领域技术人员将会意识到通过管理总线236连接到存储装置/非易失性存储装置102的部件的管理控制器234的其他功能和应用。
在一个实施例中,非易失性存储装置控制器202包括可以为特定应用自定义的其他逻辑电路242。通常,在非易失性装置控制器202或者主控制器224被配置为使用FPGA或者其他可配置的控制器的情况下,基于特定应用、客户的要求、存储要求等可以将自定义的逻辑电路包括在其中。
图3是示出根据本发明的非易失性存储装置102中的存储控制器104的一个实施例300的示意性框图,所述存储控制器104具有写入数据流水线106、读取数据流水线108和吞吐量管理设备122。实施例300包括数据总线204、局部总线206和缓冲器控制器208,这些器件与相对于图2的非易失性存储装置控制器202描述的那些器件基本上类似。写入数据流水线106包括打包器302和错误校正码(“ECC”)生成器304。在其他实施例中,写入数据流水线106包括输入缓冲器306、写入同步缓冲器308、写入程序模块310、压缩模块312、加密模块314、垃圾收集器旁路(其中的一部分位于读取数据流水线108内)、介质加密模块318和写入缓冲器320。读取数据流水线108包括读取同步缓冲器328、ECC校正模块322、解包器324、校准模块326和输出缓冲器330。在其他实施例中,读取数据流水线108可以包括介质解密模块332、一部分垃圾收集器旁路316、解密模块334、解压缩模块336和读取程序模块338。存储控制器104还可以包括控制和状态寄存器340和控制队列342、存储体交错控制器344、同步缓冲器346、存储总线控制器348和多路复用器(“MUX”)350。下面描述非易失性控制器104和相关的写入数据流水线106和读取数据流水线108的部件。在其他实施例中,可以使用同步非易失性存储介质110,并且可以去除同步缓冲器308、328。
写入数据流水线106包括打包器302,其直接或者间接地通过另一个写入数据流水线106阶段接收要写入到非易失性存储器中的数据段或者元数据段,并生成适合非易失性存储介质110的尺寸的一个或者多个包。数据段或者元数据段通常是数据结构(例如,对象)的一部分,但是也可以包括整个数据结构。在另一个实施例中,数据段是数据块的一部分,但是也可以包括整个数据块。通常,从计算机(例如,主机计算系统114,或者其他计算机或装置)接收一组数据(例如,数据结构),并且在传送到非易失性存储装置102的数据段中将所述一组数据传送到所述非易失性存储装置102。数据段还可以以其他名称为大家所熟知,例如,包,但是如本文所引用的数据段包括全部或者一部分数据结构或者数据块。
每个数据结构被存储为一个或者多个包。每个数据结构可以具有一个或者多个容器包。每个包都包括包头。包头可以包括头类型字段。类型字段可以包括数据、属性、元数据、数据段定界符(在有多个包的情况下)、数据结构、数据链接等。包头还可以包括关于包的大小的信息,例如,包括在包中的数据的字节数。可以通过包的类型确定包的长度。包头可以包括确定包和数据结构之间的关系的信息。可能的例子是使用数据包包头中的偏移量标识数据段在数据结构内的位置。本领域技术人员将会意识到可以包括在由打包器302添加到数据的包头中的其他信息以及可以添加到数据包中的其他信息。
每个包都包括包头并且可能包括来自数据段或者元数据段的数据。每个包的包头包括将包和包所属的数据结构联系起来的相关信息。例如,包头可以包括对象标识符或者其他数据结构标识符以及指示形成数据包的数据段、对象、数据结构或者数据块的偏移量。包头还可以包括存储总线控制器348使用的用于存储包的逻辑地址。包头还可以包括关于包的大小的信息,例如,包括在包中的字节数。包头还可以包括序列号,当重建数据段或者数据结构时,所述序列号标识数据段相对于数据结构内的其他包所属的位置。包头可以包括包头类型字段。类型字段可以包括数据、数据结构属性、元数据、数据段定界符(在有多个包的情况下)、数据结构类型、数据结构链接等。本领域技术人员将会意识到可以包括在由打包器302添加到数据或元数据的包头中的其他信息以及可以添加到包中的其他信息。
写入数据流水线106包括为从打包器302接收到的一个或者多个包生成一个或者多个错误校正码(“ECC”)的ECC生成器304。ECC生成器304通常使用错误校正算法生成与一个或者多个数据包一起存储的ECC检查位。ECC生成器304生成的ECC码和与ECC码相关的一个或者多个数据一起包括ECC块。与一个或者多个包一起存储的ECC数据用于检测并校正通过传输和存储引入到数据中的错误。在一个实施例中,包作为长度N的未编码块传输到ECC生成器304。计算、追加长度S的全部特征,并将其作为长度N+S的编码块输出。N和S的值依赖于ECC算法的特征,选择所述ECC算法的特征以实现特定性能、效率和鲁棒度量。在一个实施例中,ECC块和包之间没有固定的关系,包可以包括多于一个的ECC块;ECC块可以包括多于一个的包;并且第一包可以在ECC块内的任何地方结束,第二包可以在同一个ECC块内的第一包结束之后开始。在一个实施例中,并不动态地修改ECC算法。在一个实施例中,与数据包一起存储的ECC数据足够鲁棒,从而可以校正多于2比特的错误。
有利的是,使用允许多于单个比特校正或者甚至双比特校正的鲁棒ECC算法允许延长非易失性存储介质110的寿命。例如,如果闪存用作非易失性存储介质110中的存储介质,该闪存就可以在每次擦除循环不会出错的情况下被写入大概100,000次。使用鲁棒ECC算法可以扩展这种使用限制。在非易失性存储装置102上设有ECC生成器304和对应的ECC校正模块322的情况下,与如果使用鲁棒性较弱的ECC算法(例如,单比特校正)相比,非易失性存储装置102能够进行内部错误校正并且具有更长的使用寿命。然而,在其他实施例中,ECC生成器可以使用鲁棒性较弱的算法并且可以校正单比特或者双比特错误。在另一个实施例中,为了增加容量,非易失性存储装置110可以包括不太可靠的存储器,例如,多级单元(“MLC”)闪存,其中,由于没有更加鲁棒的ECC算法,该存储器可能不是十分的可靠。
在一个实施例中,写入流水线106包括输入缓冲器306,所述输入缓冲器306接收要写入到非易失性存储介质110的数据段并且存储到输入数据段,直到写入数据流水线106的下一个阶段,例如,打包器302(或者更加复杂的写入数据流水线106的其他阶段)准备处理下一个数据段。输入缓冲器306通常允许速率之间的差异,通过写入数据管线106使用合适容量的数据缓冲器接收和处理数据段。为了提高数据总线204的工作效率,输入缓冲器306还允许数据总线204以高于写入数据流水线106可以承受的速率向写入数据流水线106传输数据。通常,当写入数据流水线106不包括输入缓冲器306的时候,则在其他地方实现缓冲功能,例如,在非易失性存储装置102中但在写入数据流水线106之外、在主机计算系统114中(例如,在网络接口卡(“NIC”)内)、或者在其他装置中(例如,当使用远程直接存储器存取(“RDMA”)时)。
在另一个实施例中,写入数据流水线106还包括写入同步缓冲器308,其在将包写入到非易失性存储介质110之前,将从ECC生成器304接收到的包进行缓存。写入同步缓冲器308位于局部时钟域和非易失性存储时钟域之间的边界,并且考虑到时钟域的差别而提供缓存。在其他实施例中,可以使用同步非易失性存储介质110,并且可以去除同步缓冲器308、328。
在一个实施例中,写入数据流水线106还包括介质加密模块318,其直接或者间接地从从打包器302接收一个或者多个包,并且在将包发送到ECC生成器304之前,使用对于非易失性存储装置102唯一的加密密钥对一个或者多个包进行加密。通常,对包括包头在内的整个包进行加密。在另一个实施例中,不加密包头。在本文中,将加密密钥理解为是指由存储控制器104在外部管理的秘密加密密钥。
介质加密模块318和对应的介质解密模块332为存储在非易失性存储介质110中的数据提供安全级别。例如,在利用介质加密模块318进行加密数据的情况下,如果非易失性存储介质110连接到不同的存储控制器104、非易失性存储装置102或者服务器,在不使用在将数据写入到非易失性存储介质110期间使用的同样的解密密钥的情况下,不付出特别大的努力,通常就不能读取非易失性存储介质110的内容。
在典型的实施例中,非易失性存储介质102不将加密密钥存储到非易失性存储器中,并且不允许外部访问加密密钥。在初始化期间将加密密钥提供给存储控制器104。非易失性存储装置102可以使用并存储与加密密钥一起使用的非机密的加密随机数。每个包可以与不同的随机数一起存储。为了提高加密算法的保护,可以在具有唯一随机数的多个包之间分割数据段。
可以从主机计算系统114、服务器、密钥管理者或者管理由存储控制器104使用的加密密钥的其他装置接收加密密钥。在另一个实施例中,非易失性存储介质110可以具有两个或者更多个分区,并且存储控制器104表现的好像它是两个或者更多个存储控制器104,每个存储控制器工作于非易失性存储介质110内的单个分区。在该实施例中,每个分区可以使用唯一的介质加密密钥。
在另一个实施例中,写入数据流水线106还包括加密模块314,其对直接或者间接地从输入缓冲器306接收到的数据段或者元数据段进行加密,其中,在将数据段发送到打包器302之前,使用与数据段一起接收到的加密密钥对数据段进行加密。加密模块314使用的用于加密数据的加密密钥可以不是非易失性存储装置102内存储的所有数据所公有的,而是可以如下文所述的,在每个数据结构的基础上不同并且在接收数据段时一起接收。例如,可以将加密模块314要加密的数据段的加密密钥与数据段一起接收,或者可以将加密密钥作为用于写入数据段所属的数据结构的命令的一部分来接收。固态存储装置102可以使用并存储每个数据结构包中的与加密密钥结合使用的非机密的加密随机数。每个包可以与不同的随机数一起存储。为了提高加密算法的保护,可以在具有唯一随机数的多个包之间分割数据段。
可以从主机计算系统114、另一个计算机、密钥管理者或者保存用于加密数据段的加密密钥的其他装置接收加密密钥。在一个实施例中,将加密密钥从非易失性存储装置102、主机计算系统114、计算机或者其他外部代理中的一个传输到存储控制器104,其中,所述其他外部代理具有执行工业标准方法以安全地传输和保护私钥和公钥的能力。
在一个实施例中,加密模块314利用与包一起接收到的第一加密密钥加密第一包,并且利用与第二包一起接收到的第二加密密钥加密第二包。在另一个实施例中,加密模块314利用与包一起接收到的第一加密密钥加密第一包,并且在不加密的情况下直接将第二数据包传送到下一个阶段。有利的是,包括在非易失性存储装置102的写入数据流水线106中的加密模块314允许一个数据结构接着一个数据结构或者一个数据段接着一个数据段的进行数据加密而无需单个文件系统或者其他外部系统,以保持跟踪用于存储相应的数据结构或者数据段的不同的加密密钥。每个请求装置155或者相关的密钥管理者都独立地管理用于只加密由请求装置155发送的数据结构或者数据段的加密密钥。
在一个实施例中,加密模块314可以使用对于非易失性存储装置102唯一的加密密钥加密一个或者多个包。加密模块314可以独立地执行该介质加密,或者执行除了以上描述的加密之外的其他加密。通常,对包括包头在内的整个包进行加密。在另一个实施例中,不加密包头。加密模块314执行的介质加密为存储在非易失性存储介质110中的数据提供安全级别。例如,在利用对于特定非易失性存储装置102唯一的介质加密密钥加密数据的情况下,如果非易失性存储介质110连接到不同的存储控制器104、非易失性存储装置102或者主机计算系统114,在不使用在将数据写入到非易失性存储介质110期间使用的同样的解密密钥的情况下,不付出特别大的努力,通常就不能读取非易失性存储介质110的内容。
在另一个实施例中,写入数据流水线106包括压缩模块312,其在将数据段发送到打包器302之前,压缩元数据段的数据。压缩模块312通常使用本领域技术人员公知的压缩程序压缩数据段或者元数据段,以减少数据段或者元数据段占用的存储容量。例如,如果数据段包括512个“0”字符串,压缩模块312就可以使用代表512个“0”的代码或者标志代替该52个“0”,其中,与512个“0”占用的空间相比,代码更紧凑。
在一个实施例中,压缩模块312使用第一压缩程序压缩第一数据段,并且不压缩的情况下传递第二数据段。在另一个实施例中,压缩模块312利用第一压缩程序压缩第一数据段,并且利用第二压缩程序压缩第二数据段。在非易失性存储装置102内具有这种灵活性是有利的,这样计算机系统114或者将数据写入到非易失性存储装置102的其他装置中的每一个可以指定压缩程序,或者一个可以指定压缩程序,而另一个可以指定不进行压缩。还可以根据基于每个数据结构类型或者数据结构类别的默认设置,进行压缩程序的选择。例如,特定数据结构的第一数据结构可以能不使用默认的压缩程序设置,而相同数据结构类别和相同数据结构类型的第二数据结构可以使用默认压缩程序,并且相同数据结构类别和相同数据结构类型的第三数据结构可以使用不压缩。
在一个实施例中,写入数据流水线106包括垃圾收集旁路316,其作为垃圾收集系统中的数据旁路的一部分从读取数据流水线108接收数据段。垃圾收集系统(也称作“清理器”或者清理操作)通常对不再有效的包进行标记,这通常是因为该包被标记为删除,或者已经被修改并且修改的数据存储在不同的位置。在某些情况下,垃圾收集系统确定可以恢复存储器的特定扇区(例如,擦除块)。该确定可能是由于缺少可用的存储容量、标记为无效的数据的百分比达到阈值、有效数据的合并、存储器的扇区的错误检测率达到阈值、或者基于数据分布改善性能等。垃圾收集算法可以考虑多种因素以确定何时恢复存储器的扇区。
一旦存储器的扇区被标记为恢复,通常就必须重新定位该扇区中的有效包。垃圾收集器旁路316允许将数据读取到读取数据流水线108中,并随后将其直接传输到写入数据流水线106而无需将其移出到存储控制器104外。在一个实施例中,垃圾收集器旁路316是工作在非易失性存储装置102内的自主垃圾收集器系统的一部分。这允许非易失性存储装置102管理数据,以便数据在整个非易失性存储介质110中系统的传播,以提高性能、数据可靠性,并避免非易失性存储介质110中的任何一个位置或区域的过度使用和使用不足,并延长非易失性存储介质110的使用寿命。
垃圾收集器旁路316对数据段插入到写入数据流水线106和计算系统114或者其他装置写入其他数据段进行协调。在描述的实施例中,数据收集旁路316在写入数据流水线106中的打包器302之前并在读取数据流水线108中的解包器314之后,但是也可以位于所述读取数据流水线108和写入数据流水线106中的任何位置。在通过大量使用写入流水线108填充逻辑页面的剩余部分期间,可以使用垃圾收集旁路316,以提高非易失性存储介质110内的存储效率,从而减少垃圾收集的频率。
清理可以包括更新存储在非易失性存储介质110上的数据。存储在非易失性存储介质110上的数据可能随着时间的推移而退化。存储控制器104可以包括清理器,其标识非易失性存储装置102上的“陈旧”数据(在预定的时间内没有修改和/或移动的数据),并且通过将数据重新写入到不同的存储位置来更新陈旧的数据。
在某些实施例中,可以暂时禁用垃圾收集系统、清理器和/或垃圾收集旁路316,以允许将数据连续地存储到非易失性存储装置102的物理存储位置上。禁用垃圾收集系统和/或旁路316可以保证写入数据流水线106中的数据不与其他数据交错。
在某些实施例中,可以在非易失性存储装置的物理存储空间的特定部分限制垃圾收集和/或清理器。例如,存储元数据(例如,下面描述的反向索引)可以周期性地预留在非易失性存储位置。可以限制垃圾收集和/或清理以在与预留的存储元数据对应的非易失性存储介质的部分上操作。
在一个实施例中,写入数据流水线106包括为了高效的写入操作而缓存数据的写入缓冲器320。通常,写入缓冲器320包括足够用于包的容量,以在非易失性存储介质110中填充至少一个逻辑页面。这允许写入操作在不受到干扰的情况下将数据的整个逻辑页面发送到非易失性存储介质110。通过将写入数据流水线106的写入缓冲器320和读取数据缓冲器108内的缓冲器的容量设为相同,或者大于非易失性存储介质110内的存储写入缓冲器的容量,写入和读取数据会更加有效,这是因为通过编制单个写入命令就可以将数据的整个逻辑页面发送到非易失性存储介质110,而不需要编制多个命令。
当正在填充写入缓冲器320时,非易失性存储介质110可以用于其他读取操作。这是有利的,因为当数据写入到存储写入缓冲器和流入到存储写入缓冲器的数据停滞时,具有较小写入缓冲器或者没有写入缓冲器的其他非易失性装置可以占用非易失性存储。读取操作会被阻止,直到充满并且编程了整个存储写入缓冲器。用于没有写入缓冲器或者具有小型写入缓冲器的系统的另一种方法是清洗没有充满的存储写入缓冲器,以便能够进行读取。另一方面,这是低效的,因为填充页面要求多个写入/编程周期。
对于描述的具有容量大于逻辑页面的写入缓冲器320的实施例来说,包括多个子命令的单个写入命令可以然后被单个程序命令跟随,以将来自每个非易失性存储元件216、218、220中的存储写入缓冲器的数据的页面传送到每个非易失性存储元件216、218、220内的指定页面。该技术具有消除对部分页面编程的优点,众所周知,对部分页面编程降低了数据的可靠性和持久性,并且当缓冲器充满时释放用于读取和其他命令的目标存储体。
在一个实施例中,写入缓冲器320是乒乓缓冲器,其中,缓冲器的一侧充满并且随后指定为在合适的时间传输,而乒乓缓冲器的另一侧正在被填充。在另一个实施例中,写入缓冲器320包括容量大于数据段的逻辑页面的先入先出(“FIFO”)寄存器。本领域技术人员将会意识到其他写入缓冲器310配置,其在将数据写入到非易失性存储介质110之前,允许存储数据的逻辑页面。
在另一个实施例中,写入缓冲器320的容量小于逻辑页面,以便小于页面的信息可以写入到非易失性存储介质110中的存储写入缓冲器中。在该实施例中,为了防止写入数据流水线106中的停滞不保持读取操作,使用垃圾收集系统对数据进行排序,作为垃圾收集过程的一部分,需要将垃圾收集系统从一个位置移动到另一个位置。在写入数据流水线106中的数据停滞的情况下,可以通过垃圾收集旁路316将数据馈送到写入缓冲器320并随后馈送到非易失性存储介质110中的存储写入缓冲器,以在对数据进行编程之前,填充逻辑页面的页面。通过这种方式,写入数据流水线106中的数据停滞将不会停滞从非易失性存储装置102的读取。
在另一个实施例中,写入数据流水线106包括写入程序模块310,其具有在写入数据流水线106内的一个或者多个用户自定义的功能。写入程序模块310允许用户自定义写入数据流水线106。用户可以基于特定的数据要求或者应用自定义写入数据流水线106。当存储控制器104是FPGA时,用户可以使用自定义的命令和功能相对容易地对写入数据流水线106进行编程。用户还可以使用写入程序模块310将自定义的功能包括在ASIC中,然而,自定义ASIC比FPGA可能难的多。写入程序模块310可以包括缓冲器和旁路机构,以允许在写入程序模块310中对第一数据段执行操作,同时可以使第二数据段继续通过写入数据流水线106。在另一个实施例中,写入程序模块310可以包括能够通过软件编程的处理器核。
需要指出的是,写入程序模块310显示为位于输入缓冲器306和压缩模块312之间,然而,写入程序模块310可以位于写入数据流水线106的任何地方,并且可以分布于各个阶段302-320之间。另外,可能会有分布于各个阶段302-320之间的、独立编程和操作的多个写入程序模块310。另外,可以改变阶段302-320的顺序。本领域技术人员将会意识到,可以基于特定的用户需求可行地改变阶段302-320的顺序。
读取数据流水线108包括ECC校正模块322,其通过使用与请求包的每个ECC块一起存储的ECC,确定从非易失性存储介质110接收到的请求包的ECC块中是否存在数据错误。如果存在任何错误并且可以使用ECC对所述错误进行校正,ECC校正模块322就随后校正请求包中的任何错误。例如,如果ECC能够检测到6个比特发生错误,但是只能校正3个比特的错误,ECC校正模块322就校正至多3个比特发生错误的请求包的ECC块。ECC校正模块322通过将发生错误的比特改变为正确的比特或者0状态来校正发生错误的比特,以便请求包与当将其写入到非易失性存储介质110时的包相同,并且为包生成ECC。
如果ECC校正模块322确定请求包包括比ECC能够校正的更多的发生错误的比特,ECC校正模块322就不能校正请求包的损坏的ECC块中的错误,并且发送中断。在一个实施例中,ECC校正模块322发送具有指示请求包发生错误的消息的中断。该消息可以包括ECC校正模块322不能校正错误的信息或者可以暗示ECC校正模块322不能校正错误。在另一个实施例中,ECC校正模块322利用中断和/或消息发送请求包的损坏的ECC块。
在一个实施例中,主控制器224读取ECC校正模块322不能校正的请求包的损坏的ECC块或者部分损坏的ECC块,其被校正并返回到ECC校正模块322,以便由读取数据流水线108作进一步的处理。在一个实施例中,将请求包的损坏的ECC块或者部分损坏的ECC块发送到请求数据的装置。请求装置155可以校正所述ECC块或者使用另一个副本(例如,备份或者镜像副本)代替所述数据,并且随后可以使用请求数据包的代替数据或者将其返回到读取数据流水线108。请求装置155可以使用发生错误的请求包中的包头信息识别需要替换损坏的请求包或者替换包所属的数据结构的数据。在另一个实施例中,存储控制器104使用某些类型的RAID存储数据并且能够恢复损坏的数据。在另一个实施例中,ECC校正模块322发送中断和/或消息,并且接收装置放弃与请求数据包相关的读取操作。本领域技术人员将会意识到,作为ECC校正模块322确定请求包的一个或者多个ECC块损坏并且ECC校正模块322不能校正所述错误的结果,可以采取其他选项和动作。
读取数据流水线108包括解包器324,其直接或者间接地从ECC校正模块322接收请求包的ECC块,并且检查并去除一个或者多个包包头。解包器324可以通过检查包头内的包标识符、数据长度、数据位置等,验证包包头。在一个实施例中,包头包括可用于验证传送到读取数据流水线108的包是请求包的哈希码。解包器324还从由打包器302添加的请求包去除包头。解包器324可以不对特定的包执行操作,只是不加修改就向前传送这些包。可能的例子是,在索引重建要求包头信息的重建过程期间请求容器标签。另外的例子包括指定在非易失性存储装置102内使用的各种类型的包的传输。在另一个实施例中,解包器324的操作可以依赖于包的类型。
读取数据流水线108包括校准模块326,其从解包器324接收数据并去除不需要的数据。在一个实施例中,发送到非易失性存储介质110的读取命令获得包。请求数据的装置可能不需要获得的包中的所有数据,并且校准模块326去除不需要的数据。如果获得的页面内的数据是请求的数据,对准模块326就不去除任何数据。
校准模块326在将数据发送到下一个阶段之前,将数据重新格式化为与请求数据段的装置格式兼容的数据结构的数据段。通常,当由读取数据流水线108对数据进行处理时,数据段或者包的大小在各个阶段会发生变化。对准模块326使用接收到的数据以将数据格式化成适合发送到请求装置155并且结合起来形成响应的数据段。例如,来自一部分第一数据包的数据可以与来自一部分第二数据包的数据相结合。如果数据段大于请求装置155请求的数据,校准模块326就可以放弃不需要的数据。
在一个实施例中,读取数据流水线108包括读取同步缓冲器328,其在读取数据流水线108进行处理之前,缓存从非易失性存储介质110接收到的一个或者多个请求包。读取同步缓冲器328位于非易失性存储时钟域和局部总线时钟域之间的边界,并且考虑到时钟域的差别而提供缓存。
在另一个实施例中,读取数据流水线108包括输出缓冲器330,其从校准模块326接收请求包并且在将接收到的包传输到请求装置155之前存储所述包。输出缓冲器330考虑到了何时从读取数据流水线108的阶段接收数据段和何时将数据段传输到存储控制器104的其他部分或者请求装置155之间的时间差。输出缓冲器330还允许数据总线204以高于读取数据流水线108能够承受的速率从读取数据流水线108接收数据,以提高数据总线204的工作效率。
在一个实施例中,读取数据流水线108包括介质加密模块332,其从ECC校正模块322接收一个或者多个加密的请求包,并且在将所述一个或者多个请求包发送到解包器324之前,利用对于非易失性存储装置102唯一的加密密钥对所述一个或者多个请求包进行解密。通常,介质解密模块332解密数据所使用的加密密钥与介质加密模块318使用的加密密钥相同。在另一个实施例中,非易失性存储介质110可以具有两个或者更多个分区,并且存储控制器104表现的好像它是两个或者更多个存储控制器104,每个存储控制器工作于非易失性存储介质110内的单个分区。在该实施例中,每个分区可以使用唯一的介质加密密钥。
在另一个实施例中,读取数据流水线108包括解密模块334,其在将解包器324格式化的数据段发送到输出缓冲器330之前,加密所述数据段。可以使用与读取请求一起接收到的加密密钥解密数据段,所述读取请求启动对从读取同步缓冲器328接收到的请求包的获取。解密模块334可以使用与读取第一包的读取请求一起接收到的加密密钥解密第一包,并且随后可以使用不同的加密密钥解密第二包,或者不加解密就把第二包发送到读取数据流水线108的下一个阶段。当使用没有加密的加密随机数存储包时,结合使用随机数和加密密钥解密数据包。可以从主机计算系统114、客户端、密钥管理者或者管理存储控制器104使用的加密密钥的其他装置接收加密密钥。
在另一个实施例中,读取数据流水线108包括对由解包器324格式化的数据段进行解压缩的解压缩模块336。在一个实施例中,解压缩模块336使用存储在包包头和容器标签中的一个或者二者中的压缩信息选择补充程序,压缩模块312使用所述补充程序压缩数据。在另一个实施例中,由请求正被解压缩的数据段的装置指定解压缩模块336使用的解压缩程序。在另一个实施例中,解压缩模块336根据基于每个数据结构类型或者数据结构类别的默认设置,选择加压缩程序。第一对象的第一包可以能不使用默认的解压缩程序,而相同数据结构类别或者相同数据结构类型的第二数据结构的第二包可以使用默认的解压缩程序,并且相同数据结构类别或者相同数据结构类型的第三数据结构可以使用不解压缩。
在另一个实施例中,读取数据流水线108包括读取程序模块338,其包括读取数据流水线108内的一个或者多个用户自定义的功能。读取程序模块338具有和写入程序模块310类似的特征并且允许用户向读取数据流水线108提供自定义的功能。读取程序模块338可以位于如图3所示的位置,也可以位于读取数据流水线108内的其他位置,或者可以包括在读取数据流水线108内的多个位置处的多个部分。另外,可以有位于读取流水线108内的多个位置的、独立工作的多个读取程序模块338。本领域技术人员将会意识到读取数据流水线108内的其他形式的读取程序模块338。和写入数据流水线106一样,可以重新设置读取数据流水线108的阶段,并且本领域技术人员将会意识到读取数据流水线108内的其他顺序的阶段。
存储控制器104包括控制和状态寄存器340和相应的控制队列342。控制和状态寄存器340和控制队列342有助于对命令和子命令进行控制和排序,所述命令和子命令与在写入数据流水线106和读取数据流水线108中处理的数据相关。例如,打包器302中的数据段可以具有在与ECC生成器304相关的控制队列342中的一个或者多个相应的控制命令或者指令。当对数据段进行打包时,可以在打包器302内执行某些指令或者命令。当将从数据段产生的、新形成的数据包传送到下一个阶段时,可以通过控制和状态寄存器340将其他命令或者指令传送到下一个控制队列342。
可以同时将命令或者指令加载到用于正传送到写入数据流水线106的包的控制队列342,当流水线阶段对各个包执行时,每个流水线阶段取出适当的命令或者指令。类似地,可以同时将命令或者指令加载到用于读取数据流水线108正请求的包的控制队列342,当流水线阶段对各个包执行时,每个流水线阶段取出适当的命令或者指令。本领域技术人员将会意识到控制和状态寄存器340和控制队列342的其他特征和功能。
存储控制器104和/或非易失性存储装置102还可以包括存储体交错控制器344、同步缓冲器346、存储总线控制器348和多路复用器(“MUX”)350。
在某些实施例中,虚拟存储层提供便于存储客户端执行持久存储操作的界面。虚拟存储层可以简化存储客户的数据存储操作并且表现出加强的存储特征,例如,可分性、食物支持、恢复等。图4描述了包括虚拟存储层(VSL)430的系统400的一个实施例,所述虚拟存储层(VSL)将非易失性存储装置402的逻辑地址空间呈现给在计算装置401上运行的存储客户端应用程序412。计算装置401可以包括处理器、非易失性存储、存储器、人机交互(HMI)部件、通信接口(用于通过网络420进行的通信)等。
非易失性存储装置402可以包括单个非易失性存储装置、可以包括多个非易失性存储装置、存储器群组或者其他合适的配置。虚拟存储层430可以驱动程序、用户空间应用程序等。在某些实施例中,结合上述的驱动程序118实现虚拟存储层430。虚拟存储层430和/或存储客户端412可以体现为存储在非易失性存储装置上的指令。
VSL 430可以保持逻辑地址空间,并且通过VSL 430(VSL接口436)提供的一个或者多个接口和/或API将所述逻辑地址空间呈现给存储客户端412。存储客户端412可以包括但不限于:操作系统、虚拟操作系统(例如,客户机操作系统、管理程序等)、文件系统、数据库应用程序、服务器应用程序、通用应用程序等。在某些实施例中,运行在远程计算装置450上的一个或者多个存储客户端452通过网络420访问VSL 430。
VSL 430被配置为在可以包括如上所述的非易失性存储装置的非易失性存储装置402上执行持久存储操作。VSL 430通过通信总线421与非易失性存储装置402通信,所述通信总线421包括但不限于:PCE-e总线、网络连接(例如,无线带宽(Infiniband))、存储网络、光纤信道协议(FCP)网络、HyperSCSI等。可以根据非易失性存储装置402的容量和/或配置来配置存储操作。例如,如果非易失性存储装置402包括一次性写入、块可擦除的装置,VSL430就可以被配置为相应的地执行存储操作(例如,在初始化的或者擦除的存储位置等上的存储数据)。
在某些实施例中,VSL 430访问存储元数据434,以保持逻辑地址空间432中的逻辑标识符(例如,块)和非易失性存储装置402上的物理存储位置之间的联系。如本文所使用的,物理存储位置可以指非易失性存储装置402的任何存储位置,其可以包括但不限于:存储分区、擦除块、存储单元、页面、逻辑页面、逻辑擦除块等。
VSL 430保持逻辑地址空间432中的逻辑标识符和非易失性存储装置402上的物理存储位置之间的“任意到任意”的分配。VSL 430可以导致数据被写入或者更新到非易失性存储装置402上的“非原址”(“out-of-place”)。在某些实施例中,顺序的并且以基于日志的格式存储数据。将数据存储到“非原址”提供了损耗均衡的好处,并且体现了很多非易失性存储装置的“一次性擦除和编程”的性能。此外,非原址写入(以及将数据写入到逻辑存储位置而不是单个页面)体现了非易失性存储装置402的非对称特性。非对称特性是指不同的存储操作(读取、写入、擦除)占用的时间量不同的概念。例如,将数据编程到非易失性存储介质410占用的时间长至是从固态存储元件介质410读取数据所占用的时间的10倍。此外,在某些情况下,只能将数据编程到首先经过初始化处理(例如,擦除)的物理存储位置。擦除操作占用的时间长至编程操作占用的时间的10倍(并且比读取操作所占用的时间要延长100倍)。逻辑地址空间432中的逻辑标识符和非易失性存储装置402上的物理存储位置之间的关系保存在存储元数据434中。
在某些实施例中,VSL 430使得数据以顺序的、基于日志的格式保存到非易失性存储器402上。顺序的、基于日志的存储可以包括持续在非易失性存储装置402上执行的存储操作的顺序。在某些实施例中,数据与持久性元数据一起存储,所述持久性元数据和数据本身一起保存到非易失性存储装置402上。例如,可以使用存储在非易失性存储装置402和/或非易失性存储装置402的当前存储位置(例如,下面讨论的附加点)的序列标识符来保持存储操作执行的顺序。
以顺序的、基于日志的格式持久数据可以包括将元数据持久在描述所述数据的非易失性存储装置402上。持久性元数据可以与数据本身一起存储(例如,同样的程序和/或存储操作和/或在非易失性存储装置402支持的最小写入单元中);从而可以保证持久性元数据和它描述的数据一起存储。在某些实施例中,数据以容器格式(例如,包、ECC码字等)存储。持久性元数据可以作为数据的包格式的一部分(例如,作为包头、包尾或者包内的其他字段)包括在其中。可选地或者另外地,部分持久性元数据可以和它描述的数据分开存储。在这种情况下,持久性元数据可以链接到(或者参考)它描述的数据(反之亦然)。
持久性元数据描述数据并且可以包括但不限于:数据的逻辑标识符(或者其他标识符)、安全或者访问控制参数、序列信息(例如,序列标识符)、持久性元数据标志(例如,指示包括在原子量级存储操作中)、事务标识符等。持久性元数据可以包括重建存储元数据434的某些部分和/或重放在非易失性存储装置402上执行的存储操作的顺序。
按照本文描述的顺序的、基于日志的格式存储的数据可以包括在非易失性存储装置402上执行的存储操作的“事件日志”。因此,VSL 430通过访问以与事件日志的顺序相匹配的特定顺序存储在非易失性存储介质410上的数据,可以能重放在非易失性存储装置402上执行的存储操作的顺序。当发生无效的断开(或者其他故障情况)时,顺序的、基于日志的数据格式使VSL 430能够重建存储元数据434和其他数据。下述专利文献描述了用于尽管在非法关闭的情况下仍然能够进行故障修复和/或保证数据完整性的设备、系统和方法的例子:2010年12月17日申请的、名称为“APPARATUS,SYSTEM,AND METHOD FOR PERSISTENTMANAGEMENT OF DATAIN ACACHE DAVICE”的美国临时专利申请No.61/424,585和2010年12月20日申请的、题为“APPARATUS,SYSTEM,AND METHOD FOR PERSISTENT MANAGEMENT OFDATA IN A CACHE DAVICE”的美国临时专利申请No.61/425,167,通过引用的方式将其作为整体合并于本文中。在某些实施例中,非易失性存储装置402包括辅助电源407(例如,电池、电容器等),在发生了非法关闭的情况下,所述辅助电源407为存储控制器404和/或非易失性存储介质410供电。非易失性存储装置402(或者控制器404)从而可以包括“保护域”或者“断电安全域”(由辅助电源407定义)。一旦在非易失性存储装置的保护域将数据传输到所述非易失性存储装置,便可以保证数据持久存储到非易失性存储介质410。可选地或者另外地,存储控制器404可以能执行独立于主机计算装置401的存储操作。
VSL 430实现的顺序的、基于日志的存储格式为存储在非易失性存储器402上的数据和存储元数据434提供故障修复和/或保证数据的完整性。在非法关闭和重建操作之后,VSL 430可以使重建的存储元数据434暴露于存储客户端412。存储客户端412从而可以将故障修复和数据的完整性委托给VSL 430,这样可以显著地简化存储客户端412和/或允许存储客户端412更有效的工作。例如,文件系统存储客户端412可以要求对它的某些元数据(例如,I节点表、文件分配表等)执行故障修复和/或数据完整性业务。存储客户端412可能不得不实现这些业务本身,这可能显著的增加存储客户端412的负担和/或复杂性。存储客户端412可以通过将故障修复和/或数据的完整性委托给VSL 430来解除这种负担。如上所述,VSL 430以顺序的、基于日志的格式存储数据。这样,在发生无效关闭的情况下,VSL 430能够重建存储元数据434,和/或通过使用非易失性存储装置402上的顺序的、基于日志格式的数据识别数据的“当前”版本。VSL 430提供通过VSL接口436对重建的存储元数据434和/或数据的访问。因此,在非法关闭之后,文件系统存储客户端412可以访问故障修复后的文件系统元数据和/或可以保证通过VSL 430访问的文件数据的完整性。
逻辑地址空间432可以是“稀疏的”,这表示逻辑地址空间432足够大,大到分配的/指定的逻辑标识符是不连续的并且被一个或者多个未分配的/未指定的地址的部分分开,这样,包括的逻辑容量就可以超过非易失性存储装置402的物理存储容量。因此,可以独立于非易失性存储装置402定义逻辑地址空间432;逻辑地址空间432可以提供比非易失性存储装置402的物理存储容量更大的地址空间,与非易失性存储装置402提供的存储位置分区和块大小相比,可以提供不同的存储位置分区和/或块大小,等等。逻辑地址空间432和非易失性存储器402之间的联系由VSL 430管理(使用存储元数据434)。存储客户端412可以利用VSL接口436,而不是特定非易失性存储装置402提供的更加有限的块存储层和/或其他存储接口。
在某些实施例中,逻辑地址空间432可以非常大,其包括64比特的逻辑标识符(LID)标注的64比特的地址空间。逻辑地址空间432(例如,64比特的地址)中的每个64比特的逻辑标识符标注各个虚拟存储位置。如本文所使用的,虚拟存储位置是指逻辑存储容量块(例如,分配块)。VSL 430可以被配置为实现任意容量的虚拟存储位置;典型的容量范围是从512到4086字节(或者基于存储客户端412的需求,甚至从8kb到16kb);然而,本公开并不限于此。由于逻辑地址空间432(和其中的虚拟存储位置)独立于非易失性存储装置402的物理存储空间和/或存储分区,所以逻辑地址空间432可以适合存储客户端412的要求。
VSL 430可以使用存储元数据434管理逻辑地址空间内的分配。在某些实施例中,VSL 430保持存储元数据434,所述存储元数据434使用正向索引跟踪逻辑地址空间432的分配。VSL 430可以分配逻辑地址空间432内的存储范围,以供特定存储客户端412使用。逻辑标识符可以分配给特定存储客户端412以持久存储实体。如本文所使用的,存储实体是指能够对于非易失性存储装置402持久的逻辑地址空间412中的任何数据或者数据结构;因此,存储实体可以包括但不限于:文件系统对象(例如,文件、流、I节点等)、数据库基元(例如,数据库表格、盘区等)、流、持久性存储空间、存储器映射文件等。存储器实体还可以指虚拟存储单元(VSU)。文件系统对象是指文件系统使用的任何数据结构,所述数据结构包括但不限于:文件、数据流、文件属性、文件索引、卷索引、节点表等。
如上所述,分配逻辑标识符是指为特定用户或者存储客户端预留逻辑标识符。逻辑标识符可以指一组或者一系列逻辑地址空间432(例如,一组或者一系列虚拟存储位置)。可以通过逻辑地址空间432的虚拟存储位置的大小确定分配的逻辑标识符的逻辑容量。如上所述,逻辑地址空间432可以被配置为提供任何预定大小的虚拟存储位置。可以通过一个或者多个存储客户端412、VSL 430等配置虚拟存储位置的大小。
然而,除非需要,分配的逻辑标识符可以不必与非易失性存储装置402上的物理存储位置相关,和/或可以不必将分配的逻辑标识符指定给所述物理存储位置。在某些实施例中,VSL 430所分配的逻辑标识符包括了逻辑地址空间432中的大的、连续的范围。通过VSL430提供的大逻辑地址空间(例如,64比特地址的空间)实现逻辑地址空间中的大的、连续的范围的可行性。例如,VSL 430可以将分配给文件的逻辑标识符与用于文件的数据的逻辑地址空间432中的地址范围为2^32的连续虚拟存储位置相关。如果每个虚拟存储位置(例如,分配块)是512个字节,则分配的逻辑标识符可以表示2兆兆字节的逻辑容量。非易失性存储装置402的物理存储容量可以小于2兆兆字节和/或可以仅足够存储少量的这种文件,这样如果逻辑标识符分配导致物理存储空间的等效分配,VSL 430就将很快消耗光非易失性存储装置402的容量。然而,有利的是,VSL 430被配置为分配逻辑地址空间432内的大的、连续的范围,并且延迟将非易失性存储装置402上的物理存储位置分配给逻辑标识符,直到需要的时候才进行分配。类似地,VSL 430可以支持使用“稀疏”分配的逻辑范围。例如,存储客户端412可以请求第一数据段持久保存在分配的逻辑标识符的“包头”和第二数据段持久保存在分配的逻辑标识符“尾部”。VSL 430可以仅分配非易失性存储装置402上的、需要持久保存第一和第二数据段的那些物理存储位置。对于不用于持久保存数据的分配的逻辑标识符,VSL 430可以不为该逻辑标识符分配或者预留在非易失性存储装置402上的物理存储位置。
VSL 430保持存储元数据,以跟踪逻辑地址空间中的分配并且跟踪逻辑地址空间432中的逻辑标识符和非易失性存储介质410上的物理存储位置之间的分配。在某些实施例中,VSL 430使用单个元数据结构跟踪逻辑分配和物理存储位置的分配。可选地或者另外地,VSL 430可以被配置为使用独立的物理预留元数据跟踪逻辑分配元数据中的逻辑分配并且跟踪非易失性存储介质410上的物理存储位置的分配。
存储客户端412可以通过VSL接口436访问VSL 430。在某些实施例中,存储客户端412可以将特定功能委托给VSL。例如,如上所述,存储客户端412可以利用VSL 430的顺序的、基于日志的数据格式来将故障修复和/或数据完整性功能委托给VSL 430。在一些实施例中,存储客户端可以将逻辑地址空间432和/或物理存储预留委托给VSL 430。
通常,存储客户端412(例如,文件系统)跟踪可用的逻辑地址和/或物理存储位置。可以将存储客户端412可用的逻辑存储位置限制到底层非易失性存储装置的物理存储容量(或者其中的分区)。因此,存储客户端412可以保持“反映”非易失性存储装置的物理存储位置的一组逻辑地址。例如,如图4所示,存储客户端412可以为新文件识别一个或者多个可用的逻辑块地址(LBA)。因为在传统的实现中LBA可以直接映射到物理存储位置,所以LBA不太可能是连续的;连续LBA的可用性可以依赖于底层块存储装置的容量和/或该文件是否是“碎片”。存储客户端412随后执行块级操作,以特别是通过块存储层(例如,块除冰接口)存储文件。如果底层存储装置提供逻辑块地址和物理存储位置之间一对一的映射,则和传统存储装置一样,块存储层执行适当的LBA到物理地址的转换并且执行请求的存储操作。然而,如果底层非易失性存储装置不支持一对一的映射(例如,底层存储装置是顺序的或者写入不合适位置的装置,例如,根据本公开实施例的非易失性存储装置),则需要另一组冗余的转换(例如,闪存转换层或者其他映射)。该组冗余的转换和对存储客户端412保持逻辑地址分配的要求可以表示给存储客户端412执行的存储操作的繁重的负担,并且可以使得不进行费时的“碎片整理”操作就很难或者不可能分配连续的LBA范围。
在某些实施例中,存储客户端412将分配功能委托给VSL 430。存储客户端412可以访问VSL接口436以请求逻辑地址空间432中的逻辑范围。VSL 430使用存储元数据434跟踪逻辑地址空间432的分配状态。如果VSL 430确定请求的逻辑地址范围还没有被分配,VSL430就为存储客户端412分配请求的逻辑地址范围。如果请求的范围已经被分配(或者只有部分范围还没有被分配),VSL 430就可以返回逻辑地址空间432中的替换的范围和/或可以返回失败信息。在某些实施例中,VSL 430可以返回逻辑地址空间432中的替换的范围,该替换的范围包括连续范围的逻辑地址。具有连续范围的逻辑地址通常简化了存储实体关于逻辑地址范围的管理。由于VSL 430使用存储元数据保持逻辑地址空间432和非易失性存储装置402上的物理存储位置之间的关系,所以不需要一组冗余的地址转换。此外,VSL 430使用存储元数据434识别未分配的逻辑标识符,这使存储客户端412摆脱了这种负担。
在某些实施例中,VSL 430如上所述的在逻辑地址空间432内进行分配。VSL 430可以访问包括分配的逻辑地址范围的索引(例如,图5的正向索引)以识别未分配的逻辑标识符,在接收到请求时将所述未分配的逻辑标识符分配给存储客户端412。例如,VSL 430可以如上所述的保持包括范围编码(range-coded)的树型数据结构的存储元数据434;树中的条目可以表示逻辑地址空间432中的分配的逻辑标识符,并且树中的“孔”表示没有分配的逻辑标识符。可选地或者另外地,VSL 430保持可以分配给存储客户端的未分配的逻辑标识符的索引(例如,不需要搜索正向索引)。
图5描述了存储元数据,特别是正向索引的一个例子,所述正向索引504保持一个或者多个非易失性存储装置(例如,上文描述的存储装置106)的逻辑地址空间的分配。正向索引504可以被进一步地配置为保持分配的逻辑标识符和非易失性存储装置上的物理存储位置之间的分配。可以由VSL 430、存储控制器(例如,上文描述的存储控制器404)和/或驱动器(例如,上文描述的驱动器118)等保持正向索引504。
在图5的例子中,数据结构504实现为范围编码的B树(B-tree)。然而本公开并不限于此;可以使用合适的数据结构实现正向索引504,所述数据结构包括但不限于:树、B树、范围编码的B树、基数树、映射、内容可寻址映射(CAM)、表、哈希表或者其他合适的数据结构(或者数据结构的组合)。
正向索引504包括多个条目505(条目505A-G),每个条目代表逻辑地址空间中的一个或者多个逻辑标识符。例如,条目505B引用逻辑标识符515(LID 072-083)。数据可以顺序地或者“在不合适位置”存储到非易失性存储装置上,这样,就可能没有逻辑标识符和物理存储位置之间的对应关系。正向索引504保持分配的逻辑标识符和物理存储位置之间的分配(例如,使用物理存储位置参考517)。例如,参考517B将逻辑标识符515(LID 072-083)分配给非易失性存储装置的一个或者多个物理存储位置。在某些实施例中,参考517包括非易失性存储装置上的物理地址。可选地或者另外地,参考517可以对应于第二数据结构(例如,反向索引)等。可以响应于数据的物理存储位置的改变(例如,由于清理操作、数据更新、修改、覆盖等)而更新参考517。
在某些实施例中,一个或者多个条目505可以表示已经分配给存储客户端但是还没有分配给任何特定物理存储位置的逻辑标识符(例如,存储客户端还没有使数据写入到逻辑标识符)。可以将未分配的条目的505的物理存储位置参考517标记为“空”或者没有分配。
通过边界507将条目505被安排到树数据结构中。在某些实施例中,通过逻辑标识符对条目505进行索引,这提供了对条目505的快速有效的查找。在图5的例子中,按照逻辑标记符的顺序安排条目505,这样,条目505C就引用“最低的”逻辑标识符而505G引用“最高的”逻辑标识符。通过遍历正向索引504的边界507访问特定条目505。在某些实施例中,将正向索引504均衡,以便所有叶条目505在树内都具有相似的深度。
为了清楚起见,图5示例性地描述了包括多个逻辑标识符的条目505,然而,本公开并不限于此,并且本领域技术人员将会意识到,条目505可以包括任何合适的逻辑标识符表示,包括但不限于:字母-数字字符、十六进制字符、二进制值、文本标识符、哈希码等。
索引504的条目505可以引入可变大小和/或长度的逻辑标识符;单个条目51205可以引入多个逻辑标识符(例如,一组逻辑标识符、逻辑标识符范围、不连续的一组逻辑标识符等)。例如,条目505B表示连续范围的逻辑标识符072-083。索引504的其他条目可以表示一组不连续的逻辑标识符;条目505G表示逻辑标识符454-477和535-598,通过各个参考517G和527G为各个逻辑标识符分配各自的物理存储位置。正向索引504可以使用任何合适的技术表示逻辑标识符;例如,条目505D引入逻辑标识符178和对应于逻辑标识符范围178-192的长度15。
在某些实施例中,条目504包括和/或参考元数据519,所述元数据519可以包括关于逻辑标识符的元数据,例如:年限、大小、逻辑标识符属性(例如,客户端标识符、数据标识符、文件名、组标识符)、底层物理存储位置等。可以通过逻辑标识符(通过与各个条目505相关的逻辑标识符)对元数据519进行索引,这样,无论数据的底层物理存储位置的位置如何变化,元数据519仍然可以保持与条目505的联系。
索引504可以用于有效地确定非易失性存储装置是否包括特定的逻辑标识符。在一个例子中,存储客户端可以请求分配特定的逻辑标识符。如果索引504包括条目505,所述条目505包括请求的逻辑标识符,则认为与请求相关的该逻辑标识符可以被识别为已经分配。如果逻辑标识符没有在索引中,则可以通过在索引504中创建新条目505来将所述逻辑标识符分配给请求者。在另一个例子中,存储客户端请求特定逻辑标识符的数据。通过访问条目505的代表物理存储位置的参考517,可以确定数据的物理存储位置,其中,所述条目505包括逻辑标识符。在另一个例子中,客户端修改关于逻辑标识符的数据。在另一个例子中,存储客户端修改特定逻辑标识符的现有数据。修改后的数据被顺序地写入到非易失性存储装置上的新的物理存储位置,并且更新索引504中的条目505的物理存储位置参考517以引入新数据的物理存储位置。可以将过期的数据标记为要在清理操作中进行回收的无效数据。
图5的正向索引保持逻辑地址空间,这样,就通过逻辑标识符对逻辑地址空间进行索引。如上所述,索引504中的条目505可以包括代表非易失性存储装置上的物理存储位置的参考517。在某些实施例中,参考517可以包括物理存储位置的物理地址(或者地址范围)。可选地或者另外地,参考517可以是间接的(例如,引入第二数据结构,如反向索引)。
图6描述了用于保持关于非易失性存储装置的物理存储位置的元数据的反向索引622的一个例子。在图6的例子中,反向索引622实现为表格数据结构。然而,本公开并不限于此,而是可以使用任何合适的数据结构实现反向索引622。例如,在某些实施例中,利用上文描述的正向索引504在相同的数据结构中实现反向索引622(例如,将反向索引622的部分和/或条目可以作为正向索引504的叶条目包括在内)。索引622包括多个条目620(描述为表格数据结构622中的行),每个条目可以包括条目ID 624、物理地址626、与存储在物理非易失性存储介质410上的物理地址626的数据相关的数据长度628(在这种情况下,数据是压缩数据)、有效标签630、与数据相关的逻辑地址632、与逻辑地址632相关的数据长度634、以及其他杂项数据636。在另一个实施例中,反向索引622可以包括指示物理地址626是否存储脏数据或者干净数据等的指示符。
可以根据特定非易失性存储装置的配置和/或布置组织反向索引622。因此,可以通过存储分区(例如,擦除块)、物理存储位置(例如,页面)、逻辑存储位置等来布置反向索引622。在图6的例子中,将反向索引622布置成多个擦除块(640、638和642),每个擦除块包括多个物理存储位置(例如,页面、逻辑页面等)。
条目620包括关于物理存储位置的元数据,所述物理存储位置包括图5的条目505F的数据。条目620指示物理存储位置位于擦除块n 638内。擦除块n 638之前是擦除块n-1640,之后是擦除块n+1 642(没有示出擦除块n-1和n+1的内容)。
条目ID 624可以是地址、虚拟链接、或者将反向索引622中的条目与正向索引504中的条目相关联的其他数据(或者其他存储元数据)。物理地址626指示非易失性存储装置(例如,非易失性存储介质410)上的物理地址。与物理地址626相关的数据长度628标识存储在物理地址626的数据的长度。可以将物理地址626和数据长度628一起称作目标参数644。
可以将逻辑标识符632和数据长度634称作源参数646。利用逻辑地址空间的逻辑标识符将逻辑标识符632与条目相关联。逻辑标识符632可用于将反向索引622的条目与正向索引504的条目505相关联。数据长度624是指逻辑地址空间中的数据长度(例如,从存储客户端的角度来看)。特别是由于数据压缩、包头开销、加密开销等,源参数646数据长度634可以与源参数644数据长度634不同。在图6的例子中,与条目620相关的数据是可以高度压缩的,并且可以从逻辑地址空间中的64个块压缩到非易失性存储装置上的1个块。
有效标签630指示映射到条目620的数据是否有效。在这种情况下,与条目60相关的数据是有效的,并且在图6中将其描述为条目620的行中的“Y”。如本文所使用的,有效数据是指最新更新的还没有被删除和/或还没有使其过期(覆盖或者修改)的数据。反向索引622可以跟踪非易失性存储装置的每个物理存储位置的有效状态。正向索引504可以包括只对应于有效数据的条目。在图6的例子中,条目“Q”648指示与条目648相关的数据是无效的。需要指出的是,正向索引504不包括与条目Q 648相关的逻辑地址。条目Q 648可以对应于条目505C的数据的过期版本(由现在存储在条目“C”的数据覆盖)。
反向索引622可以保留无效数据的条目,以便在存储恢复(例如,清理)时可以快速区分有效和无效数据。在某些实施例中,正向索引504和/或反向索引622可以以类似的方式跟踪脏数据和干净数据,以在当进行作为高速缓冲的操作时从干净数据中区分中脏数据。
在某些实施例中,反向索引622可以省略源参数646。例如,如果源参数646与数据一起存储,其可能位于存储的数据的包头中,反向索引622就可以通过包括与数据相关的物理地址626标识逻辑地址,其中,可以从存储的数据识别出源参数646。
反向索引622还可以包括其他杂项数据636,例如,文件名、对象名、源数据、存储客户端、安全标记、原子性标记、事务标识符等。本领域技术人员将会意识到反向索引622中有用的其他信息。尽管物理地址626图示在反向索引622中,但是在其他实施例中,物理地址626或者其他目标参数644可以包括在其他位置,例如,包括在正向索引604、中间表格或者数据结构等中。
可以通过擦除块或者擦除区域(或者其他存储分区)布置反向索引622,以便遍历一部分索引允许清理器识别特定存储分区(例如,擦除块638)中的有效数据并且对有效数据的数量进行量化、或者反之,识别无效数据并且对无效数据的数量进行量化。清理器可以部分地基于每个分区中的有效和/或无效数据的数量来选择要恢复的存储分区。
在某些实施例中,将清理器和/或垃圾收集处理限制为在物理存储空间的特定部分内执行。例如,部分存储元数据434可以周期性的持久存储到非易失性存储装置402,从而可以将垃圾收集器和/或清理器限制到运行在对应于持久性存储元数据434的物理存储位置上。在某些实施例中,通过相对年限(例如,按照顺序)来持久保存存储元数据434,在更加新的部分保留在非易失性存储器中的同时,持久保存较老的部分。因此,可以将清理器和/或垃圾收集系统限制为对物理地址空间的较老的部分执行操作,这样,就不太可能会影响进程存储请求的数据。
再次参考图4,非易失性存储装置402可以被配置为以顺序的、基于日志的格式将数据存储到非易失性存储装置410上。因此,非易失性存储装置的内容可以包括在非易失性存储介质410上的存储操作的有顺序的“事件日志”。通过在非易失性存储装置402的物理存储空间内的附加点附加数据,可以保持存储操作的顺序排序。可选地或者另外地,可以通过存储在非易失性存储介质410上的持久性数据来保持序列信息。例如,非易失性存储介质410上的每个存储分区(例如,擦除块)可以包括各自的指示符(例如,时间戳、序列号或者其他指示符),以指示事件日志内的存储分区的顺序或者次序。
图7描述了非易失性存储介质(例如,非易失性存储介质410)的物理存储空间700。物理存储空间700被安排在存储分区(例如,擦除块)中,每个存储分区包括能够存储数据的多个物理存储位置(例如,页面或者逻辑页面)。可以将存储分区的页面初始化(例如,擦除)为组。
可以为每个物理存储位置分配范围从0到N的各自的物理地址。数据顺序得存储在附加点720。附加点720可以顺序地移动通过物理存储空间700。在将数据存储在附加点720(存储位置716)之后,附加点顺序地前进到下一个可用的物理存储位置。如本文所使用的,可用的物理存储位置是指已经初始化并且准备存储数据(例如,已经被擦除)的物理存储位置。某些非易失性存储介质(例如,非易失性存储介质410)在擦除之后只能编程一次。因此,如本文所使用的,可用的物理存储位置可以指处于初始化(例如,擦除的)状态的存储位置。如果序列中的下一个存储位置不可用(例如,包括有效数据、还没有被擦除或者初始化、业务中断等),附加点720就选择下一个可用的物理存储位置。在图7的例子中,在将数据存储到物理存储位置716之后,附加点720可以跳过不可用的存储分区713并且继续到下一个可用位置(例如,存储分区714的物理存储位置717)。
将数据存储到“最后的”存储位置(例如,存储分区815的存储位置N 718)之后,附加点720返回到第一分区712(或者如果712不可用,就返回到下一个可用的存储分区)。因此,附加点720可以将物理地址空间视为循环的或者周期的。
再次参考图4,以顺序的、基于日志的格式存储数据可以包括将元数据持久存储到描述存储在其上的数据的非易失性存储介质410上。持久性元数据可以包括与数据相关的逻辑标识符和/或提供与非易失性存储介质410上执行的存储操作的顺序排序有关的序列信息。因此,该顺序的、基于日志的数据可以代表跟踪在非易失性存储装置402上执行的存储操作的顺序的“事件日志”。
图8描述了顺序的、基于日志数据的格式(包格式810)的一个例子。数据包810包括数据段812,所述数据段812包括一个或者多个逻辑标识符的数据。在某些实施例中,数据段812包括压缩的、加密的和/或白化的数据。如本文所使用的,“白化的数据”指偏置的、编码的和/或被配置为具有特定模式和/或统计特性的数据。此外,可以将数据段812编码为一个或者多个错误校正码数据结构(例如,ECC代码字)和/或符号。数据段812可以是预定的大小(例如,固定的“块”或者“数据段”大小)。可选地,数据段812的大小可以是可变的。
包810包括存储在非易失性存储介质上的持久性元数据814。在某些实施例中,持久性元数据814与数据段812一起存储(例如,作为包包头、包尾等)。持久性元数据814可以包括逻辑标识符指示符815,其标识数据段812所属的逻辑标识符。逻辑标识符指示符815可以用于重建存储元数据,例如,正向索引(例如,正向索引504)和/或反向索引(例如,反向索引622)。持久性元数据814可以进一步包括一个或者多个元数据标记817。如下文所述,标记817可用于支持原子量级存储操作、事务、缓存操作等。
在某些实施例中,包810与序列指示符818相关联。序列指示符818可以和包810一起持久存储到存储位置(例如,页面)和/或持久存储到包810的存储分区(例如,擦除块)。可选地,序列指示符818可以持久存储到独立的存储位置。在某些实施例中,当使存储分区可用时(例如,当初始化、擦除时,当第一个或者最后一个存储位置被编程时,等等),应用序列指示符。序列指示符818可用于确定非易失性存储装置上的存储操作的顺序排序。顺序的、基于日志的数据格式提供非易失性存储装置(例如,非易失性存储装置402)上的存储操作的“事件日志”。
再次参考图4,在发生无效关闭(或者导致部分存储元数据434丢失的其他事件)的情况下,本文公开的顺序的、基于日志的格式使VSL 430能够重建存储元数据434和其他数据。
如上所述,存储元数据434(例如,图5的正向索引504)保持逻辑标识符和非易失性存储装置上的物理存储位置之间的“任意到任意”的分配。因此,逻辑标识符和非易失性存储介质410上的物理存储位置之间可能没有预先确定的映射;逻辑标识符的数据可以存储到非易失性存储介质410的任意物理存储位置。
如上所述,可以通过存储在非易失性存储装置402上的顺序的、基于日志的数据来重建存储元数据434。基于附加点的位置和/或与数据相关的序列指示符来识别最新版本的数据。在重建期间,可以使用如图8所示的与数据相关的持久性元数据识别(并且丢弃)与不完整的原子量级存储请求相关的数据。
在某些实施例中,系统400可以包括缓存层440,其被配置为使用非易失性存储装置402缓存后备存储器460的缓存数据。后备存储器460可以包括一个或者多个硬盘、网络附属存储器(NAS)、存储区域网络(SAN)或者其他持久性存储器。后备存储器460可以包括能够对存储客户端412的数据进行存储的多个物理存储位置461。后备存储器460可以通信地耦合到计算装置401的总线421。可选地或者另外地,后备存储器460可以通过网络420通信地耦合到计算装置401(和VSL 430)。
缓存层440可以被配置为利用VSL 430将后备存储器460的数据缓存到非易失性存储介质410上。在某些实施例中,VSL 430被配置为提供对应于后备存储器460的地址空间的逻辑地址空间432。从而,逻辑地址空间432可以对应于后备存储器461的物理存储位置461。因此,VSL 430可以保持存储元数据434,以将后备存储器469的逻辑标识符和非易失性存储介质410上的缓存数据的存储位置(例如,非易失性存储装置402上的物理存储位置)相关联。逻辑地址空间432可以具有与后备存储器460的物理存储容量相同的逻辑容量。可选地,逻辑地址空间432可以是“稀疏的”,以使其超过后备存储器460的物理存储容量。逻辑地址空间432的逻辑容量(以及后备存储器460的物理容量)可以超过非易失性存储装置402的物理容量。如上所述,VSL 430可以管理非易失性存储介质402的逻辑地址空间432和物理存储容量的分配。在某些实施例中,VSL 430可以提供多个逻辑地址空间432,每个逻辑地址空间对应于不同的后备存储器460和/或不同的存储客户端412。VSL 430可以为每个逻辑地址空间432保持独立的存储元数据434。
缓存层440可以利用逻辑地址空间432和VSL 430保持的存储元数据434缓存后备存储器460的数据。缓存层440可以使用后备存储器460的逻辑标识符(通过VSL 430的逻辑地址空间432获得)引入非易失性存储介质410上的缓存数据。因此,缓存层440可以不必保持它本身的存储元数据;缓存层可以不保持独立的索引来将后备存储器460的逻辑标识符和非易失性存储介质410上的高速存储位置相关联。通过利用VSL 430的逻辑地址空间432和存储元数据434,可以显著地减轻缓存层440的开销。
缓存层440可以选择性地接纳后备存储器460的数据进入缓存。如本文所使用的,“接纳”数据进入缓存是指将数据缓存到非易失性存储介质410上。可以响应于导致缓存缺失(例如,与请求有关的数据在非易失性存储装置402上并不是有效的-读取缺失或者写入缺失)的数据访问而接纳数据进入缓存。可以响应于数据适合缓存(例如,将不会使缓存中毒)的确定而接纳数据。如本文所使用的,适合缓存的数据是指一个或者多个存储客户端412很可能随后访问的数据。相比之下,使缓存“中毒”是指接纳存储客户端412不太可能随后请求的数据(例如,“一次性使用”的数据)进入缓存。如本文所使用的,数据访问是指与数据相关的任何操作,包括但不限于:读取、写入、修改、截取等。
缓存层440可以基于访问元数据442作出缓存接纳的决定。访问元数据442可以包括与VSL 430提供的逻辑地址空间432内的逻辑标识符的数据访问特性相关的信息。访问元数据442可以独立于VSL 430的存储元数据434。因此,可以在与存储元数据434(例如,和正向索引、反向索引等独立和/或不同)分开和/或不同的数据结构中保持访问元数据442。
访问元数据442可以包括与跨越VSL 430提供的整个逻辑地址空间432的访问特性相关的信息。因此,访问元数据442可以包括与“缓存的”逻辑标识符相关的访问元数据以及与“没有缓存的”逻辑标识符相关的访问元数据。如本文所使用的,“缓存的”逻辑标识符是指缓存在非易失性存储介质410上的数据的逻辑标识符。“没有缓存的”逻辑标识符是指当前没有缓存在非易失性存储介质410上的数据的逻辑标识符。与传统的“最近最少使用”的缓存度量不同,访问元数据442可用于无论数据当前是否在缓存中都可识别适于缓存的数据。
缓存层440可被配置为响应于逻辑地址空间432内的数据访问而更新访问元数据442。更新访问元数据442可以包括将访问请求的指示包括在访问元数据442中。在某些实施例中,缓存层440包括缓存接纳模块444,其被配置为使用缓存访问元数据442作出缓存访问决定(例如,识别适合缓存的数据)。在某些实施例中,缓存接纳模块444可以响应于缓存缺失来确定逻辑标识符的访问度量(例如,关于逻辑标识符的数据访问请求),并且当数据的访问度量满足“访问阈值”或者其他接纳标准时,可以接纳数据进入缓存。如本文所使用的,逻辑标识符的“访问度量”是指量化逻辑标识符的访问特性(例如,访问频率等)的任何值。访问度量可以包括但不限于:指示在预定的时间间隔内访问逻辑标识符的二进制值、一组有序的这种二进制值、一个或者多个计数器值等。如本文所使用的,“访问阈值”是指一个或者多个预定的或者动态的阈值,以及“接纳标准”是指用于选择性地接纳数据进入缓存的预定的或者动态的标准(例如,阈值)。
在某些实施例中,可以接纳不符合接纳标准(例如,访问阈值)的数据作为“低价值”数据进入缓存。如本文所使用的,“低价值”是指尽管不满足缓存接纳标准仍然可以接纳进入缓存的数据。可以响应于满足较不严格的缓存接纳标准(例如,较低的访问阈值)的访问度量而接纳低价值数据进入缓存。低价值的数据的接纳可以以有可用的缓存容量或者其他性能参数为依据。在其他较高价值的数据(例如,满足接纳标准的数据)之前,可以将低价值的数据从缓存中清理出去。因此,可以在缓存内标记低价值的数据;接纳低价值的数据进入缓存可以包括:将数据识别为非易失性存储介质410上的“低价值”的数据和/或其他元数据。指示可以包括如上文结合图8所述的持久性元数据。可选地或者另外地,所述指示可以包括在易失性缓存中,和/或包括在缓存层440和/或VSL 430保持的存储元数据中。
图9A描述了访问元数据的一个例子。在图9A的例子中,访问元数据442包括访问数据结构946,所述访问数据结构946包括多个条目948,每个条目包括逻辑地址空间(例如,上文所述的逻辑地址空间432)中的各个逻辑标识符的访问特性。因此,在某些实施例中,数据结构946可以表示后备存储器460的整个地址空间;数据结构946可以包括表示后备存储器460的每个物理存储位置461的条目948。访问数据结构946的条目948结合在一起可以对应于地址空间中的、包括“缓存的”和“没有缓存的”逻辑标识符在内的所有逻辑标识符(和后备存储器460的物理存储位置461)。访问数据结构946可以是稀疏的,以便根据需要创建条目948(或者条目948的范围)。因此,可以从来不创建和/或分配表示特定范围的逻辑地址空间的条目(例如,逻辑地址空间的尾部)。
在某些实施例中,访问数据结构946可以包括位图(或者位阵列),其中,每个条目948都包括一个位。位值可以表示在特定的时间间隔期间,是否发生了与条目948的逻辑标识符相关的一个或者多个数据访问。在时间间隔期满后,可以“复位”数据结构946。如本文所使用的,“复位”访问数据结构946是指将访问指示从访问数据结构946中清理出去(例如,将条目948复位为“0”值)。因此,“1”值可以表示在时间间隔期间发生了一个(或者多个)数据访问,而“0”值可以表示在时间间隔期间没有发生数据访问。
在另一个例子中,条目948可以包括确定时间间隔期间的访问请求的次数的多位计数器。在时间间隔(例如,时钟扫描间隔)期满后可以复位(或者递减)计数器。因此,计数器的值可以表示在时间间隔期间与条目948的逻辑标识符相关的访问的次数(或者频率)。
再次参考图4,缓存层440可以被配置为基于与数据相对应的逻辑标识符的访问度量选择性地接纳数据进入缓存。如上所述,可以从访问元数据442获得访问度量。在某些实施例中,访问度量可以包括按位指示,其指示在时间间隔期间是否访问了逻辑标识符的数据。可选地,访问度量可以包括与逻辑标识符相关的访问次数。缓存层440可以将访问度量与访问阈值进行比较,并且当访问度量满足访问阈值时,可以接纳数据进入缓存。所述比较可以包括:确定对应于逻辑标识符的位值是否表示数据访问,和/或可以包括:将多位计数器值与多位访问阈值进行比较。
在某些实施例中,访问元数据442可以包括一组有序的访问数据结构946。图9B描述了一组有序的访问数据结构946A-N,其包括“当前”访问数据结构946A和一个或者多个“先前”访问数据结构946B-N。每个访问数据结构946A-N可以包括各自的条目948,如上所述,所述条目948包括一个或者多个逻辑标识符的访问特性。
可以响应于在当前时间间隔期间的数据访问而动态地更新当前访问数据结构946A。一个或者多个先前访问数据结构946B-N可以包括先前时间间隔的访问特性,并且可以在当前时间间隔期间不进行动态更新。在当前时间间隔期间期满时,访问数据结构946A-N可以翻转;“复位”数据结构可以取代当前数据结构946A,可以将当前访问数据结构946A指定为先前数据结构946B(例如,取代原来的946B),数据结构946B可以取代946C,以此类推。最后,可以移除数据结构946N(或者复位并且指定为当前数据结构946A)。
可以通过合并访问数据结构946A-946N的条目确定逻辑标识符的访问度量。在某些实施例中,所述合并可以包括加法运算,例如,逻辑或(OR)运算,以便访问度量反映对数据结构946A-N的任何访问。如果以时间间隔“T”更新访问数据结构,则逻辑或合并指示在N*T时间间隔期间发生的任何访问。加法运算可以指示在N*T时间间隔期间的访问频率。
在某些实施例中,合并可以包括两个或者更多个数据结构946A-N的条目948的按位合并。合并可以包括任何合适的合并,包括但不限于:逻辑和(AND)、或(OR)、异或(XOR)等。类似地,合并可以包括两个或者更多个数据结构946A-N的条目948的和或者积。在某些实施例中,合并可以包括根据它们的新近程度的加权访问特性;最近的访问特性的权重可以大于较老的访问特性的权重。因此,当确定逻辑标识符的访问度量时,赋予更多个最近的条目(例如,访问数据结构946B-N的特性)的访问特性的权重可以大于较老的数据结构946B-N的访问特性的权重。如下面的等式1所示,确定访问度量可以包括访问特性乘以新近参数(例如,通过左移访问特性位或者计数器值):
在等式1中,访问度量(AM)是访问数据结构946A-N中的各个条目948的访问特性(ACi)的加权组合。当前访问特性0(AC0)可以对应于当前访问数据结构946A中的条目948,访问特性1(AC1)可以对应于“下一个最新”的访问数据结构946B的条目948,以及访问特性N-1(ACN-1)可以对应于“最老的”访问数据结构946N的条目948的访问特性,以此类推。新近权重参数(Ri)可以根据访问特性ACi的相对新近程度而不同;应用于当前访问数据结构946A(AC0)的访问特性的新近参数(R0)可以大于应用于“较老的”访问数据结构946B-N的访问特性的新近参数(RN-1)。
在另一个例子中,可以通过将访问数据结构946A-N中的各个条目948的一个或者多个访问特性(ACi)“左移”可以确定逻辑标识符的访问度量(AM),如下所示:
在等式2中,访问度量(AM)是访问数据结构946A-N中的各个条目948的访问特性(ACi)的加权组合;如上所述,访问特性AC0对应于当前访问数据结构946A中的条目948,并且访问特性N-1(ACN-1)对应于“最老的”访问数据结构946N的条目948的访问特性。可以赋予当前访问数据结构946A的访问特性(AC0)较大的权重(例如,左移N-1),而赋予较老的访问数据结构946B-N的条目948较小的权重(例如,移动N-i位);在等式2中,不对最老的访问数据结构946N进行加权(例如,在组合的访问度量中赋予最少量的权重)。在数据结构946A-N包括位图(例如,每个条目948都包括一个位)的实施例中,等式2的总和可以包括逻辑或运算。尽管本文描述了确定访问度量的特定技术,但是本公开并不限于此,并且可以适于以任何合适的方式组合访问特性和/或对访问特性加权。
参考图4,如上所述,缓存层440保持访问元数据442,以跟踪逻辑地址空间432内的逻辑标识符的访问特性。访问元数据442可以包括一个或者多个访问数据结构,所述访问数据结构包括对应于一个或者多个逻辑标识符的访问特性的条目。在某些实施例中,缓存层440单独地跟踪每个逻辑标识符的访问特性,以便形成逻辑标识符和访问元数据442中的条目之间的一一的对应。在其他实施例中,访问元数据442可以跟踪逻辑标识符组的访问特性,以便每个条目对应于多个逻辑标识符的访问特性。缓存层可以使用任何合适的机制将逻辑标识符映射到访问元数据442中的条目,所述机制包括但不限于:哈希映射、范围映射、混合映射等。因此,在某些实施例中,缓存层440包括映射模块445,其被配置为将逻辑标识符映射到访问元数据1032中的条目。
图10A描述了逻辑地址空间1032的逻辑标识符和访问数据结构1046的条目1048之间的基于哈希的映射的例子。在图10A的例子中,逻辑地址空间1032包括M个逻辑标识符(0到M-1),并且访问数据结构1046包括E个条目(0到E-1)。哈希映射将每((k*E)+i)个逻辑标识符映射到位图索引i,其中,k是逻辑地址空间M的大小和访问数据结构1046中的条目的数量E的比例。因此,可以通过逻辑标识符的索引取访问数据结构1046中的条目(E)的数量的模来确定逻辑标识符的条目。如图10A所示,逻辑标识符0、E、2E和3E都映射到访问数据结构1046中的同一个条目0。类似地,逻辑标识符1、E+1、2E+1和3E+1都映射到同一个条目,以此类推。在图10A的例子中,逻辑标识符和条目1048的比例是4比1,这样4个逻辑标识符就映射到每个条目1048。
图10B描述了逻辑地址空间1032的逻辑标识符和访问数据结构1046的条目1048之间的基于范围的映射的例子。图10B的基于范围的映射根据逻辑地址空间M和条目E的比例将连续范围的逻辑标识符映射到各自的条目1048。在图10B的例子中,M和E的比例是4比1。因此,逻辑标识符0到3映射到条目0,逻辑标识符4到7映射到条目1,以此类推,其中条目M-4到M-1映射到条目E-1。
图10C描述了逻辑地址空间1032的逻辑标识符和访问数据结构1046的条目1048之间的混合映射的例子。混合映射将从(i*E)到((i+1)*E-1)的逻辑标识符映射到条目1048i。因此,混合映射将多个逻辑标识符范围映射到同一个条目1048。在图10C的例子中,逻辑标识符和访问数据结构1046中的条目1048之间的比例是16比1。混合映射将4个范围的4个逻辑标识符映射到每个条目1048。从逻辑标识符0开始的第一范围和从逻辑标识符R*E、2*R*E和3*R*E开始的其他范围一起映射到条目0,其中,R是范围大小(4),并且E是条目1048的数量。可以通过测试和经验来调整范围大小和/或哈希交叠的比率。在另一个例子中,可以使用不同的范围大小实现图10C的16比1的比例,这导致了不同的哈希映射(例如,8个逻辑标识符的2个交叠范围)。
尽管本文描述了特定的映射,但是本公开并不限于此,并且可以适于并入逻辑地址空间1032和访问数据结构1046之间的任何合适的映射。此外,本开可适于使用具有逻辑地址空间1032和条目1048之间的任何合适的比率的访问数据结构1046。
图11是管理缓存接纳的方法1100的一个实施例的流程图。可以在计算装置(例如,上文描述的计算装置401)中和/或结合计算装置来实现方法1100以及其他方法和/或本文公开的进程。在某些实施例中,可以在驱动器或者计算装置的其他驱动器、存储器和/或缓存层中实现方法1100的步骤。因此,部分方法1100可以实现为运行在计算装置(例如,图4的VSL 430和/或计算装置401)的处理器上的计算机可读指令或者模块。方法1100的指令和/或模块可以存储到计算机可读存储介质上。
在步骤1110,方法1100开始并初始化。步骤1110可以包括初始化和/或分配资源以管理非易失性存储装置(例如,非易失性存储装置402)上的缓存,其可以包括但不限于:存储层(例如,VSL 430)、通信接口(例如,总线421、网络420等)、分配的易失性存储器等。初始化可以进一步包括:如上所述的将存储层配置为提供对应于后备存储器的逻辑地址空间。
步骤1120包括将对应于后备存储器460的数据缓存到非易失性存储介质410上。步骤1120可以包括使用存储层(例如,VSL 430)缓存数据。因此,步骤1120可以包括:利用存储元数据(例如,包括逻辑标识符和非易失性存储介质410上的物理存储位置之间的分配的索引)缓存数据。
步骤1130包括维持与逻辑地址空间内的数据访问相关的访问元数据。访问元数据可以和存储层(例如,VSL 430)的存储元数据分开和/或不同。访问元数据可以包括一个或者多个位图,所述位图包括对应于一个或者多个逻辑标识符的条目(例如,位)。步骤1130可以包括响应于逻辑地址空间内的数据访问而更新访问元数据。更新访问元数据可以包括识别对应于数据访问的条目(例如,使用如上所述的映射)并且更新条目的访问特性(例如,翻转位、递增计数器等)。在某些实施例中,访问元数据括一组有序的访问数据结构(例如,数据结构946A-N)。步骤1130可以包括在预定的时间间隔指定当前数据结构和/或“翻转”数据结构。
步骤1140包括确定是否接纳逻辑标识符的数据进入缓存中。可以响应于与不在缓存中(例如,缓存缺失)的数据有关的访问请求而作出步骤1140的确定。步骤1140可以包括确定如上所述的逻辑标识符的访问度量。步骤1140可以包括识别对应于逻辑标识符的一个或者多个条目(使用如上所述的的一对一或者其他的映射),使用一个或者多个条目的访问特性确定逻辑标识符的访问度量,以及将访问度量与访问阈值进行比较。响应于满足访问阈值的访问度量,流程可以继续到步骤1150;否则,流程就在步骤1160结束。
在某些实施例中,步骤1140包括确定是否将数据作为“低价值”数据接纳。如上所述,如果逻辑标识符的访问度量不满足访问阈值(或者其他接纳标准),可以将数据作为“低价值”数据接纳。可以响应于满足较低访问阈值的访问度量而将数据接纳为低价值数据,和/或无论访问度量如何都将数据作为低价值数据接纳。可以在非易失性存储介质410上和/或缓存元数据442中标记低价值数据。
步骤1150可以包括接纳数据进入缓存中。接纳数据可以包括将数据存储到非易失性存储装置(例如,非易失性存储装置402)上。步骤1150可以进一步包括:如上所述的,利用存储层(例如,VSL 430)的存储元数据将逻辑标识符和物理存储位置相关联。
再次参考图4,缓存层440可以被配置为预接纳数据进入缓存。如以上所讨论的,缓存接纳模块444可以响应于缓存缺失而考虑接纳进入缓存的数据(例如,与没有存储到非易失性存储介质410上的数据有关的数据访问)。缓存接纳模块444可以进一步的被配置为考虑接纳进入缓存的其他“接近”的数据。如本文所使用的,“接近”的数据是指逻辑地址空间432内的另一个逻辑标识符的接近窗口内(例如,逻辑标识符之间的“距离”小于(或者等于)接近阈值)的逻辑标识符的数据。
预接纳可以包括:缓存接纳模块444确定一个或者多个接近逻辑标识符的访问度量,并且响应于访问度量满足预接纳的访问阈值而接纳逻辑标识符的数据进入缓存。在某些实施例中,预接纳的访问阈值可以不同于访问阈值(例如,低于或者高于访问阈值)。可以根据计算装置401和/或存储客户端412的数据访问特性,调整预接纳的访问阈值(以及如上所述的访问阈值)。例如,存储客户端412可以操作相对大的、连续的数据范围。作为响应,可以将预接纳的访问阈值设置为低于访问阈值,以使缓存接纳模块444朝向预接纳的连续数据段偏置。相反,访问相对较小、不连续的数据段的缓存业务存储客户端412可以将预接纳的访问阈值设置为等于(或者高于)访问阈值。
另外,可以根据计算装置401和/或存储客户端412的访问特性调整缓存接纳模块444的接近窗口。大的接近窗口可以增加预接纳的候选者的数量,而较小的接近窗口会限制预接纳的候选者的范围。在某些实施例中,缓存接纳管理者444可以应用随预接纳的候选者的接近而变化的动态预接纳访问阈值。缓存接纳模块444可以将较低的预接纳的访问阈值应用到多个接近的逻辑标识符,并且将较高的预接纳访问阈值应用到较远的逻辑标识符。
图12是管理进入缓存的接纳的方法1200的一个实施例的流程图。在步骤1210,方法1200如上所述的开始并初始化。步骤1210可以进一步包括:如上所述的,使用存储层将数据缓存到非易失性存储装置上,并且保持与逻辑地址空间中的数据访问相关的访问元数据。
步骤1220可以包括在缓存层(缓存层440)接纳数据进入缓存的请求。可以响应于缓存缺失(例如,与没有存储(和/或没有更新)到非易失性存储介质410上的数据有关的数据访问)而接收步骤1220的请求。
步骤1230可以包括:确定数据的接近窗口内的一个或者多个逻辑标识符的访问度量。步骤1230可以包括:识别逻辑地址空间(例如,逻辑地址空间432)中的数据的接近窗口内的逻辑标识符,并且如上所述,确定每个识别出的逻辑标识符的访问度量。如上所述,可以根据计算装置和/或一个或者多个存储客户端的数据访问特性调整接近窗口。
步骤1240可以包括:确定一个或者接近的逻辑标识符的访问度量是否满足预接纳的访问阈值。预接纳的访问阈值可以低于、高于或者等于以上所述的缓存接纳访问阈值。可以根据计算装置和/或一个或者多个存储客户端的数据访问特性调整预接纳的访问阈值。在某些实施例中,预接纳的访问阈值是动态的(例如,与逻辑标识符的接近程度成比例)。
如上所述(例如,逻辑标识符的数据可以存储到非易失性存储介质410),可以在步骤1250接纳具有在步骤1240满足预接纳的阈值的访问度量的逻辑标识符进入缓存。不满足预接纳访问阈值的逻辑标识符可以不被预接纳进入缓存。在步骤1260结束流程,直到接收到接纳数据进入缓存的下一个请求。
再次参考图4,在某些实施例中,缓存层440包括序列模块446,其被配置为识别数据,这是顺序访问的一部分。如本文所使用的,“顺序访问”是指在逻辑地址空间432内顺序的(或者接近的)数据访问。如以上所讨论的,顺序数据访问通常是“一次性使用”的访问,这样就可能不适合缓存(例如,可能会使缓存中毒)。顺序数据访问的例子包括但不限于:数据流、备份引用、病毒扫描应用等。
缓存层440可以包括序列模块446,其被配置为响应于接纳数据进入缓存的请求(例如,响应于缓存缺失)而生成序列度量。序列度量可以对数据是顺序数据访问的一部分的可能性进行量化。缓存接纳模块444可以使用序列度量(与以上描述的访问度量一起)确定是否接纳数据进入缓存。
在某些实施例中,序列模块446保持包括有序的数据访问序列的访问元数据。图13描述了包括当前数据访问1362的数据访问1360的有序序列的一个例子,并且窗口1364包括多个先前数据访问1365A-N。通过将当前数据访问1362的逻辑标识符和数据访问1365A-N的逻辑标识符进行比较,可以确定当前数据访问1362的序列度量。在某些实施例中,序列度量可以包括二进制的序列指示符,如果窗口1364中的任何一个数据访问的逻辑标识符位于预定的接近阈值内,就将所述二进制序列指示符插入到当前数据访问1362的逻辑标识符中。
在某些实施例中,序列度量可以包括多位值,该多位值将当前数据访问1362是顺序数据访问的一部分的可能性量化。序列度量可以响应于识别出窗口1364中的逻辑标识符位于当前数据访问1362的接近阈值内而递增。序列度量可以随逻辑标识符之间的接近程度而呈比例的递增(例如,逻辑标识符越接近,序列度量递增的越多)。序列度量可以响应于窗口1364中的逻辑标识符位于接近阈值之外而保持不变(或者递减)。
在某些实施例中,可以通过窗口1364内数据访问的相对顺序(例如,数据访问1365A-N到当前数据访问1362的时间上的接近)衡量数据访问1365A-N对序列度量的贡献。例如,将数据访问1365A的贡献衡量为比先前数据访问1365B-N的贡献更多,以此类推。
在某些实施例中,可以响应于用户偏好、性能监控等来调整窗口1364的大小(和/或序列阈值)。可以根据一个或者多个存储客户端(例如,数据库、文件系统等)、处理器配置(例如,处理器核的数量、并发线程的数量等)等对窗口进行调整。
图14是使用访问元数据管理缓存接纳的一个实施例的流程图。在步骤1410,方法1400可以如上所述的开始并初始化。
步骤1420包括接收接纳数据进入缓存的请求。可以响应于导致缓存缺失的数据访问而在缓存层440接收步骤1420的请求。
步骤1430可以包括确定访问请求的序列度量。步骤1430可以包括:保持包括数据访问的有序序列(例如,缓存层440保持的有序序列1364)的窗口。可以通过将数据访问的逻辑标识符和窗口内的数据访问的逻辑标识符进行比较,确定序列度量。如上所述,可以响应于识别出窗口中的逻辑标识符位于数据访问的接近阈值内,而识别顺序数据访问和/或递增序列度量。
步骤1440包括确定数据访问是否是顺序数据访问的一部分。步骤1440从而可以包括:将步骤1430的序列度量与序列阈值(例如,估计序列度量以确定数据访问是顺序数据访问的可能性)进行比较。如果步骤1440指示数据访问不是顺序数据访问的一部分,流程就继续到步骤1450;否则,流程可以在步骤1460结束。
步骤1450包括接纳数据进入缓存,如上所述,其可以包括使用VSL 430将数据存储到非易失性存储介质410。
再次参考图4,在某些实施例中,缓存接纳模块使用访问度量和序列度量确定是否接纳数据进入缓存。例如,即使数据是顺序数据访问的一部分,如果存储客户端重复访问所述数据(如数据的访问度量所指示的),则所述数据仍然可能适于接纳进入缓存中。类似地,如果序列度量指示数据不是顺序数据访问的一部分,则可以接纳不满足访问阈值的数据。
在某些实施例中,缓存接纳模块444可以使用一个或者多个动态缓存接纳阈值确定缓存接纳。例如,具有指示数据是顺序数据访问的一部分的序列度量的所述数据可能会符合更加严格的访问阈值。类似地,具有低访问度量(例如,不满足访问阈值的访问度量)可以符合更加严格的序列阈值。在另一个例子中,具有指示数据不是顺序数据访问的一部分的序列度量的所述数据可以符合较不严格的访问阈值,并且具有高访问度量、满足访问阈值的数据可以符合较不严格的序列阈值。
图15是描述基于序列度量和访问度量的动态缓存接纳标准1571的一个例子的曲线图1500。曲线图1500包括范围从低访问度量到高访问度量的访问度量轴1572和范围从指示顺序访问的序列度量到指示非顺序访问的度量的序列度量轴1574。考虑序列度量,原因在于:如以上所讨论的,属于顺序数据访问的一部分的数据可能会污染缓存,而不属于顺序访问的一部分的数据可能更适合缓存接纳。动态接纳标准1571将适合接纳进入缓存(区域1575)的数据与不适合接纳进入缓存(区域1577)的数据区分开来。如曲线图1500所示,尽管序列度量指示顺序数据访问(点1581),但是可以接纳具有高访问度量的数据进入缓存。由于点1581的序列度量指示数据是顺序访问的一部分,所以它可能符合用于接纳进入缓存的较高的访问阈值。例如,尽管接纳点1582的数据具有相对较高的访问度量,但是因为访问度量不满足由于其序列度量而应用的更加严格的访问阈值,所以可以不接纳点1582的数据进入缓存。在另一个例子中,尽管接纳点1583的数据具有相对低的访问度量,但是由于它的序列度量指示该数据不是顺序访问的一部分,所以可以接纳点1583的数据进入缓存。尽管点1584的数据具有良好的序列度量,但是由于访问度量不满足较不太严格的访问度量,所以可以不接纳点1584的数据进入缓存。
尽管将动态接纳标准1571描述为线性,但是本公开并不限于此,并且可适于使用其他类型的动态接纳标准,包括:抛物线、曲线、指数曲线等。此外,本公开不限于序列度量和访问度量比率相等的动态接纳标准。
图15B是描述动态接纳标准1573的另一个例子的的曲线图1501。动态接纳标准1573给予访问度量1572的权重比给予序列度量1574的权重更大。如点1585所示,可以接纳具有相对较高访问度量的数据进入缓存,而很少考虑序列度量。相反,如点1586所示,尽管序列度量指示非顺序访问,但是可以不接纳具有相对较低的访问度量的数据。
图15C是描述包括接纳标准1591和低价值接纳标准1592的动态接纳标准的另一个例子的曲线图1502。接纳标准1591和1592可以定义接纳区域1575、不接纳区域1577和低价值接纳区域1578。可以接纳具有落入接纳区域1575的访问度量和/或序列度量的数据进入缓存(例如,点1587的数据)。可以将不满足接纳标准1591但是满足低价值接纳标准1592的数据作为如上所述的低价值数据接纳(例如,点1588的数据)。既不满足标准1591又不满足标准1592的数据可以不被接纳进入缓存(例如,点1589的数据)。
图16是管理接纳进缓存的方法1600的一个实施例的流程图。在步骤1610,方法1600开始并初始化。步骤1610可以进一步包括:如上所述,使用存储层将数据缓存到非易失性存储介质,并且在逻辑地址空间中保持与数据访问相关的访问元数据。
步骤1620可以包括:如上所述,接收接纳数据进入缓存的请求。步骤1630可以包括:如上所述,使用访问元数据确定数据的访问度量和数据的序列度量。
步骤1640可以包括:确定数据是否适合接纳进入缓存。可以通过缓存层440的缓存接纳模块444实现步骤1640。步骤1640可以包括:将访问度量与访问阈值进行比较,和/或将序列度量与序列阈值进行比较。步骤1640的比较根据步骤1630确定的访问度量的值和/或序列度量的值,可以是动态的。如以上所讨论,具有足够高的访问度量的数据可以被接纳进入缓存,而不考虑序列度量(和/或可以符合较不严格的序列度量)。类似地,具有指示数据不是顺序访问的一部分的序列度量的数据可以被接纳进入缓存,而不考虑访问度量(和/或可以符合较不严格的访问阈值)。可以根据计算装置和/或一个或者多个存储客户端的访问特性,调整步骤1640的接纳标准。
如果数据满足步骤1540的接纳标准,流程就继续到步骤1650,在步骤1650,如上所述,接纳数据进入缓存;否则,流程在步骤1560结束,直到接收到接纳数据进入缓存的下一个请求。
为了全面理解本文描述的实施例,以上的描述提供了大量的具体的细节。然而,本领域技术人员将会意识到,可以省略一个或者多个具体细节,或者可以使用其他方法、部件或者材料。在某些情况下,没有细地示出或者描述操作。
此外,可以在一个或者多个实施例中以任何合适的方式组合描述的特性、操作或特性。还容易理解的是,结合公开的实施例描述的方法的步骤或者动作的顺序可以改变,这对本领域技术人员来说是显而易见的。因此,除非对顺序有明确的要求,附图或者详细说明中的任何顺序都仅仅是为了举例说明的目的,并且不意味着包含要求的顺序。