一种CPU多核的IO请求处理方法、装置及设备与流程

文档序号:13331837阅读:427来源:国知局
一种CPU多核的IO请求处理方法、装置及设备与流程

本发明涉及计算机存储技术领域,特别是涉及一种cpu多核的io请求处理方法、装置及设备。



背景技术:

在存储系统中,采用单线程的处理方式来处理io请求。随着存储技术的不断发展,单线程的处理方式在很多场合已经不能满足需求。

例如,在san(storageareanetwork,存储区域网络)存储系统中,常见的raid(redundantarraysofindependentdisks,独立磁盘冗余阵列)阵列有传统raid阵列和分布式raid阵列。传统的raid阵列最大支持16块磁盘,采用单线程来处理io请求,cup单核处理。由于底层io通道只有16块盘,使用cpu单核处理读写磁盘的io请求以及计算异或校验,可以将16块盘的带宽跑满。分布式raid阵列的磁盘数量远远大于传统的raid阵列,大量的磁盘能够提高io并发性能,但是cup单核的性能不能满足计算异或校验的需求,特别是随着分布式raid阵列的不断发展,采用单线程处理io请求,由于cpu单核,在计算异或检验阶段的性能瓶颈凸显的越来越明显。

综上所述,在处理io请求时,cup单核性能不足,是目前本领域技术人员急需解决的技术问题。



技术实现要素:

本发明的目的是提供一种cpu多核的io请求处理方法、装置、设备及存储介质,提高了io请求处理的性能。

为解决上述技术问题,本发明提供如下技术方案:

一种cpu多核的io请求处理方法,该方法包括:

启动n个io处理线程,其中,所述n为正整数,且至少为2,每一个io处理线程对应一个io请求队列;

针对每一个io处理线程,当该io处理线程对应的io请求队列为空时,从公共io请求队列中获取io请求集合并进行处理;

在处理完所述io请求集合之后,确定该io请求队列是否为空;

如果否,则处理该io请求队列中的io请求;如果是,则执行所述从公共io请求队列中获取io请求集合并进行处理。

优选的,所述从公共io请求队列中获取io请求集合并进行处理,包括:

从公共io请求队列中获取预定个数的io请求;

确定获取的各个io请求相对应的条带编号;

针对每一个io请求,确定该io请求的条带编号对于所述n的取模运算结果;

根据各个io请求的取模运算结果,从公共io请求队列中获取io请求集合并进行处理。

优选的,在所述根据各个io请求的取模运算结果,从公共io请求队列中获取io请求集合并进行处理之后,还包括:

针对从所述公共io请求队列中获取的所述io请求集合之外的其他每个io请求,将该io请求置入与该io请求的取模运算结果相对应的io请求队列中。

优选的,所述目标io请求集合中仅包含一个io请求。

优选的,所述n个所述io处理线程为分布式raid阵列中的线程。

一种cpu多核的io请求处理装置,该装置包括:

线程启动模块,用于启动n个io处理线程,其中,所述n为正整数,且至少为2,每一个io处理线程对应一个io请求队列;

公共io请求处理模块,用于针对每一个io处理线程,当该io处理线程对应的io请求队列为空时,从公共io请求队列中获取io请求集合并进行处理;

队列io请求确定模块,用于在处理完所述io请求集合之后,确定该io请求队列是否为空;如果否,则进入队列io请求处理模块,如果是,则进入所述公共io请求处理模块;

所述队列io请求处理模块,用于处理该io请求队列中的io请求。

优选的,所述公共io请求处理模块,包括:

io请求获得子模块,用于从公共io请求队列中获取预定个数的io请求;

条带编号确定子模块,用于确定获取的各个io请求相对应的条带编号;

取模结果确定子模块,用于针对每一个io请求,确定该io请求的条带编号对于所述n的取模运算结果;

公共io请求处理子模块,用于根据各个io请求的取模运算结果,从公共io请求队列中获取io请求集合并进行处理。

优选的,还包括:

io请求分发模块,用于在所述根据各个io请求的取模运算结果,从公共io请求队列中获取io请求集合并进行处理之后,针对从所述公共io请求队列中获取的所述io请求集合之外的其他每个io请求,将该io请求置入与该io请求的取模运算结果相对应的io请求队列中。

一种cpu多核的io请求处理设备,该设备包括:

存储器,用于存储计算机程序;

处理器,用于执行所述计算机程序以实现:启动n个io处理线程,其中,所述n为正整数,且至少为2,每一个io处理线程对应一个io请求队列;针对每一个io处理线程,当该io处理线程对应的io请求队列为空时,从公共io请求队列中获取io请求集合并进行处理;在处理完所述io请求集合之后,确定该io请求队列是否为空;如果否,则处理该io请求队列中的io请求;如果是,则执行所述从公共io请求队列中获取io请求集合并进行处理。

一种计算机可读存储介质,所述计算机可读存储介质上存储有多线程io请求处理程序,所述多线程io请求处理程序被处理器执行时实现如上述任一项所述的cpu多核的io请求处理方法。

应用本发明实施例所提供的技术方案,启动n个io处理线程,其中,n为正整数,且至少为2,每一个io处理线程对应一个io请求队列;针对每一个io处理线程,当该io处理线程对应的io请求队列为空时,从公共io请求队列中获取io请求集合并进行处理;在处理完io请求集合之后,确定该io请求队列是否为空;如果否,则处理该io请求队列中的io请求;如果是,则执行从公共io请求队列中获取io请求集合并进行处理。

由于采用n个io处理线程,n至少为2,在处理io请求时,每个io处理线程均可以处理相对应的io请求队列中的io请求,每个io处理线程可以从公共io请求队列中获取io请求。将单线程的io请求处理变为多线程并行的io请求处理,使得可以利用cpu的多核的性能,避免了存储系统中磁盘数多时,单线程处理io请求,cpu单核导致的不能满足计算异或校验的性能需求。提高了io请求处理的性能。

附图说明

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

图1为本发明中一种cpu多核的io请求处理方法的实施流程图;

图2为本发明中一种cpu多核的io请求处理装置的结构示意图;

图3为本发明中一种cpu多核的io请求处理设备的结构示意图。

具体实施方式

本发明的核心是提供一种cpu多核的io请求处理方法,将单线程的io请求处理变为多线程并行的io请求处理,使得可以利用cpu的多核的性能,避免了存储系统中磁盘数较多时,单线程处理io请求,cpu单核导致的不能满足计算异或校验的性能需求。提高了io请求处理的性能。

为了使本技术领域的人员更好地理解本发明方案,下面结合附图和具体实施方式对本发明作进一步的详细说明。显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

请参考图1,为本发明中一种cpu多核的io请求处理方法的实施流程图,该方法可以包括以下步骤:

s101:启动n个io处理线程,其中,n为正整数,且至少为2,每一个io处理线程对应一个io请求队列。

发明人通过分析测试,发现了采用单线程处理io请求,由于cpu单核,会造成在计算异或检验阶段的性能瓶颈,因此,发明人提出了多线程处理io请求的方法以利用cpu多核的性能。在多线程io请求处理中,由于cpu多核并行处理io请求,提高了存储系统的io请求的处理性能。

启动存储系统中的n个io处理线程,n为正整数,且至少为2。在本发明的一种具体实施方式中,n个io处理线程为分布式raid阵列中的线程。

可以将这n个io处理线程进行编号,编号方式可以根据实际情况进行设定和调整,并不影响本发明的实施,例如使用正整数依次编号为0,1,2...n-2,n-1。每一个io处理线程对应一个io请求队列。需要说明的是,由于本发明的方案中还有一个公共io请求队列,当io处理线程为n个时,每一个io处理线程对应一个io请求队列,则包括公共io请求队列,一共有n+1个io请求队列。

需要指出的是,每一个io处理线程可以从相对应的io请求队列中获取io请求并进行处理。例如,2号io处理线程获取相对应的2号io请求队列中的io请求,并进行处理。为了便于表述,本申请中将io处理线程相对应的io请求队列称为该io处理线程自己的io请求队列。

在启动n个io处理线程之后,可以进行步骤s102的操作。

s102:针对每一个io处理线程,当该io处理线程对应的io请求队列为空时,从公共io请求队列中获取io请求集合并进行处理。

针对每一个io处理线程,在该io处理线程进行io请求处理的过程中,优先处理该io处理线程对应的io请求队列中的io请求,当该io处理线程对应的io请求队列为空,即不含任何io请求时,该io处理线程可以从公共io请求队列中获取io请求集合并进行处理。

例如,将3号io处理线程自己的io请求队列称为3号io请求队列,当3号io请求队列为空时,3号io处理线程从公共io请求队列中获取io请求集合并进行处理,例如获取10个io请求构成的io请求集合。当然,io请求集合中包含的io请求数量可以根据实际情况进行设定和调整,例如在本发明的一种具体实施方式中,目标io请求集合中仅包含一个io请求。从公共io请求队列中获取这10个io请求的方式也可以有多种,例如取公共io请求队列中的队列头部的前10个io请求构成io请求集合。

需要指出的是,n个io处理线程的初始状态通常均为空,即一开始启动存储系统中的n个io处理线程时,对应的n个io请求队列中不含有任何io请求。因此,在存储系统中进行io请求处理的最初阶段,各个io处理线程均可以从公共io处理队列中获取io请求。各个io处理线程获取io请求的方式可以参照上文例子中的3号io请求队列为空时,从公共io请求队列中获取io请求集合的方式。当然,也可以采取其他获取方式,并不影响本发明的实施。例如,当初始阶段n个io处理线程对应的io请求队列均为空时,每个io处理线程依次从公共io请求队列中获取10个io请求。

s103:在处理完io请求集合之后,确定该io请求队列是否为空。

针对每一个io处理线程,当该io处理线程对应的io请求队列为空时,从公共io请求队列中获取io请求集合并进行处理,在处理完io请求集合之后,确定该io请求队列是否为空,即确定该io请求队列中是否有io请求。当该io请求队列不为空时,可以进入步骤s104的操作,否则继续从公共io请求队列中获取io请求集合并进行处理,即执行步骤s102。

s104:处理该io请求队列中的io请求。

当该io处理线程对应的io请求队列不为空时,该io处理线程处理自己的io请求队列中的io请求。当io处理线程处理自己的io请求队列中的io请求时,可以按照通常的io请求处理方式进行处理,并不影响本发明的实施。例如,n个io处理线程为分布式raid阵列中的线程,当每一个io处理线程处理自己的io请求队列中的io请求时,可以按照传统的raid阵列的io请求处理流程进行io请求的处理。

需要指出的是,在该io处理线程处理完自己的io请求队列中的全部io请求之后,自己的io请求队列为空,则可以继续从公共io请求队列中获取io请求集合并进行处理。

应用本发明实施例所提供的技术方案,启动n个io处理线程,其中,n为正整数,且至少为2,每一个io处理线程对应一个io请求队列;针对每一个io处理线程,当该io处理线程对应的io请求队列为空时,从公共io请求队列中获取io请求集合并进行处理;在处理完io请求集合之后,确定该io请求队列是否为空;如果否,则处理该io请求队列中的io请求;如果是,则执行从公共io请求队列中获取io请求集合并进行处理。

由于采用n个io处理线程,n至少为2,在处理io请求时,每个io处理线程均可以处理相对应的io请求队列中的io请求,每个io处理线程可以从公共io请求队列中获取io请求。将单线程的io请求处理变为多线程并行的io请求处理,使得可以利用cpu的多核的性能,避免了存储系统中磁盘数多时,单线程处理io请求,cpu单核导致的不能满足计算异或校验的性能需求。提高了io请求处理的性能。

在本发明的一种具体实施方式中,步骤s102中的从公共io请求队列中获取io请求集合并进行处理,包括以下步骤:

步骤一:从公共io请求队列中获取预定个数的io请求;

步骤二:确定获取的各个io请求相对应的条带编号;

步骤三:针对每一个io请求的条带编号,确定该io请求的条带编号对于n的取模运算结果;

步骤四:根据各个io请求的取模运算结果,从公共io请求队列中获取io请求集合并进行处理。

为了便于描述,将上述四个步骤进行合并说明。

针对每一个io处理线程,当该io处理线程对应的io请求队列为空时,从公共io请求队列中获取io请求集合并进行处理。由于该io处理线程可以是n个io处理线程中的任意一个,为了便于表述,以该io处理线程为3号io处理线程为例,n设定为10。

从公共io请求队列中获取预定个数的io请求,预定个数可以根据实际情况进行设定和调整,并不影响本发明的实施。例如预定个数可以为n的整数倍。

确定获取的各个io请求相对应的条带编号,针对每一个io请求的条带编号,确定该io请求的条带编号对于n的取模运算结果。例如,获取6个io请求,这6个io请求的条带编号依次为61,62,63,75,76以及83,当n为10时,这6个io请求的条带编号对于10的取模运算结果依次为1,2,3,5,6,3。然后,根据各个io请求的取模运算结果,从公共io请求队列中获取目标io请求集合并进行处理。可以根据io处理线程的编号与取模运算结果的对应关系,将相应的io请求置入io请求集合,在该实施例中,则可以将条带编号为63以及83的io请求置入io请求集合以便3号io处理线程对io请求集合进行处理。将获取的预定个数的io请求中的每一个io请求均进行条带编号的取模运算之后,可以获取io请求集合并进行处理。

当然,io请求集合中包含的io请求个数可以进行设定和调整,在本发明的一种具体实施方式中,io请求集合中仅包含一个io请求,例如,n为10,3号io处理线程从公共io请求队列获取io请求时,对条带编号为53的io请求进行取模运算之后,将该io请求置入3号io处理线程对应的3号io请求队列,3号io处理线程在处理完条带编号为53的这一个io请求之后,确定3号io请求队列中是否为空,如果为空则继续从公共io请求队列中获取一个io请求并进行处理,如果不为空,则处理自己的请求队列中的io请求。

需要指出的是,本发明的io请求对应的条带编号可以为stripe编号,由分布式raid阵列所有成员盘中相应的分块构成。上述步骤一中的从公共io请求队列中获取预定个数的io请求,指的是在一个条带内的io请求,由于部分io请求可能跨两个条带,在确定这类io请求的条带编号时,可以将这类io请求按照其所跨的条带进行拆分,使得一个io请求拆分为两个io请求,每个io请求分别进行处理。也就是说,对于跨两个条带的一个io请求,视为两个单独的io请求进行处理。

在本发明的一种具体实施方式中,在上述步骤四之后,还包括:

针对从公共io请求队列中获取的io请求集合之外的其他每个io请求,将该io请求置入与该io请求的取模运算结果相对应的io请求队列中。

仍然以上述获取公共io请求队列中的6个io请求为例,这6个io请求的条带编号依次为61,62,63,75,76以及83,当n为10时,6个io请求的条带编号对于10的取模运算结果依次为1,2,3,5,6,3。采用本发明的该种实施方式时,将条带编号为63以及83的io请求置入io请求集合,以便3号io处理线程进行处理。对于其余4个io请求,根据这4个io请求的取模运算结果,可以将条带编号为61的io请求,置入1号io处理线程对应的1号io请求队列,将条带编号为62的io请求,置入2号io处理线程对应的2号io请求队列,将条带编号为75的io请求,置入5号io处理线程对应的5号io请求队列,将条带编号为76的io请求,置入6号io处理线程对应的6号io请求队列。

相应于上面的方法实施例,本发明实施例还提供了一种cpu多核的io请求处理装置,下文描述的一种cpu多核的io请求处理装置与上文描述的一种cpu多核的io请求处理方法可相互对应参照。

参见图2所示,为本发明中一种cpu多核的io请求处理装置的结构示意图,该装置包括以下模块:

线程启动模块201,用于启动n个io处理线程,其中,n为正整数,且至少为2,每一个io处理线程对应一个io请求队列;

公共io请求处理模块202,用于针对每一个io处理线程,当该io处理线程对应的io请求队列为空时,从公共io请求队列中获取io请求集合并进行处理;

队列io请求确定模块203,用于在处理完io请求集合之后,确定该io请求队列是否为空;如果否,则进入队列io请求处理模块204,如果是,则进入公共io请求处理模块202;

队列io请求处理模块204,用于处理该io请求队列中的io请求。

应用本发明实施例所提供的装置,启动n个io处理线程,其中,n为正整数,且至少为2,每一个io处理线程对应一个io请求队列;针对每一个io处理线程,当该io处理线程对应的io请求队列为空时,从公共io请求队列中获取io请求集合并进行处理;在处理完io请求集合之后,确定该io请求队列是否为空;如果否,则处理该io请求队列中的io请求;如果是,则执行从公共io请求队列中获取io请求集合并进行处理。

由于采用n个io处理线程,n至少为2,在处理io请求时,每个io处理线程均可以处理相对应的io请求队列中的io请求,每个io处理线程可以从公共io请求队列中获取io请求。将单线程的io请求处理变为多线程并行的io请求处理,使得可以利用cpu的多核的性能,避免了存储系统中磁盘数多时,单线程处理io请求,cpu单核导致的不能满足计算异或校验的性能需求。提高了io请求处理的性能。

在本发明的一种具体实施方式中,公共io请求处理模块202,包括:

io请求获得子模块,用于从公共io请求队列中获取预定个数的io请求;

条带编号确定子模块,用于确定获取的各个io请求相对应的条带编号;

取模结果确定子模块,用于针对每一个io请求,确定该io请求的条带编号对于n的取模运算结果;

公共io请求处理子模块,用于根据各个io请求的取模运算结果,从公共io请求队列中获取io请求集合并进行处理。

在本发明的一种具体实施方式中,还包括:

io请求分发模块,用于在根据各个io请求的取模运算结果,从公共io请求队列中获取io请求集合并进行处理之后,针对从公共io请求队列中获取的io请求集合之外的其他每个io请求,将该io请求置入与该io请求的取模运算结果相对应的io请求队列中。

在本发明的一种具体实施方式中,目标io请求集合中仅包含一个io请求。

在本发明的一种具体实施方式中,n个io处理线程为分布式raid阵列中的线程。

相应于上面的方法以及装置实施例,本发明实施例还提供了一种cpu多核的io请求处理设备,下文描述的一种cpu多核的io请求处理设备与上文描述的一种cpu多核的io请求处理方法可相互对应参照。

参见图3所示,为本发明中一种cpu多核的io请求处理设备的结构示意图,该设备包括:

存储器301,用于存储计算机程序;

处理器302,用于执行计算机程序以实现:启动n个io处理线程,其中,n为正整数,且至少为2,每一个io处理线程对应一个io请求队列;针对每一个io处理线程,当该io处理线程对应的io请求队列为空时,从公共io请求队列中获取io请求集合并进行处理;在处理完io请求集合之后,确定该io请求队列是否为空;如果否,则处理该io请求队列中的io请求;如果是,则执行从公共io请求队列中获取io请求集合并进行处理。

相应于上面的方法、装置以及设备实施例,本发明实施例还提供了一种计算机可读存储介质,计算机可读存储介质上存储有多线程io请求处理程序,多线程io请求处理程序被处理器执行时实现上述的cpu多核的io请求处理方法,此处不重复说明。

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

专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。

结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(ram)、内存、只读存储器(rom)、电可编程rom、电可擦除可编程rom、寄存器、硬盘、可移动磁盘、cd-rom、或技术领域内所公知的任意其它形式的存储介质中。

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

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