一种面向读写数据流的闪存数据分布方法与流程

文档序号:11275927阅读:186来源:国知局
一种面向读写数据流的闪存数据分布方法与流程

本发明涉及存储系统领域,尤其涉及一种面向读写数据流的闪存数据分布方法。



背景技术:

数据写入模式包括覆盖写模式和追加写模式,如图1所示,覆盖写模式(图1左侧)是对数据进行更新操作时,更新内容“b”写入已经被写入“a”的存储块中。追加写模式(图1右侧)是对已经写入的数据“a”进行更新操作时,为更新数据“b”重新分配存储块,更新内容写入新分配的存储块中。

flash闪存介质在写入数据的过程中,允许编程值从“1”到“0”,而不允许从“0”到“1”,因此,如果想实现闪存介质编程值返回到“1”,需要首先进行擦除操作。在flash闪存介质的擦除过程中,属于被擦除范围的数据无法访问。此外,flash闪存介质的擦除/写入周期数是有限的,频繁的擦除-写入过程会加速闪存介质的磨损。

以常见的nand闪存颗粒为例,nand闪存颗粒由page(页)组成,page(页)是nand闪存颗粒读写的最小单元。多个连续page(页)构成一个block(块),block(块)是擦除的最小单元。当nand闪存颗粒被写入一个page(页)时,先进行page(页)所在block(块)的擦除操作,擦除成功后,再进行page(页)的写入操作。擦除过程中,整个block(块)将阻塞所有对block(块)内部page(页)的访问请求。nand闪存颗粒的读操作最快,在20us左右;写操作慢于读操作,在200us左右;擦除操作最慢,在1ms左右的数量级。基于nand闪存颗粒的存储设备通常会为使用者提供修剪(trim)命令,用于告知闪存设备某些数据块的数据已经无效,可以回收数据块。存储设备会在后台背景下对无效数据块集中进行擦除,然后再投入使用。

由此可知,对于采用nand闪存介质的固态硬盘(ssd):

一次写大数据块比多次写小数据块的性能要好,因为一次写大块的写前擦除次数最少。追加写比覆盖写的性能要好,追加写产生的写前擦除次数最少。但是追加写的过程中,会产生无效数据,占用ssd使用空间。沿着ssd设备的逻辑寻址空间顺序追加写ssd比随机式追加写ssd,在空间利用率上要好,因为顺序式追加写的无效数据块更集中,有利于回收更加“聚合”的大数据块。顺序式追加写大块数据是对ssd最友好的写入模式。

在顺序追加写ssd的过程中,会产生许多无效数据。可以将已经确认的无效数据块集中进行修剪(trim)操作,由存储设备进行后台回收擦除。这样,一方面保证ssd有足够的空闲数据块循环使用;另一方面,在循环使用一个数据块时,数据块就已经是全1的状态,尽可能的避免写时同步擦除,最终可以提高性能。

ext系列是经典的linux磁盘块设备文件系统,也是当前最主流的linux块设备文件系统。磁盘设备利用磁头的机械移动进行寻址,当磁头寻访到对应的磁道以后,停止移动,此后利用盘片的高速转动进行数据读写传输。因此,在读写过程中,磁头的寻址占用了大比重的时间。磁盘设备的顺序寻址访问性能较高,随机访问性能极差,这也是由于随机访问产生了大量磁头物理寻址造成的。磁盘设备的写入过程没有写前擦除的限制,因此可以进行反复的覆盖写。因此,ext系统采用了按数据类型分布的方案,元数据集中存放在元数据区域,数据集中存放在数据区域。元数据的访问集中在元数据区域小范围内寻址,数据访问集中在数据区域小范围内寻址。同时,ext系列文件系统采用覆盖写的方式实现对文件的写访问,尽可能的减少寻址浪费。



技术实现要素:

现有的linux块设备文件系统,在数据分布上采用按数据类型分布的方案。元数据存放在元数据区域,数据存放在数据区域,尽可能的避免一次访问内的大范围寻址。因此,这种方案需要覆盖写的支持。

ssd是不同于磁盘的存储介质:ssd设备的随机访问性能高,不存在寻址的问题;ssd需要写前擦除,不利于小写(单次写的数据量较小),不利于覆盖写。

采用覆盖写进行ssd访问,将会放大ssd写前擦除的负面影响。在并发写应用场景中,会产生一个擦除块内的写写冲突,原本没有数据相关性的写写操作,会因为物理位置的相邻性,导致可以并发执行的操作被写前擦除串行化,最终影响并发写性能。在大量随机小写的场景中,每一次小写都会产生一次写前擦除,放大了ssd写前擦除的负面影响。在并发读写的过程中,一个擦除块内的读写会产生碰撞,如果读请求先于写请求到达,则读请求阻塞写请求,如果写请求先于读请求达到,则写请求的擦除操作会阻塞读请求。这样,原本没有数据相关性的读写操作,会因为物理位置的相邻性,导致可以并发执行的操作串行化,最终影响读写性能。

因此,现有的linux块设备文件系统没有有效解决ssd设备写前擦除的问题,也没有充分利用ssd随机读高性能的优势。

根据本发明的一个方面,提供了一种数据写入方法,所述方法包括:将数据写入缓冲区,向写请求发出方应答写入成功;将缓冲区中的数据聚合成指定大小的数据集;以及将数据集顺序写入活动存储对象。

根据本发明的一个实施方式,进一步包括:接收写请求。

根据本发明的一个实施方式,其中,由第一线程组执行所述将缓冲区中的数据聚合成指定大小的数据集缓冲区,以及将数据集顺序写入存储对象的操作。

根据本发明的一个实施方式,其中,所述第一线程组包括多个线程,每个线程绑定一个独立的cpu核,使得每个线程执行所述操作时不会被其他线程抢占其cpu资源。

根据本发明的一个实施方式,其中,任一时刻有且仅有一个活动存储对象。

根据本发明的一个实施方式,其中,活动存储对象被写满后,将活动存储对象设为只读的存储对象。

根据本发明的一个实施方式,还包括,活动存储对象被写满后,创建新的活动存储对象。

根据本发明的一个实施方式,其中,第一线程组中包括第一线程与第二线程,第一线程获得活动存储对象使用权后,向活动存储对象写入数据,释放活动存储对象使用权;第二线程获得活动存储对象使用权后,向活动存储对象写入数据,释放活动存储对象使用权。

根据本发明的一个实施方式,其中,存储系统中存在多个活动存储对象;第一线程组中包括第一线程与第二线程,第一线程将数据集写入一个或多个第一活动存储对象,第二线程将数据集写入一个或多个第二活动存储对象。

根据本发明的一个实施方式,其中,所述一个或多个第一活动存储对象仅由第一线程写入数据,所述一个或多个第二活动存储对象仅由第二线程写入数据。

根据本发明的一个实施方式,其中,写请求同逻辑设备相关联,将访问相同逻辑设备的多个写请求写入同一个的活动存储对象,使得访问不同的逻辑设备的两个写请求不会被写入相同的活动存储对象。

根据本发明的一个实施方式,其中,第一线程组中包括第一线程与第二线程,第一线程维护一个或多个第一活动存储对象,第二线程维护一个或多个第二活动存储对象;写请求来自多个逻辑设备,第一线程将来自第一逻辑设备的数据聚合成第一数据集,并写入第一活动存储对象,第二线程将来自第二逻辑设备的数据聚合成第二数据集,并写入第二活动存储对象。

根据本发明的一个实施方式,其中,存在多个活动存储对象,第一多个活动存储对象用于存储冷数据,第二活动存储对象用于存储热数据;在接收到写请求时,基于所写入数据的特点,将数据写入第一多个活动存储对象或第二多个活动存储对象。

根据本发明的一个实施方式,其中,将数据集写入活动存储对象的第一条带,并将第一条带设为只读。

根据本发明的一个实施方式,进一步包括:接收修剪请求,将修剪请求所指定的存储对象设置为空或将修剪请求指定的存储对象的存储资源归还到存储池。

根据本发明的第二方面,还提供了一种数据写入设备,所述设备包括:用于将数据写入缓冲区,向写请求发出方应答写入成功的装置;用于将缓冲区中的数据聚合成指定大小的数据集的装置;以及用于将数据集顺序写入活动存储对象的装置。

根据本发明的第三方面,还提供了一种io请求处理方法,所述方法包括:接收读请求,所述读请求将读取第一数据,若所述第一数据尚未被分配存储对象,从缓冲区中获取第一数据;若已经为所述第一数据分配存储对象,存储对象是活动状态,但第一数据尚未完成持久化,则从缓冲区中获取第一数据;若已经为所述第一数据分配存储对象,存储对象是活动状态,且已经对第一数据完成持久化,从为第一数据分配的存储对象中获取第一数据;若已经为第一数据分配存储对象,且存储对象是只读状态,从为第一数据分配的存储对象中获取第一数据。

根据本发明的第三方面的一个实施方式,进一步包括:根据本发明第一方面所述的数据写入方法。

根据本发明的第四方面,还提供了一种io请求处理设备,所述设备包括:用于接收读请求,所述读请求将读取第一数据的装置,若所述第一数据尚未被分配存储对象,从缓冲区中获取第一数据;若已经为所述第一数据分配存储对象,存储对象是活动状态,但第一数据尚未完成持久化,则从缓冲区中获取第一数据;若已经为所述第一数据分配存储对象,存储对象是活动状态,且已经对第一数据完成持久化,从为第一数据分配的存储对象中获取第一数据;若已经为第一数据分配存储对象,且存储对象是只读状态,从为第一数据分配的存储对象中获取第一数据。

根据本发明的第五方面,还提供了一种处理读写请求的方法,所述方法包括:接收写请求;将写请求的数据写入缓冲区,向写请求发出方应答写请求完成;将写请求对应的数据写入活动存储对象;接收读请求,所述读请求要读取第一数据,判断已经为第一数据分配存储对象,且存储对象是只读状态,则从为第一数据分配的只读存储对象获取第一数据。

根据本发明的第六方面,还提供了一种处理读写请求的设备,所述设备包括:用于接收写请求的装置;用于将写请求的数据写入缓冲区,向写请求发出方应答写请求完成的装置;用于将写请求对应的数据写入活动存储对象的装置;用于接收读请求,所述读请求要读取第一数据的装置,判断已经为第一数据分配存储对象,且存储对象是只读状态,则从为第一数据分配的只读存储对象获取第一数据。

根据本发明的第七方面,提供一种包含计算机程序代码的计算机程序,当被载入计算机系统并在计算机系统上执行时,所述计算机程序代码使所述计算机系统执行根据本发明第一方面提供的数据写入方法或者根据本发明第三方面提供的io请求处理方法或者本发明第五方面提供的处理读写请求的方法。

根据本发明的第八方面,提供一种包括程序代码的程序,当被载入存储设备并在存储设备上执行时,所述计程序代码使所述存储设备执行根据本发明第一方面提供的数据写入方法或者根据本发明第三方面提供的io请求处理方法或者本发明第五方面提供的处理读写请求的方法。

本发明所述方法克服了现有linux块设备文件系统的如下缺点:

现有linux块设备文件系统,会导致ssd单个擦除块内的并发写请求产生多次写前擦除,使得并发写请求被阻塞串行化,严重影响写性能,多次写前擦除还会影响ssd设备使用寿命;

现有linux块设备文件系统,会导致ssd单个擦除块内的覆盖写请求产生多次写前擦除,严重影响写性能,多次写前擦除还会影响ssd设备使用寿命;

现有linux块设备文件系统,会导致ssd单个擦除块内的并发读写请求阻塞串行化,严重影响读写并发性能。

本方面所述方法达到了如下效果:

并发写写数据最大合并,写前擦除次数降低,减小写前擦除的性能负面影响和寿命负面影响;

覆盖写数据流转顺序追加写,写前擦除次数降低,减小写前擦除的性能负面影响和寿命负面影响;

读写数据流彻底分离,读写数据请求彻底并行化,充分发挥ssd随机读的高性能。

附图说明

通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。其中在附图中,参考数字之后的字母标记指示多个相同的部件,当泛指这些部件时,将省略其最后的字母标记。在附图中:

图1示出了现有技术中的数据写入模式的示意图;

图2示出了根据本发明的一个实施方式的存储资源组织的结构示意图;

图3示出了根据本发明的一个实施方式的容器的状态转换示意图;

图4示出了根据本发明的一个实施方式的数据写入方法的流程示意图;

图5示出了根据本发明的一个实施方式的数据写入方法的示意图;

图6示出了根据本发明的另一个实施方式的数据写入方法的示意图;

图7示出了根据本发明的依然另一个实施方式的数据写入方法的示意图;

图8示出了根据本发明的又一个实施方式的数据写入方法的示意图;

图9示出了根据本发明的依然另一个实施方式的数据写入方法的示意图;

图10示出了根据本发明的一个实施方式的数据写入设备的结构示意图;

图11示出了根据本发明的一个实施方式的io请求处理方法的示意图;

图12示出了根据本发明的一个实施方式的io请求处理方法的流程图;以及

图13示出了根据本发明的另一个实施方式的处理读写请求的方法的流程示意图。

在附图中,使用相同或类似的标号来指代相同或类似的元素。

具体实施方式

下面结合附图和具体的实施方式对本发明作进一步的描述。

图2示出了根据本发明的一个实施方式的存储资源组织的结构示意图。

如图2所示,容器是对ssd存储设备的存储空间部分的基本抽象。一个容器是一个带有raid功能的ssd存储单元。容器可以包含n个raid条带,每个raid条带由来自不同ssd的m个数据块构成(参看图2,m=4)。为了充分发挥多块ssd的并发性能,容器一次写入的最小单位是一个条带。容器的读操作没有大小限制。在单ssd模式下,容器可以退化成只包含一个条带,一个条带内一个数据块。

raid条带是ssd顺序写入的最小单位。利用顺序写入的单向性,分离读写请求,隔离读写请求的相互影响;利用ssd对顺序写入的友好性,尽可能减小ssd写前擦除的影响,最终使得系统中的擦除操作次数与写请求次数无关,只与写入数据量正相关。

图3示出了根据本发明的一个实施方式的容器四种状态及其转换的示意图。

如图3所示,容器包括四个状态,四个状态为空(empty)状态、活动(active)状态、只读(sealed)状态和无效(invalid)状态。

当容器为空(empty)状态时,容器不包含任何数据,可以投入使用。

当容器为活动(active)状态时,容器包含部分数据,容器可读可写。其中,已经在ssd上持久化的包含数据的条带只读;尚未持久化的不包含数据的条带可写。持久化指已经将数据写入ssd。

当容器为只读(sealed)状态时,容器所有的条带都已经写满数据、且持久化成功,容器只读。

当容器为无效(invalid)状态,此时容器所有的条带的数据都无效,通过对容器进行一次集中的修剪(trim)操作,容器中的存储资源将被全部释放。在可选的实施例中,无效(invalid)容器的资源直接归还ssd存储资源池,益处是整体过程统一,实现简单。在另一个可选的实施例中,将无效(invalid)容器直接变成空(empty)容器,循环投入使用,在容器使用频繁的场景中,此实施例会有比较好的性能。在又一个可选的实施例中,存储系统中维持一定数量的空(empty)容器供快速使用,剩余的无效(invalid)容器被修剪(trim)后,原属于该容器的全部条带资源直接被归还到ssd存储资源池中。

当一个容器创建成功后,容器进入空(empty)状态。当用户的写数据流到达时,为数据流分配容器,数据流写入容器,此时,容器状态转为活动(active)状态。当用户的数据流写满容器的全部存储单元时,容器状态转为只读(sealed)状态。只读(sealed)容器只接受读访问,不接受写访问。因此,对于只读(sealed)容器区间内的数据读请求访问将全部得到并行化执行,因而读请求能够获得最大性能支持。当只读(sealed)容器中的无效数据量超过一定程度时,容器中剩余的有效数据将被转移至其他活动(active)容器或者空(empty)容器中,只读(sealed)容器转化为无效(invalid)容器。无效(invalid)容器经过一次修剪(trim)擦除操作,重新转化为空(empty)状态,循环投入使用。这样,ssd设备的可持续使用得到良好的保证。

图4示出了根据本发明的一个实施方式的数据写入方法的流程示意图。图4所示的流程图仅仅是示意性的,其中记载的步骤可以并行执行、省略和/或增加其他步骤。图5示出了根据本发明的一个实施方式的数据写入方法的示意图。

如图4所示,数据写入方法包括以下步骤:

步骤s4100:将数据写入缓冲区,向写请求发出方应答写入成功;

步骤s4200:将缓冲区中的数据聚合成指定大小的数据集;

步骤s4300:将数据集顺序写入活动存储对象。

如图5所示,写请求的处理过程分为两个阶段,第一阶段由写请求与缓冲区之间的箭头表示;第二阶段由线程与容器之间的箭头表示。

结合图4和图5所示,在步骤s4100中,响应写请求,将数据写到缓冲区,向写请求发出方应答写入成功。在将数据写入到容器前向写请求发出方应答,降低了写操作的响应时间。进一步的,为了保证缓冲区的安全性,缓冲区可以用非易失内存设备nvdimm实现。可选的,写请求的数量可以为一个,也可以为多个。

结合图4和图5所示,利用第一线程组来执行步骤s4200和步骤s4300,第一线程组包括多个线程。优选地,每个线程绑定一个独立的cpu核,使得每个线程执行上述操作时不会被其他线程抢占其cpu资源。

在一个例子中,第一线程组在后台执行,定期的从缓冲区中抓取数据,抓取的这些数据可以来自多个写请求。所抓取的数据构成数据集(dataset)。如果一个数据集的大小等于容器条带大小时,就可以为这个数据集分配容器并写入所分配的容器。如果一个数据集的大小小于容器条带大小时,暂时不能将这个数据集写入容器,而等待来自更多写请求的数据以组成完整的数据集。如果一个数据集的大小大于容器条带大小时,则将等于条带大小的数据集部分写入容器,而将数据集的剩余部分写入其他一个或多个容器条带。

进一步地,响应于接收到修剪请求,将修剪请求所指定的存储对象设置为空或将修剪请求指定的存储对象的存储资源归还到存储资源池。存储资源池中记录了各个ssd中尚未分配容器的数据块或数据大块。作为举例,数据大块是预定大小的逻辑空间或物理空间连续的多个数据块。

由于不同类型的数据集可以根据不同的策略分配活动(active)容器,最终获得不同的性能收益。下面通过具体的实施例来进行说明。

实施例a

图6示出了根据本发明的另一个实施方式的数据写入方法的示意图。

如图6所示,响应于接收到写请求,将数据写到缓冲区,向写请求发出方应答写入成功。来自多个写请求的数据都被写入到缓冲区中。将缓冲区中的多个数据集混合写入同一个容器,直至容器写满。

在图6的实施例中,有线程601、线程602和线程603三个线程并发执行,这三个线程同时提取缓冲区的数据,所提取的数据构成数据集611、数据集612与数据集613,并将数据集写入到容器620。线程601从缓冲区的提取的数据构成一个或多个数据集611,线程602从缓冲区提取的数据构成一个或多个数据集612,以及线程603从缓冲区提取的数据构成一个或多个数据集613。

在图6的实施例中,同一时刻存在且仅存在一个活动容器620。只要容器620没有被写满,那么所有的线程即线程601、线程602和线程603三个线程都要往这个容器620里面写数据,直到容器620被写满为止。

为了保证正确性,线程往容器620里面写数据时,需要先给容器620加锁,获得容器620的独占使用权,然后再访问容器620,最后释放锁。例如,线程601获得容器620的使用权,将数据集611写入到容器620,然后释放容器620的使用权;线程602获得容器620的使用权,将数据集612写入到容器620,然后释放容器620的使用权;线程603获得容器620的使用权,将数据集613写入到容器620,然后释放容器620的使用权。需要理解的是,在多个例子中,线程601、线程602和线程603使用容器620的顺序是随机的。在图6的例子中,并发的数据写入操作,变成了串行的访问。图6的实施例可以最大程度的保证每个ssd的顺序写入。因此,每个ssd设备将收获最友好的写入性能,但是也引入多个线程对容器的内存锁竞争。

进一步地,将线程601、线程602和线程603各自绑定到一个cpu或cpu核,从而线程601、线程602和线程603在执行过程中不会被其他线程抢占cpu资源。在其他实施例中,提供不同数量的线程来处理从缓冲区提取数据并写入到活动容器的操作。

实施例b

图7示出了根据本发明的另一个实施方式的数据写入方法的示意图。

如图7所示,响应于接收到写请求,将数据写到缓冲区,向写请求发出方应答写入成功。来自多个写请求的数据都被写入到缓冲区中。

在图7的实施例中,有线程701、线程702和线程703三个线程并发执行,这三个线程同时提取缓冲区的数据,所提取的数据构成数据集711、数据集712与数据集713,并将数据集写入到活动容器721、活动容器722与活动容器723。线程701从缓冲区的提取的数据构成一个或多个数据集711,线程702从缓冲区提取的数据构成一个或多个数据集712,以及线程703从缓冲区提取的数据构成一个或多个数据集713。

在图7的实施例中,存在三个活动容器,即容器721、容器722与容器723。每个线程将数据集写入一个相对应的活动(active)容器,不同线程之间的并发数据集写入不同的活动(active)容器。线程701将一个或多个数据集711写入到容器721,线程702将一个或多个数据集712写入到容器722,线程703将一个或多个数据集713写入到容器723。以此方式,多个线程之间不必为争夺活动容器的使用权而频繁请求锁,能够同时发出多个活动容器访问请求,提高了io带宽利用率。在实施例b中,一个活动(active)容器内部的顺序写能够得到保证。

进一步地,将线程701、线程702和线程703各自绑定到一个cpu或cpu核,从而线程701、线程702和线程703在执行过程中不会被其他线程抢占cpu资源。在其他实施例中,提供不同数量的线程来处理从缓冲区提取数据并写入到活动容器的操作。

实施例c

图8示出了根据本发明的另一个实施方式的数据写入方法的示意图。

在图8的实施例中,n块ssd组成存储池,从存储池划出m个不同的逻辑设备给用户使用。逻辑设备可以由操作系统中的盘符或目录指示,可以由逻辑分区或文件系统指示。用户得到一个逻辑设备后,可以在这个逻辑设备上用不同的文件系统(例如ext4)进行格式化,就像使用一块磁盘一样。

逻辑设备上的数据散落分布在多个ssd上。优选地,通过多块ssd提供副本,这样可以保证可靠性;多块ssd间也有raid的关系,可以提高性能与可靠性。

用户发过来的写请求里面包含了逻辑设备的标识符。处理写请求时,写请求的数据和元数据(逻辑设备编号,逻辑设备偏移,数据块长度等)一起写入缓冲区。

在图8的实施例中,有线程8010、线程8020和线程8030三个线程并发执行,这三个线程同时提取缓冲区的数据,所提取的数据构成数据集,并将数据集写入到活动容器8211、活动容器8221与活动容器8231。线程8010从缓冲区的提取的数据构成一个或多个数据集(8110,8111,8112),线程8020从缓冲区提取的数据构成一个或多个数据集(8120,8121),以及线程8030从缓冲区提取的数据构成一个或多个数据集(8130,8131)。

在图8的实施例中,存在三个活动容器,即容器8211、容器8221与容器8231。每个线程将来自相同逻辑设备的数据集写入一个同该逻辑设备相对应的活动(active)容器,而来自不同逻辑设备数据集可以写入不同的活动(active)容器。

参看图8,由线程8010产生的数据集8110与由线程8020产生的数据集8120都来自对相同的逻辑设备(l1)的写请求,因而数据集8110与数据集8120被写入到活动容器8211。由线程8010产生的数据集8111、由线程8020产生的数据集8121与由线程8030产生的数据集8130都来自对相同的逻辑设备(l2)的写请求,因而数据集8111、数据集8121与数据集8130被写入到活动容器8221。由线程8010产生的数据集8112与由线程8030产生的数据集8131都来自对相同的逻辑设备(l3)的写请求,因而数据集8112与数据集8131被写入到活动容器8231。

在如图8所示的实施例c中,来自相同逻辑设备的写请求组成的数据集写入同一个活动(active)容器。从而可以获得最佳的数据局部性,良好的数据局部性可以减少后续读请求的下发次数,提高读io带宽利用率。因此,实施例c是一种对读应用场景优化的写模式。

在另一个实施例中,线程8010、线程8020和线程8030的每一个检测缓冲区中的逻辑地址连续的写请求,并将逻辑地址连续的写请求构成的多个数据集写入到相同的活动容器。

实施例d

图9示出了根据本发明的另一个实施方式的数据写入方法的示意图。

n块ssd组成存储池,从存储池划出m个不同的逻辑设备给用户使用。逻辑设备可以由操作系统中的盘符或目录指示,可以由逻辑分区或文件系统指示。在实施例d中,每个线程维护一组独立的容器,一个容器属于一个独立的逻辑设备。使得线程之间没有共享的容器,消除了关于容器的并发竞争。一个容器里包含的全部数据都来自一个逻辑设备,这就保证了容器上的数据局部性。当线程获取到一组写请求后,一个数据集中的数据来自对应于同一个逻辑设备的写请求,并将该数据集写入逻辑设备对应的容器中。

在图9的实施例中,有线程9010、线程9020和线程9030三个线程并发执行,这三个线程同时提取缓冲区的数据,所提取的数据构成数据集,并将数据集写入到活动容器。线程9010从缓冲区的提取的数据构成一个或多个数据集(9110,9111,9112),线程9020从缓冲区提取的数据构成一个或多个数据集(9120,9121),以及线程9030从缓冲区提取的数据构成一个或多个数据集(9130,9131)。

在图9的实施例中,存在多个活动容器,即容器9211、容器9212容器9221、容器9222、容器9223、容器9231、容器9233等。每个线程将来自相同逻辑设备的数据集写入一个同该逻辑设备相对应且由该线程所独占的活动(active)容器,而来自不同逻辑设备数据集可以写入不同的活动(active)容器。

参看图9,线程9010独占容器9211、容器9221与容器9231,其他线程不会向为线程9010所独占的活动容器写入数据。由线程9010产生的数据集9110、数据集9111与数据集9112分别来自对逻辑设备(l11)、逻辑设备(l12)与逻辑设备(l13)的写请求。线程9010基于数据集9110来自对逻辑设备(l11)的写请求,而将数据集9110写入活动容器9211;线程9010基于数据集9111来自对逻辑设备(l12)的写请求,而将数据集9011写入活动容器9221;线程9010基于数据集9112来自对逻辑设备(l13)的写请求,而将数据集9012写入活动容器9231。

线程9020基于数据集9120来自对逻辑设备(l21)的写请求,而将数据集9120写入活动容器9212;线程9020基于数据集9121来自对逻辑设备(l22)的写请求,而将数据集9121写入活动容器9222。

线程9030基于数据集9130来自对逻辑设备(l31)的写请求,而将数据集9130写入活动容器9223;线程9030基于数据集9131来自对逻辑设备(l32)的写请求,而将数据集9131写入活动容器9233。

在另一个例子中,来自相同逻辑设备的数据被并发写入多个活动容器中,以充分利用ssd的并发处理能力,并保证多个线程之间没有共享的容器,以消除关于容器的并发竞争。例如,线程9010基于数据集9110来自对逻辑设备(l1)的写请求,而将数据集9110写入活动容器9211;线程9010基于数据集9111来自对逻辑设备(l2)的写请求,而将数据集9111写入活动容器9221;线程9010基于数据集9112来自对逻辑设备(l3)的写请求,而将数据集9112写入活动容器9231。线程9020基于数据集9120来自对逻辑设备(l1)的写请求,而将数据集9120写入活动容器9212;线程9020基于数据集9121来自对逻辑设备(l2)的写请求,而将数据集9121写入活动容器9222。线程9030基于数据集9130来自对逻辑设备(l3)的写请求,而将数据集9130写入活动容器9223;线程9030基于数据集9131来自对逻辑设备(l3)的写请求,而将数据集9131写入活动容器9233。

在另一个实施例中,线程9010、线程9020和线程9030的每一个检测缓冲区中的来自访问相同逻辑设备的逻辑地址连续的写请求,并将访问相同逻辑设备的逻辑地址连续的写请求构成的多个数据集写入到相同的活动容器。

在依然另一个实施例中,基于数据的特点选择写入数据的数据集。数据的热度是数据特点之一。应用对数据的访问频度是不均衡的,具有访问局部性的特征。某个热点数据可能被频繁访问,有些数据可能热度较低,只是被偶尔访问。当然,冷热数据的划分不是绝对的,也要考虑时间变化的效应。线程9010、线程9020和线程9030的每一个检测缓冲区中的来自访问相同逻辑设备的数据特点,并将访问相同逻辑设备的将被频繁访问的逻辑地址的写请求构成的多个数据集写入到相同的活动容器,以及将访问相同逻辑设备的将被低频访问的逻辑地址的写请求构成的多个数据集写入到相同的活动容器。从而,对于热点数据集,可以选择将数据写入热容器中。对于冷数据集,可以选择将数据写入冷容器中。一旦数据的热度发生变化,冷数据可以选择迁移至热容器中,热容器也可以因为数据访问频度的降低降级成冷容器中。

根据本发明的另一方面,还提供了一种数据写入设备,如图10所示,该设备包括:用于将数据写入缓冲区,向写请求发出方应答写入成功的装置1010;用于将缓冲区中的数据聚合成指定大小的数据集的装置1020;以及用于将数据集顺序写入活动存储对象的装置1030。

图11示出了根据本发明的另一个实施方式的io请求处理方法的示意图。图12示出了根据本发明的另一个实施方式的io请求处理方法的流程图。

如前所述,当诸如应用程序的io请求发出方首次写某个数据块时,将数据块先写入缓冲区,并向io请求发出方回复写数据成功。此过程有利于对应用写请求的快速响应。而后台写线程从内存缓冲区中读出数据,为数据分配空(empty)容器(如图3所示)或者活动(active)容器(如图3所示)。一旦数据块大小凑满一个容器的条带,后台写线程会对容器的条带进行持久化操作。持久化成功后,后台写线程清除内存缓冲区的数据块。

因而,在不同时间,被写入的数据会存储在不同的位置。在处理读请求时,根据数据存储位置的不同,选择从以不同的方式获取数据。一般而言,由dram等存储介质提供缓冲区,而由ssd等存储设备提供容器,dram的响应读请求的速度远高于ssd,因而,参看图11,在缓冲区中有所读取数据的副本时,优先从缓冲区中获取数据。当待读取数据位于缓冲区时,从缓冲区中获取待读取数据,而当待读取数据已经被写入容器时,从容器中读取待读取数据。

如图12所示,在接收到读请求时,判断待读取数据的存储位置(s1210);若待读取数据尚未被分配容器,从缓冲区中获取待读取数据(s1220);若已经为待读取数据分配容器,且容器处于活动状态,但待读取数据尚未完成持久化,则从缓冲区中获取待读取数据(s1230);若已经为待读取数据分配容器,且容器处于活动状态,且已经对待读取数据完成持久化,从为待读取数据分配的容器中获取待读取数据(s1240);以及若已经为待读取数据分配容器,且容器处于只读状态,从为所读取分配的容器中获取待读取数据(s1250)。

结合图11和图12所示,在步骤s1220中,对于尚未分配活动(active)容器的数据集,读请求将直接从数据缓冲区中获取数据。在步骤s1230中,对于已经分配活动(active)容器,但尚未被写入容器的数据集,读请求将直接从缓冲区中获取数据。在步骤s1240中,对于已经分配活动(active)容器,且已经被写入容器数据集,读请求将被直接发送至ssd。此时,待读取数据集所在容器的条带为只读条带,读过程中不会受到ssd擦除操作的影响,因此,读请求可以获得ssd设备的最大性能支持。在步骤s1250中,对于属于只读(sealed)容器的数据集,读请求将被直接发送至ssd。此时,数据集所在的容器为只读容器,读过程中不会受到数据写入操作的影响,因此,对读请求的处理可以使ssd发挥最大性能。

应用发出读请求时,应用只能同步的等待读请求结果。因此,在处理应用的读请求时,立刻处理单个读请求,不进行多个读请求的聚合。ssd有很高的随机读性能,因此,应用的读请求,只要数据已经存储在ssd上,立刻发往ssd;若数据没有持久化到ssd上,直接在内存缓冲区中处理。所以,对于读数据来说,数据要么在内存中,要么在ssd上。在ssd上的数据,要么在只读(seald)容器上,要么在活动(active)容器里面已经持久化的条带中;但是不管怎样,只要在ssd上的数据,一定是在容器的只读区域;基本不会发生读写碰撞的情况。所以这样的设计,充分发挥了ssd随机读的高性能,又减少了读写碰撞。

图13示出了根据本发明的另一个实施方式的处理读写请求的方法的流程示意图。图13所示的流程图仅仅是示意性的,其中记载的步骤可以并行执行、省略和/或增加其他步骤。

如图13所示,处理读写请求的方法包括以下步骤:

步骤s13100:接收写请求;

步骤s13200:将写请求的数据写入缓冲区,向写请求发出方应答写请求完成;

步骤s13300:将写请求对应的数据写入活动存储对象;

步骤s13400:接收读请求,所述读请求要读取第一数据,

步骤s13500:判断已经为第一数据分配存储对象,且存储对象是只读状态,则从为第一数据分配的只读存储对象获取第一数据。

图13示出的是同时接收到写请求与读请求的实施方式,在步骤s13500中,数据集所在的容器为只读容器,读过程中不会受到数据写入操作的影响,因此,读请求和写请求可以获得ssd设备的最大性能支持。

应该理解,框图和流程图的每个框以及框图和流程图的框的组合可以分别由包括计算机程序指令的各种装置来实施。这些计算机程序指令可以加载到通用计算机、专用计算机或其他可编程数据控制设备上以产生机器,从而在计算机或其他可编程数据控制设备上执行的指令创建了用于实现一个或多个流程图框中指定的功能的装置。

这些计算机程序指令还可以存储在可以引导计算机或其他可编程数据控制设备的计算机可读存储器中从而以特定方式起作用,从而能够利用存储在计算机可读存储器中的指令来制造包括用于实现一个或多个流程图框中所指定功能的计算机可读指令的制品。计算机程序指令还可以加载到计算机或其他可编程数据控制设备上以使得在计算机或其他可编程数据控制设备上执行一系列的操作步骤,从而产生计算机实现的过程,进而在计算机或其他可编程数据控制设备上执行的指令提供了用于实现一个或多个流程图框中所指定功能的步骤。

因而,框图和流程图的框支持用于执行指定功能的装置的组合、用于执行指定功能的步骤的组合和用于执行指定功能的程序指令装置的组合。还应该理解,框图和流程图的每个框以及框图和流程图的框的组合可以由执行指定功能或步骤的、基于硬件的专用计算机系统实现,或由专用硬件和计算机指令的组合实现。

上述的不同块、操作以及技术的至少一部分可以被执行,通过使用硬件,控制设备执行固件指令,控制设备执行软件指令,或者及其任意组合。当采用执行固件以及软件指令的控制设备执行时,软件或固件指令可以被存储在任意计算机可读存储介质中,例如磁盘,光盘或者其他存储介质,在ram或者rom或者flash存储器,控制设备,硬盘,光盘,磁盘等等。同样地,软件和固件指令可以被传输到用户或者系统,通过任意已知的或者期望的传输方式包括,例如,在计算机可读盘或者其他便携式计算机存储机制或者通过通信媒介。通信媒介典型地具体化计算机可读指令,数据结构,序模块或者在已调制数据信号中的其它数据例如载波或者其他传输机制。通过示例,并非限制,通信介质包括有线介质例如有线网络或者单线连接,以及无线媒介,例如声、无线频率,红外以及其它无线介质。从而,软件和固件指令可以被传输给用户或者系统,通过通信信道,例如电话线,dsl线,电缆电视线,光纤线缆,无线信道,因特网,等等(通过便携式存储介质提供这样的软件,其被看作是相同的或者可互换的)。软件或者固件指令可以包括机器可读指令,这些可读指令在由控制设备执行时,导致控制设备执行不同动作。

当在硬件中执行时,硬件可以包括一个或多个离散组件,集成电路,应用的集成电路(asic),等等。

需要理解的是,本发明可以以纯软件、纯硬件、固件以及上述的各种组合来实现。硬件例如可以是控制设备、专用集成电路、大规模集成电路等等。

虽然当前发明参考的示例被描述,其只是为了解释的目的而不是对本发明的限制,对实施方式的改变,增加和/或删除可以被做出而不脱离本发明的范围。

这些实施方式所涉及的、从上面描述和相关联的附图中呈现的教导获益的领域中的技术人员将认识到这里记载的本发明的很多修改和其他实施方式。因此,应该理解,本发明不限于公开的具体实施方式,旨在将修改和其他实施方式包括在所附权利要求书的范围内。尽管在这里采用了特定的术语,但是仅在一般意义和描述意义上使用它们并且不是为了限制的目的而使用。

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