一种固态硬盘映射关系的存储方法、读取方法及固态硬盘与流程

文档序号:17536808发布日期:2019-04-29 14:04阅读:313来源:国知局
本申请涉及固态硬盘
技术领域
:,尤其涉及一种固态硬盘映射关系的存储方法、读取方法及固态硬盘。
背景技术
::固态硬盘上使用的nandflash颗粒,由于其物理特性上的优势,极大的提高了持久化存储,特别是随机读写的效率。然而,nandflash颗粒的擦除寿命限制也导致了固态硬盘必须动态的记录用户读写地址(逻辑地址)与颗粒实际地址(物理地址)的映射关系,以求尽量均衡的使用颗粒上的每一个晶体管。例如,用户反复提交对同一个逻辑地址修改时,固态硬盘需要将数据记录至不同的晶体管上去。现有技术中,通过在固态硬盘中加装了ddr内存,则上述映射关系可以保存在ddr内存中,定期刷盘至nandflash颗粒上,io读写时所需要的映射关系在内存中查询即可。但是,ddr内存将会带来固态硬盘功耗与成本的增加,在消费级市场,则意味着性价比的降低。因此,如何在没有ddr内存的固态硬盘中尽量降低读写映射关系带来的性能损耗将在很大程度上改变消费者的用户体验。在没有ddr内存的固态硬盘中,映射关系首先保存在固态硬盘自身内存中,然后再刷写到nandflash颗粒上,由于固态硬盘内存空间有限,按照现有页映射4byte映射4k的模型的方式,难以满足存储需求;并且,在将映射关系由固态硬盘内存刷写到nandflash颗粒过程中,将阻止读写请求的继续下发,导致固态硬盘性能较低。技术实现要素:本申请提供了一种固态硬盘映射关系的存储方法、读取方法及固态硬盘,以解决固态硬盘映射关系处理效率低的问题。第一方面,本申请提供了一种固态硬盘映射关系的存储方法,该方法包括:将写请求的映射关系存储至固态硬盘的第一内存单元,作为第一数据段;当所述第一内存单元写满时,将所述第一数据段转换为第二数据段,将所述第二数据段存储至第二内存单元;当所述第二内存单元剩余容量小于第一预设阈值时,将所述第二数据段转换为第三数据段,将所述第三数据段存储至第三内存单元;当为所述第三内存单元剩余容量小于第二预设阈值时,将所述第三数据段移动至固态硬盘存储芯片内。优选地,所述将所述第一数据段转换为第二数据段,包括:获取所述第一数据段中映射关系的逻辑地址;根据所述逻辑地址对所述映射关系进行优化处理。优选地,所述根据所述逻辑地址对所述映射关系进行优化处理,包括:将所述映射关系按照所述逻辑地址的顺序进行排序;根据相同逻辑地址将所述映射关系进行去重,所述去重包括比较所述相同逻辑地址分别对应的物理地址,删除旧物理地址和逻辑地址之间的映射关系;将排序去重后的映射关系中,连续的逻辑地址进行融合。优选地,所述将写请求的映射关系存储至固态硬盘的第一内存单元,作为第一数据段,之前还包括:解析用户下发的写请求,得到所述写请求的逻辑地址;为所述逻辑地址分配物理地址,得到所述逻辑地址与物理地址之间的映射关系。优选地,为所述逻辑地址分配物理地址,包括:判断是否存在连续的物理地址对应所述逻辑地址;如果存在,将所述连续的物理地址给所述逻辑地址;如果不存在,触发垃圾回收机制整理出连续的物理地址,将所述连续的物理地址给所述逻辑地址。优选地,所述将所述第三数据段移动至固态硬盘存储芯片内的过程中还包括:判断所述第一内存单元是否写满第二方面,本申请还提供了一种固态硬盘映射关系的读取方法,该方法包括:判断在固态硬盘内存的第一数据段内能否查到读请求的映射关系;如果不能查到,判断在所述固态硬盘内存的第二数据段内能否查到所述映射关系;如果不能查到,判断在所述固态硬盘内存的第三数据段内能否查到所述映射关系;如果不能查到,在固态硬盘存储芯片内存储的映射表中查找所述映射关系;如果能够查到,从所述映射关系中的物理地址读取数据。优选地,判断在固态硬盘内存的第一数据段内能否查到读请求的映射关系,之前还包括:获取用户提交的读请求;解析所述读请求,得到所述读请求的逻辑地址。第三方面,本申请还提供了一种固态硬盘,该固态硬盘包括固态硬盘内存和固态硬盘存储芯片,所述固态硬盘内存包括第一内存单元、第二内存单元和第三内存单元,其中,所述第一内存单元用于存储第一数据段,所述第一数据段用于存储写请求的映射关系,当所述第一数据段写满时,转换为第二数据段;所述第二内存单元用于存储第二数据段,当所述第二内存单元剩余容量小于第一预设阈值时,所述第二数据段转换为第三数据段;所述第三内存单元用于存储第三数据段,当所述第三内存单元剩余容量小于第二预设阈值时,所述第三数据段内的映射关系移动至固态硬盘存储芯片内;所述固态硬盘存储芯片用于存储所述第三内存单元发送的映射关系。优选地,所述第一数据段的数量为一个,所述第二数据段和第三数据段的数量为多个,所述第一数据段的大小为4k的整数倍,所述第三数据段的大小为32kb-128kb,且所述第三数据段的大小为固态硬盘存储芯片存储时连续逻辑地址的最小粒度。本申请提供的固态硬盘映射关系的存储方法、读取方法及固态硬盘的有益效果包括:本申请提供的固态硬盘映射关系的存储方法,通过在固态硬盘内存中对映射关系进行分段存储、分段转换,实现在固态硬盘内存中建立多级缓存机制,降低了固态硬盘读写映射关系带来的性能开销,提高了固态硬盘的缓存性能。本申请提供的固态硬盘映射关系的读取方法,通过在固态硬盘内存中对映射关系进行分段查找,有效提高了映射关系的读取效率。本申请提供的固态硬盘,包括固态硬盘内存和固态硬盘存储芯片,固态硬盘内存包括第一内存单元、第二内存单元和第三内存单元,实现了对映射关系的多级缓存和多级读取,能够在固态硬盘内存有限的场景下尽量提高性能降低开销。附图说明为了更清楚地说明本申请的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。图1为本申请实施例提供的一种固态硬盘映射关系的存储方法的流程示意图;图2为本申请实施例提供的一种内存单元转换示意图;图3为本申请实施例提供的一种映射关系流转示意图;图4为本申请实施例提供的一种固态硬盘映射关系的读取方法的流程示意图;图5为本申请实施例提供的一种固态硬盘的结构示意图。具体实施方式为了使本
技术领域
:的人员更好地理解本申请中的技术方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。参见图1,为本申请实施例提供的一种固态硬盘映射关系的存储方法的流程示意图,如图1所示,本申请实施例提供的固态硬盘映射关系的存储方法,具体包括以下步骤:步骤s100:解析用户下发的写请求,得到写请求的逻辑地址。具体的,用户下发的io请求为写请求时,盘片固件对该写请求进行解析,得到该写请求的lba(logicalblockaddress,逻辑区块地址),本实施例中简称为逻辑地址。步骤s101:为逻辑地址分配物理地址,得到逻辑地址与物理地址之间的映射关系。具体的,当用户下发一个io请求后,要立即为该io请求的lba(logicalblockaddress,逻辑区块地址)分配一个pba(physicsblockaddress,物理区块地址),本实施例中简称为物理地址,与之对应,这个过程要尽可能的迅速,否则将会成为关键瓶颈点。分配好物理地址后,即建立起了该写请求的逻辑地址与物理地址之间的映射关系。步骤s110:判断第一内存单元是否写满。具体的,映射关系建立起来了后,需要将该映射关系进行存储。本申请实施例中,首先考虑将映射关系存储到固态硬盘内,而不是直接固化到固态硬盘存储芯片(本实施例中为nandflash颗粒)中。由于映射关系固化到固态硬盘存储芯片的速度较慢,存储到内存中速度较快,因此本申请相较现有技术中直接将映射关系固化到固态硬盘存储芯片相比,大大提高了io效率。本申请实施例中,将固态硬盘内存预划分出了第一内存单元、第二内存单元和第三内存单元。第一内存单元用于存储第一数据段,第一数据段为p2l(physicaladdresstologicaladdress,物理地址到逻辑地址)段,第一内存单元的大小即第一数据段的大小可自定义,本申请实施例中,第一数据段大小为4k的整数倍。第一数据段作用于io路径上,用于存储通过io路径下发的映射关系,为了保障能够对下发的映射关系及时接收,在p2l段中允许重复lba,不排序,不融合。第一数据段的数量仅有一个,因为从p2l段到s_p2l(staticphysicaladdresstologicaladdress,静态物理地址到逻辑地址)段,即存储在第二内存单元的第二数据段的转换很快,当p2l段需求转换时,直接转换,随后p2l段就重置可以接受新数据。将映射关系存储到p2l段之前,需要先判断p2l段是否写满,如果写满,将不能够立即对映射关系进行存储。步骤s111:如果没有写满,将写请求的映射关系存储至固态硬盘的第一内存单元,作为第一数据段。具体的,如果p2l段没有写满,则将映射关系存储到p2l段内。p2l段对映射关系的存储按照以下形式进行:p2l段内保存逻辑地址,p2l段头部记录物理地址的起始位置,由于整个p2l段内,记录的物理地址是连续的(由固态硬盘固件保证,如果没有连续地址则会触发垃圾回收整理出连续地址),因此,按照上述方式可实现映射关系的存储。步骤s112:将写请求中的用户数据存储到映射关系对应的物理地址中。具体的,将映射关系存储好后,接收写请求中的写数据,将写数据固化至nandflash颗粒中。步骤s120:如果写满,判断第二内存单元剩余容量是否大于第一预设阈值。具体的,如果在步骤s110中,判定结果为p2l段已经写满,则需要将当前p2l段转化为第二数据段,保存至第二内存单元,以空出第一内存单元继续接受新数据,而将p2l段转化为第二数据段之前,还需要判断第二内存单元是否有足够的空间来进行存储。第二内存单元用于存储第二数据段,第二数据段称为s_p2l段。s_p2l段的数量与用户预分配的第二内存单元大小相关,s_p2l段的大小不固定,根据p2l段转化生成,同时间在第二内存单元中可存在多个s_p2l段。本实施例中,第一预设阈值为第二内存单元的一半容量,当然,也可设置为小于第二内存单元容量的其他容量。步骤s121:如果大于,将第一数据段转换为第二数据段,将第二数据段存储至第二内存单元。具体的,如果在步骤s120中,判定结果为第二内存单元还剩余一半以上的容量,则将p2l段转化为一个s_p2l段,具体转化过程如下:1)、将第一数据段内的映射关系进行优化处理。优化处理包括排序、去重和融合。排序是指将映射关系中的逻辑地址进行排序;去重是指比较重复的逻辑地址分别对应的物理地址,将较旧的物理地址删除;融合是指将连续的逻辑地址进行融合。实际操作中,根据每次p2l段内的映射关系的逻辑地址不同,优化处理可能包括排序、去重和融合中的0-3个操作。2)、将优化处理后的映射关系移动至一个第二数据段内。将优化处理后的映射关系写入s_p2l段的地址区间,即stablep2l,s_p2l不再接收数据。在转换执行过程中,p2l段暂时不允许写入新的映射关系,由于,p2l段数据量小且转换在固态硬盘内存中执行,因此,执行效率高,几乎不影响对io的处理。步骤s130:如果小于,判断第三内存单元剩余容量是否大于第二预设阈值。具体的,如果在步骤s120中,判定结果为第二内存单元剩余容量不足一半,则将s_p2l段转化为第三数据段,保存至第三内存单元,以空出第二内存单元继续接受新数据,而将s_p2l段转化为第三数据段之前,也需要判断第三内存单元是否有足够的空间来进行存储。第三内存单元用于存储第三数据段,第三数据段为l2p(logicaladdresstophysicaladdress,逻辑地址到物理地址)段。l2p段的数量与用户预分配的第三内存单元大小相关,l2p段的大小不固定,建议l2p段大小总和应优先满足颗粒的并发度所需要大小,例如:底层颗粒拓扑结构为4通道,双面,页大小为16kb,那么,l2p大小总和至少建议:页大小*面数量=32kb,最大建议:通道数量*页大小*面数量=128kb。同时间在第三内存单元中可存在多个l2p段。本实施例中,第二预设阈值不再做具体限定。步骤s131:如果大于,将第二数据段转换为第三数据段,将第三数据段存储至第三内存单元。具体的,如果在步骤s130中,判定结果为第三内存单元剩余容量大于第二预设阈值,则使用归并排序对多个s_p2l段同时转换,形成一个l2p段,移动至第三内存单元。进一步的,将s_p2l段转换为l2p段后,第二内存单元将空余出较多的空间来存储新的s_p2l段,因此,可继续执行步骤s121。步骤s140:如果小于,将第三数据段移动至固态硬盘存储芯片内。具体的,如果在步骤s130中,判定结果为第三内存单元剩余容量小于第二预设阈值,需要先将l2p段固化至nandflash颗粒上,以空出第三内存单元继续接受新数据。由于nandflash颗粒并发度的影响,最有效率的写大小可能会大于l2p段大小。因此,本实施例中可选择凑够两个l2p段才进行一次下刷。进一步的,将l2p段固化至nandflash颗粒上后,第三内存单元将空余出较多的空间来存储新的l2p段,因此,可继续执行步骤s131。从s_p2l段到l2p段并固化至nandflash颗粒上涉及到nandflash颗粒的读写操作,耗时较长,要保证在这个过程中,还能够生成新的s_p2l段,否则将导致写操作阻塞。更进一步的,在每次提交同步读写nandflash颗粒,例如提交将l2p段固化至nandflash颗粒上的请求后,就去对p2l段进行判断,判断是否写满,如果写满,就进行转换。由于nandflash读写操作是由dma(directmemoryaccess,直接内存存取)硬件执行,同步操作时cpu只能在执行空指令一段时间后,检查dma操作是否完成,本申请将cpu执行空指令替换为计算排序、去重、融合能更大程度的利用cpu。参见图2,为本申请实施例提供的一种内存单元转换示意图,如图2所示,p2l段、s_p2l段和l2p段都位于内存,内存中同一时刻存在一个p2l段、多个s_p2l段和l2p段,l2p段最终固化至nandflash颗粒上。参见图3,为本申请实施例提供的一种映射关系流转示意图,如图3所示,用户下发的写请求中,逻辑地址依次为1,2,3,9,8,7,4,7,假设p2l段的可容纳数量为4。第一数据段接收1,2,3,9后,p2l段写满,触发向s_p2l段的转换,将其固化记录为1:3,9,本次记录无需重排及去重,但是由于1,2,3逻辑地址连续,所以将其融合为起始地址:连续长度,即上图中的1:3。随后释放p2l段接受新的逻辑地址。在8,7,4,7这四个逻辑地址记录至p2l段后,p2l段再次写满,触发向s_p2l段的转换,将其固化记录为:4,7,8,本次记录去掉了逻辑地址7旧的物理地址,只记录最新的物理地址。同时,io的顺序也重新进行了排列。最后,积累了多个s_p2l段后,例如,假设一个最小连续大小是10个地址。那么,还需要从nandflash颗粒中读取逻辑地址5,6,10的物理地址,与1,2,3,4,7,8,9拼成一个完整的l2p段才能下刷至nandflash颗粒上,这个时候由于s_p2l已经有序,在o(n)的时间复杂度即可完成最后的排序。对上图的l2p段,假设一个最小连续大小是10个地址。那么,还需要从nandflash颗粒中读取逻辑地址5,6,10的物理地址,与1,2,3,4,7,8,9拼成一个完整的l2p段才能下刷。通过上述的步骤,我们将原本的任务拆分重排,降低对io关键路径上的影响。将映射数据的处理分散至非io关键路径的流程中去处理。本申请实施例还提供了一种固态硬盘映射关系的读取方法,遵循lru(leastrecentlyused,最近最少使用)的原理,参见图4,为本申请实施例提供的一种固态硬盘映射关系的读取方法的流程示意图,如图4所示,具体包括以下步骤:步骤s200:获取用户提交的读请求。具体的,用户下发一个io请求后,获取该io请求,如果该io请求为读请求,则进行以下步骤。步骤s201:解析读请求,得到读请求的逻辑地址。步骤s210:判断在固态硬盘内存的第一数据段内能否查到读请求的映射关系。具体的,在p2l段内进行搜索,搜索是否有写请求对应的逻辑地址、物理地址映射关系。步骤s220:如果不能,判断在固态硬盘内存的第二数据段内能否查到映射关系。具体的,如果在p2l段内没有查询到,则继续在s_p2l段搜索。由于s_p2l段已经有序,在时间复杂度o(logn)内即可完成查找。另外,由于s_p2l融合了连续的数据,在内存数据占用相同的场景下,极大的增加了cache(缓存)可覆盖的范围。步骤s230:如果不能,判断在固态硬盘内存的第三数据段内能否查到映射关系。具体的,s_p2l段内也没有查询到,则搜索l2p段,l2p段同样有序,也可在时间复杂度o(logn)内同样可完成查找。步骤s240:在固态硬盘存储芯片内存储的映射表中查找映射关系。具体的,l2p段内也没有查询到,则在固态硬盘的nandflash颗粒上进行查找。其中,在步骤s210、s220、s230的判定中,如果判定能够查询到,则执行步骤s250:从映射关系中的物理地址读取数据。本申请实施例还提供了一种固态硬盘映射关系的存储系统,参见图5,为本申请实施例提供的一种固态硬盘的结构示意图。如图5所示,本申请实施例提供的固态硬盘,包括固态硬盘内存和固态硬盘存储芯片(nandflash颗粒)两部分。固态硬盘内存包括第一内存单元、第二内存单元和第三内存单元,其中,第一内存单元用于存储一个第一数据段,第一数据段用于存储写请求的映射关系,当第一数据段写满时,转换为一个第二数据段;第二内存单元用于存储至少一个第二数据段,当第二内存单元剩余容量小于第一预设阈值时,第二数据段转换为至少一个第三数据段;第三内存单元用于存储至少一个第三数据段,当第三内存单元剩余容量小于第二预设阈值时,第三数据段内的映射关系移动至固态硬盘存储芯片内;固态硬盘存储芯片用于存储第三内存单元发送的映射关系。对于上述结构,可参考在固态硬盘映射关系的存储方法、读取方法的实施例中的具体描述,在此不再详细介绍。根据上述实施方式,本申请具有以下优点:1、搜索时间的减少,假设主机下发10万个读io,s_p2l段替换原256k内存缓存。一个映射关系用4byte来存储,则有256*1024/4=64*1024个映射关系。如果10万个io每个都在6.4万个缓存中搜索一次,未排序时,取平均复杂度n/2,最终得到平均查找次数为:100*1000*64*1024/2=3,276,800,000。假设排序后的有8个s_p2l段,每个大小32k,即8196个映射关系,平均搜索次数为100*1000*8*log2(8192)/2=5,200,000。可以看到,搜索次数将出现量级的减少。由于最后将数据存储至nandflash中本来就是需要重新排序的,这部分的工作量并没有改变。仅仅再多一次将局部的序的s_p2l段归并排序至l2p段的工作量,最终的cpu工作量是大大减少的。2、搜索命中率的提升,假设原先需要4byte表示4kb的空间,即将地址空间以4kb为粒度分割,256gb的地址空间划分为67108864个4kb的小区间,那么,4byte大小的地址可以计数2147483648个小区,足够描述256gb的范围。例如:地址67000000则可表示67000000*4096=274432000000这个地址,其范围是4kb。现在,用8byte大小表示逻辑地址的起始及范围,起始地址与范围分别占用4byte。与旧的记录方式相比:如果要描述274432000000-274440388608地址范围,只需要记录67000000:2048,共占用8byte,而原先的方式需要记录为67000000,67000001...67002047,共占用8kb的空间。极端情况下,256kb的空间原先只能映射256m的空间地址,而现在可以映射256g的地址。在现实场景中,例如,vmware公司使用的vmfs文件系统,分配粒度就是8m连续io,当多个虚拟机同时运行时,每个虚拟机磁盘文件增加数g的空间,并且访问这些新增的数据,将完全的命中映射缓存,而在原始的设计中,在这种模型下将导致大量的读映射关系开销,最终导致所有虚拟机的io执行效率降低出现卡顿。由上述实施例可见,本申请提供的固态硬盘映射关系的存储方法、读取方法及固态硬盘,将映射关系分层组织,避免影响io关键路径的效率;对不同层次的数据进行整理,较大的缩短了后续频繁查找操作的时间复杂度;对连续数据进行整合,在占用同样内存空间的条件下,在数据连续时映射范围有了极大的提高,而对于数据随机的场景,将退化至现有流程,并无副作用。由于以上实施方式均是在其他方式之上引用结合进行说明,不同实施例之间均具有相同的部分,本说明书中各个实施例之间相同、相似的部分互相参见即可。在此不再详细阐述。需要说明的是,在本说明书中,lba简称为逻辑地址,pba简称为物理地址,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或暗示这些实体或操作之间存在任何这种实际的关系或顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的电路结构、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种电路结构、物品或者设备所固有的要素。在没有更多限制的情况下,有语句“包括一个……”限定的要素,并不排除在包括所述要素的电路结构、物品或者设备中还存在另外的相同要素。本领域技术人员在考虑说明书及实践这里发明的公开后,将容易想到本申请的其他实施方案。本申请旨在涵盖本发明的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本申请的一般性原理并包括本申请未公开的本
技术领域
:中的公知常识或惯用技术手单元。说明书和实施例仅被视为示例性的,本申请的真正范围和精神由权利要求的内容指出。以上所述的本申请实施方式并不构成对本申请保护范围的限定。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1