具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明提供了一种输入输出请求调度方法、存储阵列以及存储控制器。为了更好的理解本发明实施例的技术方案,下面结合附图对本发明提供的实施例进行详细地描述。
参见图2,图2是本发明实施例一提供的输入输出请求调度方法的流程图。
本发明实施例提供的输入输出请求调度方法可以包括:
A1、接收主机发送的输入输出请求,输入输出请求中携带目标地址信息。
具体的,存储控制器可以接收主机发送的输入输出请求,例如错误处理IO请求,定时处理IO请求等,存储控制器接收到的输入输出请求中携带目标地址信息。其中,目标地址信息中可以包括下层对象、偏移地址、数据长度等信息。
A2、根据目标地址信息调用目标器子类中的处理函数,目标器子类是从预置的基类中继承得到的。
具体的,存储控制器可以根据目标地址信息来调用目标器子类中的处理函数,目标器子类是从预置的基类中继承得到的。
其中,预置的基类是对现有RAID IO对象、复制IO对象、快照IO对象、Cache IO对象以及Target IO对象等进行抽象得到的,基类中包括IO本身的特性(即数据部分)以及IO操作的特性(即处理函数)。目标器子类继承了基类中的数据部分和处理函数,同时针对目标器本身的特性又增加了其它的数据部分和处理函数。
A3、根据目标器子类中的处理函数的输出结果调用缓存子类中的处理函数,缓存子类是从预置的基类中继承得到的。
具体的,存储控制器可以根据步骤A2中的目标器子类中的处理函数的输出结果进一步调用下一级处理函数,即调用缓存子类中的处理函数,缓存子类是从预置的基类中继承得到。其中,缓存子类中的处理函数的输出结果可以包括下层对象、偏移地址、长度等信息。缓存子类继承了基类中的数据部分和处理函数,同时针对缓存本身的特性又增加了其它的数据部分和处理函数。
A4、根据缓存子类中的处理函数的输出结果调用独立冗余磁盘阵列算法子类中的处理函数,独立冗余磁盘阵列算法子类是从预置的基类中继承得到的。
具体的,存储控制器可以根据步骤A3中的缓存子类中的处理函数的输出结果进一步调用下一级处理函数,即调用独立冗余磁盘阵列算法子类中的处理函数,独立冗余磁盘阵列算法子类是从预置的基类中继承得到。独立冗余磁盘阵列算法子类继承了基类中的数据部分和处理函数,同时针对独立冗余磁盘阵列算法模块本身的特性又增加了其它的数据部分和处理函数。
其中,独立冗余磁盘阵列算法可以包括RAID0~RAID7等多种算法。
A5、根据独立冗余磁盘阵列算法子类中的处理函数的输出结果调用磁盘子类中的处理函数,磁盘子类是从预置的基类中继承得到的。
具体的,存储控制器可以根据步骤A4中的独立冗余磁盘阵列算法子类中的处理函数的输出结果进一步调用下一级处理函数,即调用磁盘子类中的处理函数,磁盘子类是从预置的基类中继承得到的。磁盘子类继承了基类中的数据部分和处理函数,同时针对磁盘本身的特性增加了其它的数据部分和处理函数。
磁盘子类中的处理函数进行相应的处理,完成磁盘的读写请求,磁盘子类中的处理函数设置返回值,通知上一级模块IO请求处理完成。
在本发明实施例中,存储控制器在接收到IO请求后,顺序调用从基类中继承得到的目标器子类中的处理函数、缓存子类中的处理函数、独立冗余磁盘阵列算法子类中的处理函数以及磁盘子类中的处理函数,只需要一个线程来执行全部调用过程,即一个线程可以运行完IO执行的所有阶段,执行过程无需和其它线程做上下文切换,进而减少线程之间的锁竞争,提高IO的处理速度,进而提高存储系统的性能。
在本发明实施例中,基类中IO本身的特性可以包括:
1)IO数据发送的对象,即IO数据在存储介质中的实际地址;
2)IO数据的偏移;
3)IO数据的长度;
4)IO之间的可能依赖关系等其它数据。
IO操作的特性可以包括:
1)启动IO的执行;
2)IO执行完毕后的回调;
3)当前的IO还存在子IO,子IO执行完毕等其它处理函数。
基类中参数可以如表1所示。
表1
ABSTRACT-IO |
IO-DEV |
IO-OFFSET |
IO-LEN |
IO-CHILD |
*IO-BEGIN(); |
*IO_END(); |
*IO_CHILDEND(); |
其中,数据部分中的IO-DEV表示IO数据发送的对象,IO-OFFSET表示IO数据的偏移,IO-LEN表示IO数据的长度,IO-CHILD表示IO之间的可能依赖关系。
函数部分中的*IO-BEGIN()处理函数表示启动IO的执行,*IO_END()处理函数表示IO执行完毕后的回调,*IO_CHILDEND()表示当前的IO还存在子IO。
本发明实施例中存储控制器根据接收到的目标地址信息调用从子类中继承中得到的目标器子类的处理函数,目标器子类的中的参数可以如表2所示。需要指出的是,目标器子类中的参数不限于表4中数据部分和函数部分,其中的参数(数据或函数)还可以根据实际需要进行增加。
表2
IO-OFFSET=64K |
IO-LEN=16K |
IO-CHILD=NULL |
*IO-BEGIN()=TGT-BEGIN(); |
*IO_END()=TGT-END(); |
*IO_CHILDEND()=TGT-CHILDEND(); |
存储控制器在调用目标器子类中的处理函数后,获得目标器子类中处理函数的输出结果,从而进一步调用缓存子类中的处理函数。其中,目标器子类的处理函数的输出结果中包括缓存子类中IO-DEV、IO-OFFSET、IO-LEN、IO-CHILD的具体参数值。此时,缓存子类中的参数具体可以如表3所示。需要指出的是,缓存子类中的参数不限于表4中数据部分和函数部分,其中的参数(数据或处理函数)还可以根据实际需要进行增加。
表3
CACHE-IO |
IO-DEV=DEV3 |
IO-OFFSET=128K |
IO-LEN=4K |
IO-CHILD=NULL |
*IO-BEGIN()=CACHE-BEGIN(); |
*IO_END()=CACHE-END(); |
*IO_CHILDEND()=CACHE-CHILDEND(); |
存储控制器在调用缓存子类中的处理函数后,获得缓存子类中处理函数的输出结果,从而进一步调用独立冗余磁盘阵列算法子类中的处理函数。其中,缓存子类的处理函数的输出结果中包括独立冗余磁盘阵列算法子类中IO-DEV、IO-OFFSET、IO-LEN、IO-CHILD的具体参数值。此时,独立冗余磁盘阵列算法子类中的参数具体可以如表4所示。需要指出的是,独立冗余磁盘阵列算法子类中的参数不限于表4中数据部分和函数部分,其中的参数(数据或处理函数)还可以根据实际需要进行增加。
表4
RAID5-IO |
IO-DEV=DEV1 |
IO-OFFSET=0 |
IO-LEN=4K |
IO-CHILD=NULL |
*IO-BEGIN()=RAID5-BEGIN(); |
*IO_END()=RAID5-END(); |
*IO_CHILDEND()=RAID5-CHILDEND(); |
在本发明实施例中,接收到的IO请求中可以包括错误处理IO请求,此时存储控制器立即执行接收到的错误处理IO,即根据错误处理IO来执行上述步骤A2-A4。
参见图3,图3是本发明实施例提供的输入输出请求调度方法中根据目标地址信息调用目标器子类中的处理函数的实施例的方法流程图。
在本发明实施例中,接收到的IO请求中可以包括定时处理IO请求,此时存储控制器将接收到的输入输出请求中定时处理输入输出请求加入到预置的定时处理队列中,存储控制器根据目标地址信息调用目标器子类中的处理函数的步骤可以包括:
B1、判断预置的定时器是否到时。
其中,预置的定时器可以由存储系统的硬件或软件来设置定时任务。本发明实施例可以通过比较硬件时钟来判断定时器时间是否到达。
B2、定时器到时时,获取接收到的输入输出请求中的定时处理输入输出请求。
具体的,若步骤B1中判断预置的定时器到时,则说明需要处理接收到的定时处理IO请求,本发明实施例进而获取接收到的输入输出请求中的定时处理输入输出请求,例如周期性处理的IO请求。
B3、根据获取的定时处理输入输出请求中携带的目标地址信息调用目标器子类中的处理函数。
具体的,存储控制器根据获取的定时处理IO请求中的目标地址信息调用目标器子类中的处理函数,实现对定时处理IO请求的处理。本发明实施例通过将定时处理IO请求加入到定时处理队列中,可以保证定时处理IO请求优先于其它的IO请求被处理,提高系统的稳定性和灵活性。
在本发明实施例中,在将定时处理输入输出请求加入到定时处理队列之后,还可以获取接收到的输入输出请求中除定时处理请求之外的输入输出请求的优先级,然后将将优先级低于预置级别的输入输出请求加入到低优先级等候队列中,将优先级高于预置级别的输入输出请求加入到高优先级等候队列中。其中,预置级别可以根据不同的存储系统来设置。
本发明实施例提供的根据目标地址信息调用目标器子类中的处理函数的实施例可以进一步包括:
B4、定时器没有到时,判断高优先级队列中是否存在输入输出请求。
具体的,存储控制器在步骤B1中判断预置的定时器没有到时,则进一步判断高优先级队列中是否存在输入输出请求,即判断高优先级队列是否为空。
B5、高优先级队列中存在输入输出请求,获取高优先级队列中的第一输入输出请求。
具体的,若步骤B4中判断高优先级队列中存在IO请求,即高优先级队列不为空,则获取高优先级队列中的一个输入输出请求,本发明实施例中称为第一输入输出请求。第一输入输出请求例如可以为返回主机读写请求完成的IO请求等。
需要说明的是,上述获取高优先级队列中的一个输入输出请求并不能理解为对本发明的第一输入输出请求的限制,在本实施例中,存储控制器也可以获取高优先级队列中的多个输入输出请求,在获取多个输入输出请求时,多个输入输出请求按照并发的形式操作。
B6、根据第一输入输出请求中携带的目标地址信息调用目标器子类中的处理函数。
具体的,存储控制器根据第一输入输出请求中携带的目标地址信息调用目标器子类中的处理函数,然后依次调用缓存子类中的处理函数、独立冗余磁盘阵列算法子类中的处理函数,最终完成对第一输入输出请求的处理。
本发明实施例在判断高优先级队列中存在输入输出请求时,优先处理高优先级队列中的输入输出请求,本发明实施例对IO请求的处理方式更为灵活,可以适应更多的应用场景。
另外,本发明实施例提供的根据目标地址信息调用目标器子类中的处理函数的实施例可以进一步包括:
B7、高优先级队列中不存在输入输出请求,则获取低优先级队列中的第二输入输出请求。
具体的,若步骤B4中判断高优先级队列中不存在输入输出请求,即高优先级队列为空时,则存储控制器获取低优先级队列中的一个输入输出请求,在本发明实施例中称为第二输入输出请求。第二输入输出请求例如可以为CACHE的碎片整理请求等。
B8、根据第二输入输出请求中携带的目标地址信息调用目标器子类中的处理函数。
具体的,存储控制器根据第二输入输出请求中携带的目标地址信息调用目标器子类中的处理函数,然后依次调用缓存子类中的处理函数、独立冗余磁盘阵列算法子类中的处理函数,最终完成对第二输入输出请求的处理。
本发明实施例在判断高优先级队列中不存在输入输出请求时,进而处理低优先级队列中的输入输出请求,本发明实施例对IO请求的处理方式更为灵活,可以适应更多的应用场景。
此外,本发明实施例在根据独立冗余磁盘阵列算法子类中的处理函数的输出结果调用磁盘子类中的处理函数之后,即在预设数量的IO执行完毕之后,当接收到新的IO请求时,还可以获取高优先级队列和低优先级队列当前的队列深度,并且在低优先级队列的队列深度减去高优先级队列的队列深度的差大于预设值时,降低预置级别的等级,即实现减小较低优先级队列的队列深度,从而实现低优先级队列中的IO请求的等待时间不会过长,使得低优先级队列中的IO请求可以被公平调度到。需要说明的是,预设数量的IO可以根据实际的存储系统来灵活确定,预设数量可以为1或其他的数值。
例如,低优先级队列的队列深度为20,而高优先级队列的队列深度为5,存储系统的预设值为8(存储系统有多个中央处理器CPU,预设值设置为8);此时,低优先级队列的队列深度减去高优先级队列的队列深度等于15,大于预设值8,则可以降低预置级别的等级,从而让低优先级队列得以执行。
本发明实施例还可以使用权重法,首先将队列的优先级、队列深度、队列未得到调度时间作为输入因素,每个因素有一定的权重,优先级权重为5,队列深度权重为3,未得到调度时间权重为2。
权重法举例如下:有2个队列,优先级值分别为10、8;优先级为10的队列深度是5(队列中包含5个IO请求),优先级为8的队列深度是20;优先级为10队列未得到调度时间是0(刚执行),优先级为8队列未得到调度时间是3ms。
然后,计算优先级10的队列的权重:优先级*优先级的权重+队列深度*队列深度的权重+未得到调度时间*权重=10*5+5*3+0*2=65。
计算优先级8队列的权重:8*5+10*3+3*2=76,因此,本发明实施例就会从优先级8的队列选取IO请求执行。
需要指出的是,调整预置级别的方法不限于此,还可以使用其它的算法来调整预置级别,实现低优先级队列和高优先级队列中的IO请求的调度达到平衡即可。
以上对本发明实施例提供的输入输出请求调度方法进行了详细描述,本发明实施例还提供了和上述方法实施例对应的存储控制器实施例和存储阵列实施例。
参见图4,图4是本发明实施例三提供的存储控制器的结构示意图。
本发明实施例提供的存储控制器主要包括:
输入输出接收单元110,用于接收主机发送的输入输出请求,输入输出请求中携带目标地址信息;
函数调用单元120,用于根据目标地址信息调用目标器子类中的处理函数,目标器子类是从预置的基类中继承得到的;
上述函数调用单元120还根据目标器子类中的处理函数的输出结果调用缓存子类中的处理函数,缓存子类是从预置的基类中继承得到的;
上述函数调用单元120还根据缓存子类中的处理函数的输出结果调用阵列子类中的处理函数,阵列子类是从预置的基类中继承得到的;
上述函数调用单元120还根据阵列子类中的处理函数的输出结果调用磁盘子类中的处理函数,磁盘子类是从预置的基类中继承得到的。
在本发明提供的存储控制器可以使用在前述对应的输入输出请求调度方法实施例中,存储控制器在接收到IO请求后,顺序调用从基类中继承得到的目标器子类中的处理函数、缓存子类中的处理函数、独立冗余磁盘阵列算法子类中的处理函数以及磁盘子类中的处理函数,只需要一个线程来执行全部调用过程,即一个线程可以运行完IO执行的所有阶段,执行过程中无需和其它线程做上下文切换,进而减少线程之间的锁竞争,提高IO的处理速度,进而提高存储系统的性能。
参见图5,图5是本发明实施例四提供的存储控制器的结构示意图。
本发明实施例五提供的存储控制器主要包括:输入输出接收单元210和函数调用单元220以及定时请求处理单元230。其中,函数调用单元包括上述第三实施例的存储控制器中的函数调用单元的功能,在此不再重复描述。函数调用单元还可以包括:定时判断模块221,用于判断预置的定时器是否到时;
第一获取模块222,用于在定时判断单元221判断定时器到时,则获取接收到的输入输出请求中的定时处理输入输出请求;
函数调用模块223,用于根据获取的定时处理输入输出请求中携带的目标地址信息调用目标器子类中的处理函数。
本发明实施例提供的存储控制器通过将定时处理IO请求加入到定时处理队列中,可以保证定时处理IO请求优先于其它的IO请求被处理,提高系统的稳定性和灵活性。
本发明实施例提供的存储控制器还可以包括:
优先级获取单元,用于在定时请求处理单元将定时处理输入输出请求加入到定时处理队列之后,获取接收到的输入输出请求中除定时处理请求之外的输入输出请求的优先级;队列调度单元,用于将优先级低于预置级别的输入输出请求加入到低优先级等候队列中,将优先级高于预置级别的输入输出请求加入到高优先级等候队列中。
进而,存储控制器中的函数调用单元还包括:
队列判断模块,用于在定时判断单元判断定时器没有到时,则判断高优先级队列中是否存在输入输出请求;
第二获取模块,用于在队列判断单元判断高优先级队列中存在输入输出请求,则获取高优先级队列中的第一输入输出请求;
函数调用模块还根据第一输入输出请求中携带的目标地址信息调用目标器子类中的处理函数。
进一步的,存储控制器中的函数调用单元还可以包括:
第三获取模块,用于在队列判断模块判断高优先级队列中不存在输入输出请求,则获取低优先级队列中的第二输入输出请求;
函数调用模块还用于根据第二输入输出请求中携带的目标地址信息调用目标器子类中的处理函数。
另外,本发明实施例中的存储控制器还可以包括;
队列深度获取单元,用于在函数调用单元根据独立冗余磁盘阵列算法子类中的处理函数的输出结果调用磁盘子类中的处理函数之后,获取高优先级队列和优先级队列当前的队列深度;
预置级别调整单元,用于在低优先级队列的队列深度减去高优先级队列的队列深度的差大于预设值时,降低预置级别的等级。
本发明实施例提供的存储控制器在判断高优先级队列中存在输入输出请求时,优先处理高优先级队列中的输入输出请求,本发明实施例对IO请求的处理方式更为灵活,可以适应更多的应用场景。
另外,本发明实施例还提供一种存储阵列,存储阵列中包括存储控制器和存储器,存储器可以为磁盘,闪存或动态随机存储器(DRAM,Dynamic Random Access Memory)等存储介质,存储控制器包括:输入输出接收单元,用于接收主机发送的输入输出请求,输入输出请求中携带目标地址信息;
函数调用单元,用于根据目标地址信息调用目标器子类中的处理函数,目标器子类是从预置的基类中继承得到的;
函数调用单元还根据目标器子类中的处理函数的输出结果调用缓存子类中的处理函数,缓存子类是从预置的基类中继承得到的;
函数调用单元还根据缓存子类中的处理函数的输出结果调用阵列子类中的处理函数,阵列子类是从预置的基类中继承得到的;
函数调用单元还根据阵列子类中的处理函数的输出结果调用磁盘子类中的处理函数,磁盘子类是从预置的基类中继承得到的。
本发明实施例提供的存储阵列中的存储控制器可以执行前述实施例一提供的输入输出请求调度方法,具体执行过程不再详细描述。存储阵列中存储控制器的具体结构参见上述存储控制器的实施例,在此不再重复描述。
需要说明的是,上述装置内的各单元之间的信息交互、执行过程等内容,由于与本发明方法实施例基于同一构思,具体内容可参见本发明方法实施例中的叙述,此处不再赘述。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,的程序可存储于计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
以上对本发明实施例提供的输入输出请求调度方法、存储控制器以及存储阵列进行了详细介绍,对于本领域的一般技术人员,依据本发明实施例的思想,在具体实施方式及应用范围上均会有改变之处,本说明书内容不应理解为对本发明的限制。