一种存储系统中IO请求的处理方法、系统及相关装置与流程

文档序号:17318610发布日期:2019-04-05 21:24阅读:150来源:国知局
一种存储系统中IO请求的处理方法、系统及相关装置与流程

本申请涉及数据存储领域,特别涉及一种存储系统中io请求的处理方法、系统及相关装置。



背景技术:

传统的存储系统为了提高并发量,会采用多个核心同时对主机下发的io请求进行处理,io由主机到达存储系统,存储系统调用多个线程并发处理,但是属于同一个卷的数据应该是有序的处理,从而才能保证数据的一致性,所以当属于一个卷的多个io同时下发的时候,会存在多个线程之间必须要加锁,就会产生互相等待的情况,又因为存储系统对于实时性要求比较高,通常采用自旋锁,死等的结果会导致cpu占用率较高,但是整个系统的性能并不好,由于系统比较复杂,过多的加锁等待也会增加了死锁的概率,使系统的不稳定性大大增加。



技术实现要素:

本申请的目的是提供一种存储系统中io请求的处理方法、系统、一种计算机可读存储介质和一种存储设备,解决了现有的存储系统中因为多线程之间处理同一卷的io请求时需要自旋锁带来的系统性能差的问题。

为解决上述技术问题,本申请提供一种存储系统中io请求的处理方法,具体技术方案如下:

当接收到io请求时,确定所述io请求所属的存储卷;

判断所述存储卷是否存在其他io请求正在被处理;

若是,将所述io请求挂到对应的链表;

在所述其他io请求处理完毕后,按顺序处理所述链表中的io请求。

其中,还包括:

当接收到其他io请求时,根据映射表调用所述其他io请求对应的线程处理所述其他io请求;

其中,所述映射表为包含存储卷与线程之间一一对应关系的映射表。

其中,还包括:

建立所述映射表,并将所述映射表存于预设地址。

其中,若存储卷的数量等于核心数量,还包括:

将所述线程与所述核心绑定。

其中,若存储卷的数量小于核心数量,还包括:

所述线程利用若干核心按顺序处理所述链表中的io请求。

本申请还提供一种存储系统中io请求的处理系统,具体技术方案如下:

确定模块,用于当接收到io请求时,确定所述io请求所属的存储卷;

判断模块,用于判断所述存储卷是否存在其他io请求正在被处理;

暂挂模块,用于若所述判断模块判断为是时,将所述io请求挂到对应的链表;

处理模块,用于在所述其他io请求处理完毕后,按顺序处理所述链表中的io请求。

其中,还包括:

线程调用模块,用于当接收到其他io请求时,根据映射表调用所述其他io请求对应的线程处理所述其他io请求;

其中,所述映射表为包含存储卷与线程之间一一对应关系的映射表。

其中,若存储卷的数量等于核心数量,还包括:

线程绑定模块,用于将所述线程与所述核心绑定。

本申请还提供一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如上所述的处理方法的步骤。

本申请还提供一种存储设备,其特征在于,包括存储器和处理器,所述存储器中存有计算机程序,所述处理器调用所述存储器中的计算机程序时实现如上所述的处理方法的步骤。

本申请所提供的一种存储系统中io请求的处理方法,包括:当接收到io请求时,确定所述io请求所属的存储卷;判断所述存储卷是否存在其他io请求正在被处理;若是,将所述io请求挂到对应的链表;在所述其他io请求处理完毕后,按顺序处理所述链表中的io请求。

本申请通过将属于同一存储卷的io请求按时间顺序执行,避免同一卷的多个io请求并行处理,解决了多线程处理同一卷io请求时需要自旋锁的问题。若先后接收到同一卷的不同io请求,将接收到的后一个io请求先挂到链表,直至先一个io请求被处理完,再进行处理,不会存在多个线程向同一个存储卷上写数据,线程之间无需加锁互等,提高了存储系统中线程处理io请求的效率。本申请还提供一种存储系统中io请求的处理系统、一种计算机可读存储介质和一种存储设备,具有上述有益效果,此处不再赘述。

附图说明

为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。

图1为本申请实施例所提供的一种存储系统中io请求的处理方法的流程图;

图2为本申请实施例所提供的一种存储系统中io请求的处理系统结构框图。

具体实施方式

为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

请参考图1,图1为本申请实施例所提供的一种存储系统中io请求的处理方法的流程图,该处理方法包括:

s101:当接收到io请求时,确定io请求所属的存储卷;

本步骤旨在确定io请求对应的存储卷。现有技术中,当多个线程同时处理同属于一个存储卷的io请求时,线程之间会进行自旋锁。自旋锁是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。获取锁的线程一直处于活跃状态,此时可以处理io请求。如果某个线程持有锁的时间过长,就会导致其它等待获取锁的线程进入循环等待,消耗cpu,造成cpu使用率极高。

在此对于如何确定io请求所属的存储卷不作限定,通常,io请求中包含了请求内容以及请求方信息,而请求方信息通常包含该io请求对应的存储卷,因此可以借此确定io请求对应的存储卷。当然还可以存在其他根据io请求确定存储卷的方法,在此不作具体限定。

s102:判断存储卷是否存在其他io请求正在被处理;若是,进入s103;

在s101确定io请求对应的存储卷之后,本步骤旨在判断该存储卷是否存在其他io请求正在被处理。其他io请求可以是该存储卷的其他任何一个io请求。换句话说,本步骤旨在判断步骤s101中接收到的io请求所属的存储卷是否存在其他正在被处理的io请求(即其他io请求)。若是,进入s103。当然,容易理解的是,若不存在其他io请求正在被处理,则步骤s101中接收到的io请求可以直接被线程处理。

s103:将io请求挂到对应的链表;

当该存储卷存在其他io请求正在被处理时,先将io请求挂到对应的链表。链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。特别需要指出的是,链表可以实现存储的顺序性,即可以按时间顺序依次存储暂时无法被处理的io请求。本步骤中,io请求对应的链表实际上指的是io请求所述存储卷对应的链表。

本实施例默认在本步骤之前为每一个存储卷建立相对应的链表,在此对于链表大小等具体的链表参数不作限定。可以理解的是,若存储卷的io请求量较大,与存储卷相对应的链表大小也应较大,当然还可以实现一个存储卷对应多个链表,以满足溢出的io请求。

s104:在其他io请求处理完毕后,按顺序处理所述链表中的io请求。

在线程处理完其他io请求后,对链表中的io请求进行按序处理。当然,处理时先接受到的io请求应先处理。可以理解的是,即使其他io请求处理完,此时处理的也不一定为步骤s101中接收到的io请求,而是需要看链表中的io请求序列,按顺序处理。

当然,容易理解的是,在处理io请求时,由于步骤s103中将溢出的io请求暂挂至链表,本步骤默认需要对io请求作摘链处理。

由本实施例的s102至s104可以看出,在任何一个时刻,均只存在一个io请求被处理,若是前一个io请求未处理完时已经存在后续的io请求,此时先将后续的io请求暂挂在链表,直至前一个io请求处理完再按顺序处理后续的io请求。由于每个存储卷任一时刻只存在一个io请求被处理,线程之间不存在自旋锁的问题,不必令大多数线程处于等待状态,不会存在多个线程向同一个存储卷上写数据,线程之间无需加锁互等,提高了存储系统中线程处理io请求的效率。

基于上述实施例,作为优选的实施例,该处理方法还可以包括:

当接收到其他io请求时,根据映射表调用其他io请求对应的线程处理其他io请求;

其中,映射表为包含存储卷与线程之间一一对应关系的映射表。

本步骤其实可以对应步骤s102判断为否的情况,这里的其他io请求指的是第一个被线程处理的io请求,当步骤s102判断为否时,意味着步骤s101中接收到的io请求同样也为第一个被线程处理的io请求。

此时,可以根据映射表调用相应的线程对io请求进行处理。映射表包含存储卷与线程之间一一对应关系,而实际上存储卷具体与哪一个线程相对应并不限定,映射表的作用重点是将线程与存储卷进行一一绑定。上一实施例已经说明任一时刻均只存在于一个io请求被处理,因此通常只需要一个线程处理一个存储卷的所有io请求,通过将线程与存储卷一一绑定,规定了存储卷下的io请求均由对应的线程执行,不会造成线程处理io请求时的紊乱,使得存储系统中的io请求有条不紊的进行。

可以理解的是,存储系统中存储卷与线程之间的数量通常不是相同的,而映射表的目的在于为每一个存储卷分配相应的线程,因此只需要每个存储卷均存在对应的线程即可,也即是说存储系统中可以存在不与存储卷相对应的线程。

当然,在本步骤之前,默认存在建立映射表的相关步骤。具体的,需要建立映射表,并将映射表存于预设地址。在此对于预设地址不作限定,可以为存储系统中任何一个存储空间。

基于上述实施例中对于线程和存储卷之间关系的描述,在此对于线程和核心作进一步优化。当存储系统中进行io请求处理时,对于存储系统中存储卷的数量与处理器的核心数量作数量比对,此时分三种情况:

1、若存储卷的数量等于核心数量,将线程与核心绑定。

本步骤将线程与核心绑定,其实也是类似于上述实施例中建立映射表的过程,即确定线程与核心之间的关系,若存储卷的数量等于核心数量,也即是说,用于处理存储卷io请求的线程数量与核心数量也相同。特别需要说明的是,这里的线程指的是用于处理存储卷io请求的线程。此时将线程与核心绑定,在后续处理存储卷的io请求时,无需进行核心的切换,在上述实施例无需切换线程的情况下,进一步提高存储系统中io请求的处理效率。

2、若存储卷的数量小于核心数量,线程利用若干核心按顺序处理链表中的io请求。

当存储卷数量小于核心数量,此时处理io请求的线程可以调用若干核心处理io请求。当然,在此不限定线程可以调用的核心数量,应视存储系统的总核心数量以及其他线程应用的核心数量而定。此时,若是可以利用多个核心处理io请求,将进一步提高io请求的处理效率。

3、若存储卷的数量大于核心数量,进行核心的负载均衡。

当存储卷的数量大于核心数量时,此时进行核心的负载均衡。在此对于负载均衡的应用方式不作具体限定,例如可以按照io请求的时间顺序允许不同的线程调用核心,或者根据io请求的重要程度为线程分配核心,具体的负载均衡方式应由本领域技术人员做相应设定。

下面对本申请实施例提供的一种存储系统中io请求的处理系统进行介绍,下文描述的处理系统与上文描述的一种存储系统中io请求的处理方法可相互对应参照。

参见图2,图2为本申请实施例所提供的一种存储系统中io请求的处理系统结构框图,本申请还提供一种存储系统中io请求的处理系统,具体技术方案如下:

确定模块100,用于当接收到io请求时,确定所述io请求所属的存储卷;

判断模块200,用于判断所述存储卷是否存在其他io请求正在被处理;

暂挂模块300,用于若所述判断模块判断为是时,将所述io请求挂到对应的链表;

处理模块400,用于在所述其他io请求处理完毕后,按顺序处理所述链表中的io请求。

基于上述实施例,作为优选的实施例,还包括:

线程调用模块,用于当接收到其他io请求时,根据映射表调用所述其他io请求对应的线程处理所述其他io请求;

其中,所述映射表为包含存储卷与线程之间一一对应关系的映射表。

基于上述实施例,作为优选的实施例,若存储卷的数量等于核心数量,还包括:

线程绑定模块,用于将所述线程与所述核心绑定。

本申请还提供了一种计算机可读存储介质,其上存有计算机程序,该计算机程序被执行时可以实现上述实施例所提供的一种存储系统中io请求的处理方法的步骤。该存储介质可以包括:u盘、移动硬盘、只读存储器(read-onlymemory,rom)、随机存取存储器(randomaccessmemory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。

本申请还提供了一种存储设备,可以包括存储器和处理器,所述存储器中存有计算机程序,所述处理器调用所述存储器中的计算机程序时,可以实现上述实施例所提供的一种存储系统中io请求的处理方法的步骤。当然所述存储设备还可以包括各种网络接口,电源等组件。

说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例提供的系统而言,由于其与实施例提供的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。

本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想。应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以对本申请进行若干改进和修饰,这些改进和修饰也落入本申请权利要求的保护范围内。

还需要说明的是,在本说明书中,诸如第一和其他等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

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