具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
首先,为了使本领域技术人员更好的理解本发明,下面对本发明实施例中涉及的概念进行简要介绍:
RAID组,由存储设备上的至少2个SSD组成,RAID组中的每个SSD包含有一个空闲DU(Disk Unit,硬盘单元)队列,每个空闲DU队列中有一个空闲DU处于待接收数据的状态,以使各SSD接收数据的机会均等。例如,RAID组中包括4个SSD,则需维护4个空闲DU队列。
分条深度,RAID组SSD上的分区可以进一步细分为更小的段,这些更小的段被称为分块。假如分块属于一个分区,而分区又属于一个阵列,那么,分块的长度称为分条深度。
LUN(Logic Unit Number,逻辑单元号),是在RAID组中的基础上创建的,1个RAID组对应至少1个LUN(一般情况下1个RAID组对应1个LUN),LUN相对于存储设备来讲是逻辑设备。当网络中的主机连接到存储设备时,就可以识别到LUN。本发明实施例中,在将主机下发的写请求写入存储设备之前,将写请求主机下发的随机小写请求转化为顺序写操作,从而提高SSD写性能。
全页日志结构管理模式,是指以页(每页容量为4K)为基本单位向SSD下发数据。该模式下,每个LUN维护一张映射表,映射表里的每个表项对应一个页。映射表用于实现从逻辑页(即主机可见空间页)到物理页的转换,假设LUN的容量为2T,那么映射表里就有2T/4K=512M个表项。每个表项具有两个域,其中一个域用于指向当前逻辑页对应的物理页(即当前逻辑页具体存放在哪个物理页上);另一个域用于指向与当前逻辑页页号相同的物理页被哪个逻辑页引用。
垃圾回收,由于LUN的空间是有限的,为了实现垃圾回收,为每个LUN创建一张垃圾回收表,该表中的每一项对应主机可见空间中的一个DU(例如为4M),也就是说对于2T的LUN垃圾回收表里共有2T/4M=512K个表项,每个表项有3个字段,第一个字段是一个struct btree结构的变量,struct btree结构用于维护以DU中的无效页数为键值的二叉查找树,其定义如下:
struct btree
{
struct btree*father;
struct btree*leftchild;
struct btree*rightchild;
unsigned int InvalidPageSum;
};
垃圾回收时取出二叉查找树中最右端的至少一个节点,回收这些节点对应的DU即可。为了保证二叉查找树按序排列,DU中的无效页数一旦改变,需要调整二叉查找树,所以这里记录了每个节点的左孩子节点(leftchild)、右孩子节点(rightchild)和父亲节点(father);第2个字段是一个struct list_head结构的变量,该字段用于维护空闲DU队列;第3个字段是DU中页的位图,DU中某个页一旦无效我们就置其在位图中对应的比特位为1,若DU的大小为4M,则一个DU有1024个页,需要1024个比特即128个字节构成位图,垃圾回收时可通过位图中的比特位确定DU中哪些页有效(位图中的比特位为1),从而将有效页搬移,实现DU的回收。
实施例一、
参见图1,为本发明实施一提供的写数据的方法流程图,该方法包括:
S101:获取当前指针所指向的DU(硬盘单元)。
例如,***中有SSD0-SSDX(其中X为大于等于1的整数),按照预设大小(如4MB)的DU对SSD进行等分,对构建的RAID组(如RAID0)中的每个SSD维护一个空闲DU队列,用于接收待写入数据;同时还维护一个当前指针,用于指向待写入数据当前时刻应该下发到哪一个待接收数据的DU中。若RAID0包括4个SSD,每一时刻都会有4个来自不同SSD的DU用于接收待写入数据,如4个来自不同SSD的包括:DU0,DU4,DU8和DU12,当前指针指向DU0,则获取当前指针所指向的DU0。
S102:确定待写入数据预占用的空间是否超过预设的分条深度,当待写入数据预占用的空间未超过预设的分条深度时,执行S103;否则,待写入数据预占用的空间超过预设的分条深度时,执行S104。
例如,预设的分条深度可以为16K;待写入数据为主机下发的写请求,一个写请求为主机串口一次发送出的数据,当一个写请求所占空间大于16K时,确定该写请求超过预设的分条深度,当一个写请求所占空间小于16K时,确定该写请求未超过一个分条深度。
S103:当待写入数据预占用的空间未超过预设的分条深度时,将待写入数据以页为单位写入当前指针所指向的DU所属的固态硬盘SSD中。
例如,待写入数据所占空间大小未超过16K,当前指针所指向的DU为DU0,则在DU0所属SSD(当前SSD)中以页为单位写入待写入数据。
其中,SSD中待写入数据的具体的物理页由当前指针、维护的逻辑页与物理页的映射表、以及DU号共同决定。
S104:当待写入数据预占用的空间超过预设的分条深度时,将待写入数据以页为单位写入所述DU所属的廉价冗余磁盘阵列RAID组的至少两个SSD中。
例如,待写入数据预占用空间大小超过16K,当前指针所指向的DU为DU0,则在DU0所属SSD(当前SSD),以及当前SSD之后的一个SSD中以页为单位写入待写入数据。
其中,RAID组中的每个SSD对应一个空闲DU队列,每一时刻每个SSD从对应的空闲队列中提供一个待接收数据的空闲DU。
其中,当前指针的指向采用轮循的方式,即当前指针指向的DU所属SSD被写满,或者超过预设的阈值时,指针将指向RAID组中下一个SSD提供的待接收数据的DU。
本实施例中,在存储***中写入数据时,获取维护的当前指针所指向的DU,当待写入数据预占用的空间未超过预设的分条深度时,将待写入数据以页为单位写入DU所属的固态硬盘SSD中;当待写入数据预占用的空间超过预设的分条深度时,将待写入数据以页为单位写入当前指针所指向的DU所属的RAID组的至少两个SSD中。可见,数据是按顺序写入SSD的,相对于将数据随机写入SSD,提高了SSD的写性能。
下面分别对待写入数据超过分条深度和未超过分条深度的情况进行详细说明。
实施例二、
参见图2,为本发明实施二提供的写数据的方法流程图,该方法包括:
S201:获取当前指针所指向的DU。
例如,待接收数据的DU包括:DU0、DU4、DU8和DU12,当前指针指向DU0,则获取当前指针所指向的DU0。
S202:若待写入数据预占用空间未超过预设的分条深度(如16K),确定当前指针所指向的DU中剩余页的空间是否大于待写入数据预占用的空间,若是,执行S203;否则,执行S204。
S203:在当前指针所指向的DU中以页为单位写入待写入数据。
例如,待接收数据的DU包括:DU0,DU4,DU8和DU12,当前指针指向DU0,待写入数据未超过预设的分条深度,且DU0剩余页足够写入待写入数据,则以页为单位将待写入数据写入DU0。
S204:在当前指针所指向的DU中以页为单位写入待写入数据,若当前指针所指向的DU被写满时,从当前指针指向的DU所属SSD的空闲DU队列中重新分配一个DU,在重新分配的DU中以页为单位写入剩余的待写入数据,且将当前指针所指的方向移到RAID组中下一个SSD提供的DU。
例如,待接收数据的DU包括:DU0,DU4,DU8和DU12,当前指针指向DU0,待写入数据未超过预设的分条深度,且DU0剩余页的空间小于待写入数据,则以页为单位将待写入数据写入DU0,当DU0写满时,从维护的DU0所属SSD空闲队列中重新分配一个DU1,在DU1中以页为单位写入剩余的待写入数据。
至此,已完成了当待写入数据已超过分条深度时,将待写入数据写入SSD的过程。在具体的实施过程中,S203或者S204之后,还可以包括:
获取写入待写入数据后的SSD中存放该待写入数据的当前逻辑页,更新维护该逻辑页的映射表表项。
具体包括如下过程:(1)根据当前逻辑页映射表表项的第一个域(用于指向当前逻辑页真实存放在哪个物理页上),获得原来存放当前逻辑页中数据的物理页页号(旧物理页页号)。(2)若当前逻辑页映射表表项的第一个域为0xffffffff,则将选中DU中用于存放当前逻辑页的物理页页号赋给该域;若不为0xffffffff,说明当前逻辑页曾经存放在其它物理页上,此时先根据(1)中获得的旧物理页页号查找与该物理页页号相同的逻辑页的映射表表项,并将该表项的第二个域(用于指向与当前逻辑页页号相同的物理页被哪一个逻辑页引用)置为0xffffffff,表明该物理页无效了,再根据旧物理页页号获得其所在DU在垃圾回收表中的表项,更新该表项中二叉查找树节点的无效页计数值并调整其在树中的位置,同时将表项的页位图中对应比特位置为1,最后将选中DU中用于存放当前逻辑页的物理页页号赋给当前逻辑页映射表表项的第一个域。(3)根据选中DU中用于存放当前逻辑页的物理页页号获得与其页号相同的逻辑页的映射表表项,并更新该表项的第二个域(用于指向与当前逻辑页页号相同的物理页被哪一个逻辑页引用),将当前主机写请求的逻辑页页号赋给该域。
本实施例中,考虑到LUN的空间是有限的,为了使得数据写入各个SSD的机会均等,可以预先定义SSD中已使用DU的阈值,如果***在运行过程中,某一个SSD已使用DU数超过上限阈值时,***将启动后台垃圾回收线程,回收DU。在回收DU时,回收线程将确定***当前是否繁忙,如果繁忙,则回收线程只针对每个SSD回收一个DU;如果***空闲,则回收线程将对每个SSD进行连续回收直到每个SSD的已使用DU数低于下限阈值。
下面针对一个SSD的DU回收过程进行描述:在对每个盘进行DU回收时,***首先从当前盘的二叉查找树中摘除最右端节点(通过一个struct btree类型的指针指向该节点),也就是无效页计数值最大的节点,然后根据该节点father字段所在的内存地址减去垃圾回收表的起始地址再除以每个垃圾回收表表项的尺寸(152B)即可确定出待回收DU的序号,接着根据该DU的序号在映射表中找到与其覆盖的所有物理页具有相同页号的逻辑页的映射表表项,然后结合该DU垃圾回收表表项中的页位图,将该DU中有效的页(位图中对应比特位为0)搬移到当前指针指向的待接收DU中(垃圾回收时将根据位图每次搬移一个连续有效页段的数据),在对每个页搬移完成后,根据与待回收DU中当前物理页页号相同的逻辑页的映射表表项的第二个域(用于指向与当前逻辑页页号相同的物理页被哪一个逻辑页引用),找到引用该物理页的逻辑页,并将该逻辑页映射表表项的第一个字段(用于指向当前逻辑页真实存放在哪一个物理页上)更新为当前指针指向的待接收DU中当前写入数据的物理页的页号,最后将与待回收DU中当前物理页页号相同的逻辑页的映射表表项的第二个域置为0xffffffff。当待回收DU中的所有有效页都被成功搬移后,就将其***空闲DU队列的尾部,并将当前SSD的已使用DU计数值减1。
本实施例实现了待写入数据预占用空间未超过预设的分条深度时,将待写入数据写入SSD的过程,在整个过程中,由于数据是以页为单位顺序写入SSD的,相对于随机小写,提高了SSD的写性能。
实施例三、
参见图3,为本发明实施三提供的写数据的方法流程图,该方法包括:
S301:获取当前指针所指向的DU。
例如,待接收数据的DU包括:DU0、DU4、DU8和DU12,当前指针指向DU0,则获取当前指针所指向的DU0。
S302:若待写入数据预占用空间超过预设的分条深度(如16K),将待写入数据划分为第一待写入数据和第二待写入数据,且确定当前指针所指向的DU中剩余页的空间是否大于第一待写入数据预占用的空间,若是,执行S303;否则,执行S306。
S303:当前指针所指向的DU中剩余页的空间大于第一待写入数据预占用的空间时,进一步确定当前时刻下一个待接收数据的DU中剩余页的空间是否大于第二待写入数据预占用的空间,若是,执行S304;否则,执行S305。
S304:将第一待写入数据以页为单位写入当前指针所指向的DU中,将第二待写入数据以页为单位写入除当前指针所指向的DU外当前时刻下一个待接收数据的DU中。
例如,待接收数据的DU包括:DU0,DU4,DU8和DU12,当前指针指向DU0,待写入数据预占用空间超过预设的分条深度,将待写入数据划分为第一待写入数据和第二待写入数据,若DU0剩余的页足够写入第一待写入数据,DU4剩余的页足够写入第二待写入数据,则以页为单位将第一待写入数据写入DU0,以页为单位将第二待写入数据写入DU4。
S305:将第一待写入数据以页为单位写入当前指针所指向的DU中,将第二待写入数据以页为单位写入除当前指针所指向的DU外当前时刻下一个待接收数据的DU中,当接收第二待写入数据的DU被写满时,从该DU所属SSD的空闲队列中重新分配一个DU,在重新分配的DU中以页为单位写入剩余的第二待写入数据。
例如,待接收数据的DU包括:DU0,DU4,DU8和DU12,当前指针指向DU0,待写入数据预占用空间超过预设的分条深度,将待写入数据划分为第一待写入数据和第二待写入数据,若DU0剩余的页足够写入第一待写入数据,DU4剩余的页不够写入第二待写入数据,则以页为单位将第一待写入数据写入DU0,以页为单位将第二待写入数据写入DU4,当DU4中所有页都写满时,从维护的DU4所属SSD的空闲队列中重新分配一个DU5,用来接收第二待写入数据中剩余的部分。
S306:当前指针所指向的DU中剩余页的空间小于第一待写入数据预占用的空间时,进一步确定除当前指针指向的DU外,当前时刻下一个待接收数据的DU中剩余页的空间是否大于第二待写入数据预占用的空间,若是,执行S307;否则,执行S308。
S307:将第一待写入数据以页为单位写入当前指针所指向的DU中,若当前指针所指向的DU被写满时,从当前指针指向的DU所属SSD的空闲DU队列中重新分配一个DU,将剩余的第一待写入数据以页为单位写入重新分配的DU中,且将当前指针所指的方向移到RAID组中当前SSD之后,下一个SSD提供的DU;将第二待写入数据以页为单位写入除当前指针所指向的DU外,当前时刻下一个待接收数据的DU中。
例如,待接收数据的DU包括:DU0,DU4,DU8和DU12,当前指针指向DU0,待写入数据预占用空间超过预设的分条深度,将待写入数据划分为第一待写入数据和第二待写入数据,若DU0剩余的页不够写入第一待写入数据,DU4剩余的页足够写入第二待写入数据,则以页为单位将第一待写入数据写入DU0,当DU0写满时,从DU0所属SSD的空闲队列中重新分配一个DU1,接收第一待写入数据中剩余的部分;以页为单位将第二待写入数据写入DU4。
S308:将第一待写入数据以页为单位写入当前指针所指向的DU中,若当前指针所指向的DU被写满,从当前指针所指向的DU所属SSD的空闲DU队列中重新分配一个DU,将剩余的第一待写入数据以页为单位写入重新分配的DU中,将第二待写入数据以页为单位写入除当前指针指向的DU外,当前时刻下一个待接收数据的DU中,当接收第二待写入数据的DU被写满时,从该被写满DU所属的SSD的空闲队列中重新分配一个DU,将剩余的第二待写入数据以页为单位写入重新分配的DU中。
例如,待接收数据的DU包括:DU0,DU4,DU8和DU12,当前指针指向DU0,待写入数据预占用空间超过预设的分条深度,将待写入数据划分为第一待写入数据和第二待写入数据,若DU0剩余页的不够写入第一待写入数据,且DU4剩余的页不够写入第二待写入数据,则以页为单位将第一待写入数据写入DU0,当DU0写满时,从DU0所属SSD的空闲队列中重新分配一个DU1,接收第一待写入数据中剩余的部分;以页为单位将第二待写入数据写入DU4,当DU4写满时,从DU4所属SSD的空闲队列中重新分配一个DU5,接收第二待写入数据中剩余的部分。
本实施例描述了将第二待写入数据写入除当前指针指向的DU外,当前时刻下一个待接收数据的DU中的情况,在具体的实施例过程中,还可以将第二待写入数据写入除当前指针指向的DU外,至少2个当前时刻待接收数据的DU中,例如,将第一待写入数据写入DU0,将第二待写入数据分发到DU4、DU8、和DU12中。
可以理解的是,在S304、S305、以及S308具体的实施过程中,待写入数据还可以有其它不同的划分方式,例如将待写入数据划分为:第一待写入数据、第二待写入数据、第三待写入数据和第四待写入数据。相应的,将划分后的数据写入DU的过程包括:以页为单位将第一待写入数据写入DU0;以页为单位将第二待写入数据写入DU4;以页为单位将第三待写入数据写入DU8;以页为单位将第四待写入数据写入DU12。
至此,已完成了当待写入数据未超过分条深度时,将待写入数据写入SSD的过程。在具体的实施过程中,S304、或者S305、或者S307、或者S308之后还可以包括:
获取写入待写入数据后的SSD中存放该待写入数据的当前逻辑页,更新维护的该逻辑页的映射表表项。
具体的,该映射表表项具有两个域:一个域用于指向真实存放当前逻辑页的物理页,另一个域用于指向引用与当前逻辑页页号相同的物理页被哪一个逻辑页引用。具体的实施例过程可参考实施例二中的描述,此处不再赘述。
本实施例中,考虑到LUN的空间是有限的,为了使得数据写入各个SSD的机会均等,可以预先定义SSD中已使用DU的阈值,如果***在运行过程中,某一个SSD已使用DU数超过上限阈值时,***将启动后台垃圾回收线程,回收DU。在回收时,回收线程将确定***当前是否繁忙,如果繁忙,则回收线程只针对每个SSD回收一个DU;如果***空闲,则回收线程将对每个SSD进行连续回收直到每个SSD的已使用DU数低于下限阈值。关于针对一个SSD的DU回收过程的描述可参考实施例二,此处不再赘述。
本实施例实现了待写入数据预占用空间超过预设的分条深度时,将待写入数据以页为单位写入SSD的过程,在此个过程中,由于数据是顺序写入SSD的,相对于随机小写,提高了SSD的写性能。
下面对本发明实施例提供的基于全页日志结构管理模式的写数据的装置进行描述。
实施例四、
参见图4,为本发明实施例四提供的一种写数据的装置示意图,该装置包括:
获取单元401,用于获取当前指针所指向的DU(硬盘单元)。
例如,***中有SSD0-SSDX(其中X为大于等于1的整数),按照预设大小(如4MB)的DU对SSD进行等分,对构建的RAID组(如RAID0)中的每个SSD维护一个空闲DU队列,用于接收待写入数据;同时还维护一个当前指针,用于指向待写入数据当前时刻应该下发到哪一个待接收数据的DU中。若RAID0包括4个SSD,每一时刻都会有4个来自不同SSD的DU用于接收待写入数据,如4个来自不同SSD的包括:DU0,DU4,DU8和DU12,当前指针指向DU0,则获取当前指针所指向的DU0。
写操作单元402,用于当待写入数据预占用的空间未超过预设的分条深度时,将待写入数据以页为单位写入所述DU所属的固态硬盘SSD中;当待写入数据预占用的空间超过预设的分条深度时,将待写入数据以页为单位写入所述DU所属的廉价冗余磁盘阵列RAID组中的至少两个SSD中。
例如,预设的分条深度可以为16K;待写入数据为主机下发的写请求,一个写请求为主机串口一次发送出的数据,当一个写请求所占空间大于16K时,即该写请求超过预设的分条深度,将该待写入数据以页为单位写入所述DU所属的固态硬盘SSD中;当一个写请求所占空间小于16K时,即该写请求未超过分条深度,将待写入数据以页为单位写入所述DU所属的廉价冗余磁盘阵列RAID组中的至少两个SSD中。
本实施例中,获取单元401获取当前指针所指向的DU,当待写入数据预占用的空间未超过预设的分条深度时,写操作单元402将待写入数据以页为单位写入当前指针所指向的DU所属的固态硬盘SSD中;当待写入数据预占用的空间超过预设的分条深度时,写操作单元402将待写入数据以页为单位写入获取单元401获取的DU所属的RAID组的至少两个SSD中。由于数据是顺序写入SSD的,因此相对于将待写入数据随机写入SSD,提高了SSD的写性能。
实施例五、
参见图5,为本发明实施例五提供的一种写数据的装置示意图,该实施例相对于实施例四,还包括:
维护单元501,用于对RAID组的每个SSD维护一个空闲DU队列,每个空闲DU队列中有一个空闲DU处于待接收数据的状态。
本发明实施例中的写操作单元402可以为第一写操作子单元502,用于确定待写入数据预占用的空间未超过预设的分条深度时,在当前指针所指向的DU中以页为单位写入待写入数据,若当前指针所指向的DU被写满,从当前指针所指向的DU所属SSD的空闲DU队列中重新分配一个DU,在重新分配的DU中以页为单位写入剩余的待写入数据。
例如,待接收数据的DU包括:DU0,DU4,DU8和DU12,当前指针指向DU0,待写入数据未超过预设的分条深度,且DU0剩余页的空间小于待写入数据,则以页为单位将待写入数据写入DU0,当DU0写满时,从维护的DU0所属SSD空闲队列中重新分配一个DU1,在DU1中以页为单位写入剩余的数据。
该实施例相对于实施例四,实现了待写入数据预占用的空间未超过预设的分条深度,在当前指针所指向的DU中顺序写入待写入数据,以提高SSD写性能的过程。
实施例六、
参见图6,为本发明实施例六提供的一种写数据的装置示意图,该实施例相对于实施例四,还包括:
维护单元501,用于对RAID组的每个SSD维护一个空闲DU队列,每个空闲DU队列中有一个空闲DU处于待接收数据的状态。
本发明实施例中的写操作单元402可以包括:
划分子单元601,用于确定待写入数据预占用的空间超过预设的分条深度时,将待写入数据划分为第一待写入数据和第二待写入数据。
第二写操作子单元602,用于将第一待写入数据以页为单位写入当前指针所指向的DU中,若当前指针所指向的DU被写满,从当前指针所指向的DU所属SSD的空闲DU队列中重新分配一个DU,将剩余的第一待写入数据以页为单位写入重新分配的DU中;将第二待写入数据以页为单位写入除当前指针所指向的DU外至少一个当前时刻待接收数据的DU中,若接收第二待写入数据的DU被写满时,从该被写满的DU所属的SSD的空闲队列中重新分配一个DU,将剩余的第二待写入数据以页为单位写入重新分配的DU中。
例如,在当前指针所指向的DU中剩余页的空间大于第一待写入数据预占用的空间,且维护单元501维护的待接收数据的DU中除当前指针指向的DU外,当前时刻下一个待接收数据的DU中剩余页的空间大于第二待写入数据预占用的空间的情况下,第二写操作子单元602在当前指针所指向的DU中以页为单位写入第一待写入数据,在维护单元501维护的待接收数据的DU中除当前指针所指向的DU外,当前时刻下一个待接收数据的DU中以页为单位写入第二待写入数据;以及
在当前指针所指向的DU中剩余页的空间大于第一待写入数据预占用的空间,且维护单元501维护的待接收数据的DU中除当前指针指向的DU外,当前时刻下一个待接收数据的DU中剩余页的空间小于第二待写入数据预占用的空间的情况下,第二写操作子单元602在当前指针所指向的DU中以页位单位写入第一待写入数据,在维护单元501维护的待接收数据的DU中除当前指针指向的DU外,当前时刻下一个待接收数据的DU中以页为单位写入第二待写入数据,当接收第二待写入数据的DU被写满时,从该被写满的DU所属的SSD的空闲队列中重新分配一个DU,在重新分配的DU中以页为单位写入剩余的第二待写入数据;以及
在当前指针所指向的DU中剩余页的空间小于第一待写入数据预占用的空间,且维护单元501维护的待接收数据的DU中除当前指针指向的DU外,当前时刻下一个待接收数据的DU中剩余页的空间大于第二待写入数据预占用的空间的情况下,第二写操作子单元602在当前指针所指向的DU中以页为单位写入第一待写入数据,前指针所指向的DU被写满后,从前指针所指向的DU所属SSD的空闲DU队列中重新分配一个DU,在重新分配的DU中以页为单位写入剩余的第一待写入数据,在维护单元501维护的待接收数据的DU中除当前指针所指向的DU外,当前时刻下一个待接收数据的DU中以页为单位写入第二待写入数据;以及
在当前指针所指向的DU中剩余页的空间小于第一待写入数据预占用的空间,且维护单元501维护的待接收数据的DU中除当前指针指向的DU外,当前时刻下一个待接收数据的DU中剩余页的空间小于第二待写入数据预占用的空间的情况下,第二写操作子单元602在当前指针所指向的DU中以页为单位写入第一待写入数据,当前指针所指向的DU被写满后,从当前指针所指向的DU所属SSD的空闲DU队列中重新分配一个DU,在重新分配的DU中以页为单位写入剩余的第一待写入数据,在除当前指针所指向的DU外,当前时刻下一个待接收数据的DU中以页为单位写入第二待写入数据,当接收第二待写入数据的DU被写满时,从该被写满第二待写入数据的DU所属的SSD的空闲队列中重新分配一个DU,在重新分配的DU中以页为单位写入剩余的第二待写入数据。
本实施例描述了将第二待写入数据写入除当前指针指向的DU外,当前时刻下一个待接收数据的DU中的情况,在具体的实施例过程中,还可以将第二待写入数据写入除当前指针指向的DU外,至少2个当前时刻待接收数据的DU中,例如,将第一待写入数据写入DU0,将第二待写入数据分发到DU4、DU8、和DU12中。
该实施例相对于实施例四,实现了待写入数据预占用的空间超过预设分条深度,在当前指针所指向的DU中按顺序写入待写入数据,以提高SSD写性能的过程。
实施例七、
本实施例相对于实施例四,包括实施例五或者实施例六中的维护单元501、实施例五中的第一写操作子单元502、以及实施例六中的划分子单元601以及第二写操作子单元602。各单元的具体实施过程此处不再赘述。
该实施例相对于实施例四,实现了待写入数据预占用的空间未超过预设的分条深度,在当前指针所指向的DU所属的固态硬盘SSD中顺序写入待写入数据,以提高SSD写性能的过程;以及待写入数据预占用的空间超过预设的分条深度,在当前指针所指向的DU所属的廉价冗余磁盘阵列RAID组中的至少两个SSD中按顺序写入待写入数据,以提高SSD写性能的过程。
实施例八、
参见图7,为本发明实施例八提供的写数据的装置示意图,相对于上述实施例四至实施例七中的任意一个实施例,还包括:
回收单元701,用于在写操作单元402向SSD写数据的过程中,当RAID组中任意一个SSD已使用DU数量超过预设的阈值时,根据维护的以DU中无效页数作为健值的二叉查找树,选择待回收DU,并回收该DU。具体的实施过程可参考实施例二,此处不再赘述。
本实施例相对于实施例四,当RAID组中任意一个SSD已使用DU数量超过预设的阈值时,将启动后台垃圾回收线程,回收DU,从而能够实现资源的充分利用。
实施例九、
该实施例提供了一种廉价冗余磁盘阵列RAID,该RAID包括至少两个SSD以及实施例四至实施例八任意一个实施例所述的写数据的装置。
通过该实施例,待写入数据可以顺序写入RAID中的SSD,从而提高RAID中SSD的写性能。
以上实施例可以看出,通过维护的当前指针,获取当前指针指向的DU,当确定待写入数据预占用的空间未超过预设的分条深度时,将待写入数据以页为单位写入获取的DU所属的固态硬盘SSD中;当确定待写入数据预占用的空间超过预设的分条深度时,将待写入数据以页为单位写入当前指针所指向的DU所属的RAID组的至少两个SSD中,可以看出数据是顺序写入SSD的,相对于将数据随机写入SSD中,提高了SSD的写性能;并且通过将待写入数据写入至少2个SSD中,实现了全页日志结构管理模式下数据的并发;另外,当RAID组中任意一个SSD已使用DU数量超过预设的阈值时,将启动后台垃圾回收线程,回收DU,从而使得数据写入各个SSD的机会均等。
本领域普通技术人员可以理解实现上述方法实施例中的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中。上述提到的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
以上对本发明实施例进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。