一种I/O请求消息的处理方法及控制器与流程

文档序号:12926981阅读:278来源:国知局
一种I/O请求消息的处理方法及控制器与流程
一种I/O请求消息的处理方法及控制器【技术领域】本发明涉及磁盘读/写技术,尤其涉及一种I/O请求消息的处理方法及控制器。

背景技术:
目前,输入/输出(Input/Output,I/O)调度层在将I/O请求消息下发给磁盘之前,会进行I/O请求消息的排序,用以减少数据处理的时间,在单位时间内可以处理更多的数据,提高磁盘的处理性能,还能够减少磁盘抖动,降低磁盘损耗,提高磁盘的可靠性。然而,I/O调度层对I/O请求消息的排序会导致先收到的IO请求不一定能被优先处理,从而出现I/O请求消息由于无法及时得到处理导致的I/O请求消息被饿死的问题。

技术实现要素:
有鉴于此,本发明提供一种I/O请求消息的处理方法及控制器,以避免I/O请求消息被饿死的问题。第一方面,本发明实施例提供了一种I/O请求消息的处理方法,应用于存储系统中,所述存储系统包括主机和存储设备,所述存储设备包括控制器、缓存和磁盘,包括:所述控制器接收所述主机发送的M个输入/输出I/O请求消息,M为大于1的自然数,其中每个所述I/O请求消息中包含起始地址;将所述M个I/O请求消息写入所述缓存;从所述缓存中获得N个I/O请求消息,所述N个I/O请求消息是所述M个I/O请求消息中最早接收的I/O请求消息的集合,其中,N为大于1的自然数,并且N小于或等于M;按照每个所述I/O请求消息的起始地址将所述N个I/O请求消息排序,以获得K个I/O请求消息,其中,K为大于1的自然数;从所述缓存中获得所述K个I/O请求消息;将所述K个I/O请求消息依次发送给所述磁盘。在第一方面的第一种可能的实现方式中,所述每个所述I/O请求消息中还包括长度;所述按照每个所述I/O请求消息的起始地址将所述N个I/O请求消息排序,以获得K个I/O请求消息,包括:按照每个所述I/O请求消息的起始地址,对所述N个I/O请求消息排序,以获得按照起始地址排序的N个I/O请求消息;依据每个I/O请求消息中包含的起始地址和长度,判断相邻的两个所述I/O请求消息是否连续;若相邻的两个所述I/O请求消息连续,将两个所述I/O请求消息的长度的和作为所述两个所述I/O请求消息中前一个所述I/O请求消息的长度,并删除后一个所述I/O请求消息,以合并相邻的两个所述I/O请求消息,获得按照起始地址排序的K个I/O请求消息,K小于或等于N。在第一方面的第二种可能的实现方式中,所述方法还包括:按照接收时间从远到近的顺序,对所述M个I/O请求消息进行排序。第二方面,本发明实施例提供了一种控制器,所述控制器应用于存储设备,所述存储设备还包括缓存和硬盘,所述存储设备应用于存储系统,所述存储系统还包括主机;包括:接收单元,用于接收所述主机发送的M个输入/输出I/O请求消息,M为大于1的自然数,其中每个所述I/O请求消息中包含起始地址;写入单元,用于将所述M个I/O请求消息写入所述缓存;获取单元,用于从所述缓存中获得N个I/O请求消息,所述N个I/O请求消息是所述M个I/O请求消息中最早接收的I/O请求消息的集合,其中,N为大于1的自然数,并且N小于或等于M;处理单元,用于按照每个所述I/O请求消息的起始地址将所述N个I/O请求消息排序,以获得K个I/O请求消息,其中,K为大于1的自然数;读取单元,用于从所述缓存中获得所述K个I/O请求消息;发送单元,用于将所述K个I/O请求消息依次发送给所述磁盘。在第二方面的第一种可能的实现方式中,所述每个所述I/O请求消息中还包括长度;所述处理单元具体用于:按照每个所述I/O请求消息的起始地址,对所述N个I/O请求消息排序,以获得按照起始地址排序的N个I/O请求消息;依据每个I/O请求消息中包含的起始地址和长度,判断相邻的两个所述I/O请求消息是否连续;若相邻的两个所述I/O请求消息连续,将两个所述I/O请求消息的长度的和作为所述两个所述I/O请求消息中前一个所述I/O请求消息的长度,并删除后一个所述I/O请求消息,以合并相邻的两个所述I/O请求消息,获得按照起始地址排序的K个I/O请求消息,K小于或等于N。在第二方面的第二种可能的实现方式中,所述处理单元,还用于按照接收时间从远到近的顺序,对所述M个I/O请求消息进行排序。通过上述技术方案,对收到的I/O请求消息中最早收到的部分I/O请求消息按照起始地址进行排序,能够避免先收到的IO请求不能被优先处理,从而出现的I/O请求消息被饿死的问题,能够提升I/O请求消息在磁盘上的顺序度。【附图说明】为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。图1是本发明实施例所提供的I/O请求消息的处理方法的流程示意图;图2是本发明实施例利用请求接收队列和请求发送队列的I/O请求消息的处理方法的示意图;图3是本发明实施例所提供的I/O请求消息的处理方法的应用场景的示意图;图4是本发明实施例所提供的控制器的功能方块图;图5是本发明实施例所提供的控制器的结构示意图。【具体实施方式】为了更好的理解本发明的技术方案,下面结合附图对本发明实施例进行详细描述。应当明确,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。本发明实施例给出一种I/O请求消息的处理方法,该方法应用于存储系统中,该存储系统包括主机和存储设备,存储设备包括控制器、缓存和磁盘。请参考图1,其为本发明实施例所提供的I/O请求消息的处理方法的流程示意图;如图所示,该方法包括以下步骤:步骤101,控制器接收主机发送的M个I/O请求消息,M为大于1的自然数,其中每个I/O请求消息中包含起始地址;将M个I/O请求消息写入所述缓存。具体的,如图2所示,本发明实施例中,预先在缓存中创建两个队列,即请求接收队列和请求发送队列;其中,请求接收队列用于缓存控制器接收到的I/O请求消息,请求发送队列用于向磁盘发送I/O请求消息。控制器接收需要对I/O请求消息进行排序的主机发送的M个I/O请求消息,所述I/O请求消息中包含起始地址和长度,控制器将M个I/O请求消息写入缓存。控制器依据起始地址和长度,判断收到的I/O请求消息能否与预设的请求接收队列中最后一个I/O请求消息合并;若收到的I/O请求消息中包含的起始地址,不等于最后一个I/O请求消息的起始地址与长度的之和,表示收到的I/O请求消息与请求接收队列中最后一个I/O请求消息不连续,则判断出收到的I/O请求消息与请求接收队列中最后一个I/O请求消息不能合并,将收到的I/O请求消息插入请求接收队列的队尾,以获得按照接收时间从远到近排序的M个I/O请求消息,即按照接收时间从远到近的顺序,对所述M个I/O请求消息进行排序;对于所述请求接收队列中包含的M个I/O请求消息,M为大于1的自然数。若收到的I/O请求消息中包含的起始地址,等于当前最后一个I/O请求消息的起始地址与长度的之和,表示收到的I/O请求消息与请求接收队列中最后一个I/O请求消息连续,则判断出收到的I/O请求消息与请求接收队列中最后一个I/O请求消息可以合并,将收到的I/O请求消息与最后一个I/O请求消息合并,即按照接收时间从远到近的顺序,对所述M个I/O请求消息进行排序。其中,若请求接收队列中最后一个I/O请求消息为第一I/O请求消息,收到的I/O请求消息为第二I/O请求消息,将第一I/O请求消息和第二I/O请求消息合并,获得第三I/O请求消息的方法可以包括:第一I/O请求消息中包含的起始地址作为第三I/O请求消息中包含的起始地址,依据第一I/O请求消息的长度与第二I/O请求消息的长度的和,获得第三I/O请求消息的长度,从而获得第三I/O请求消息;换句话说,将收到的I/O请求消息与当前最后一个I/O请求消息合并,可以利用第一I/O请求消息的长度与第二I/O请求消息的长度之和,更新第一I/O请求消息的长度,即将第二I/O请求消息合并到第一I/O请求消息中,因此,需要删除第二I/O请求消息。例如,第一I/O请求消息中起始地址为0,长度为10个单位,第二I/O请求消息中起始地址为10,长度为20,则第二I/O请求消息中包含的起始地址10等于第一I/O请求消息的起始地址0与长度10之和,因此第一I/O请求消息和第二I/O请求消息连续,可以合并第一I/O请求消息和第二I/O请求消息,获得第三I/O请求消息,所述第三I/O请求消息包含的起始地址为0,长度为30;其中,所述起始地址可以为LBA。步骤102,从所述缓存中获得N个I/O请求消息,所述N个I/O请求消息是所述M个I/O请求消息中最早接收的I/O请求消息的集合,其中,N为大于1的自然数,并且N小于或等于M。具体的,如图2所示,控制器对缓存中预设的请求发送队列进行检测,若检测出所述请求发送队列中没有I/O请求消息,则从缓存中按照接收时间排序的M个I/O请求消息中,获得N个I/O请求消息,所述N个I/O请求消息是所述M个I/O请求消息中最早接收的I/O请求消息的集合,即由于M个I/O请求消息是按照接收时间由远到近排序的,因此,越早接收的I/O请求消息的排序越靠前,因此可以获得M个I/O请求消息中的前N个I/O请求消息,其中,N为大于1的自然数,并且N小于或等于M。其中,为了防止I/O请求消息被饿死,即不能因为排序导致某个I/O请求消息的时延超过截止时间T,如目前在Linux的通用块设备的排序算法中,截止时间(Deadline)T等于500ms;本实施例中,获得的I/O请求消息的数目N等于截止时间T除以单个请求的处理时间;其中,磁盘的单个请求的处理时间是由磁盘类型D_Type和I/O请求消息的长度共同决定,则利用如下公式可以获得的I/O请求消息的数目N:N=T/f(D_Type,IO_Size)一般情况下,磁盘类型D_Type和截止时间T的数值大小比较稳定,因此,实际应用中,可以根据业务,对I/O请求消息的长度进行处理,来动态的调整获得的I/O请求消息的数目N。需要说明的是,只有当控制器检测出所述缓存中请求发送队列中没有I/O请求消息时,才需要从所述M个I/O请求消息中获得前N个I/O请求消息;然后当再次检测到所述请求发送队列中没有I/O请求消息时,再从M个I/O请求消息中获得前N个I/O请求消息,本次获得I/O请求消息时,M个I/O请求消息可以等于上一次M个I/O请求消息与上一次获得的N个I/O请求消息之差,即M-N个I/O请求消息,或者,M个I/O请求消息可以等于上一次M个I/O请求消息与上一次获得的N个I/O请求消息之差,再加上两次获得的N个I/O请求消息之间的时间段内新收到的I/O请求消息;以此类推,可以循环地从M个I/O请求消息中获得前N个I/O请求消息。步骤103,按照每个所述I/O请求消息的起始地址将所述N个I/O请求消息排序,以获得K个I/O请求消息,其中,K为大于1的自然数。具体的,对于每次从M个I/O请求消息中获得的前N个I/O请求消息,按照每个I/O请求消息的起始地址,对获得的N个I/O请求消息进行排序,获得按照起始地址排序的N个I/O请求消息;例如,起始地址排在前面的I/O请求消息的排序靠前,起始地址排在后面的I/O请求消息的排序靠后。在获得按照起始地址排序的N个I/O请求消息后,依据每个I/O请求消息中包含的起始地址和长度,依次判断相邻的两个I/O请求消息是否连续,若相邻的两个I/O请求消息连续,则将两个所述I/O请求消息的长度的和作为所述两个所述I/O请求消息中前一个所述I/O请求消息的长度,并删除后一个所述I/O请求消息,以合并相邻的两个所述I/O请求消息,获得按照起始地址排序的K个I/O请求消息;若相邻的两个I/O请求消息不连续,则这两个I/O请求消息不合并,继续判断其他相邻的两个I/O请求消息,直到所有I/O请求消息都判断完毕,获得按照起始地址排序的K个I/O请求消息,K为大于1的自然数,并且K小于或等于N;控制器将获得的K个I/O请求消息写入缓存的请求发送队列。步骤104,从所述缓存中获得所述K个I/O请求消息;将所述K个I/O请求消息依次发送给所述磁盘。具体的,从缓存的请求发送队列中获得所述K个I/O请求消息,然后从第一个I/O请求消息开始,将K个I/O请求消息依次发送给磁盘驱动设备,以便于磁盘驱动设备向磁盘发送I/O请求消息。其中,由于磁盘无法识别I/O请求消息,因此,需要先将I/O请求消息发送给磁盘驱动设备,以便于磁盘驱动设备依据收到的I/O请求消息向磁盘输入数据或从磁盘读取数据,即由磁盘驱动设备将I/O请求消息转化为磁盘能够识别的I/O请求消息,然后磁盘驱动设备将转化后得到的I/O请求消息发送给磁盘,以实现向磁盘输入数据或从所述磁盘读取数据。需要说明的是,当请求发送队列为空时,才从请求接收队列中获得I/O请求消息,并将获得的I/O请求消息排序后写入请求发送队列;若请求发送队列不为空,即请求发送队列中还有未发送给磁盘驱动设备的I/O请求消息,则需要先将请求发送队列中的I/O请求消息全都发送到磁盘驱动设备,直到请求发送队列中全部的I/O请求消息都发送完毕,才写入新的I/O请求消息。请参考图3,图3为本发明实施例所提供的I/O请求消息的处理方法的应用场景的示意图;如图所示,上述存储设备可以为磁盘阵列系统,现有技术中,是由廉价冗余磁盘阵列(RedundantArrayofIndependentDisks,RAID)模块直接将主机发送的I/O请求消息下发给磁盘I/O处理模块,本发明实施例中,控制器包括阵列前端、RAID模块、排序算法模块和磁盘I/O处理模块,在RAID模块和磁盘I/O处理模块之间增加一个排序算法模块,对于RAID模块下发的I/O请求消息,该排序算法模块利用本发明实施例所提供的I/O请求消息的处理方法,对I/O请求消息进行排序,然后将排序后得到的I/O请求消息下发给磁盘I/O处理模块,再由磁盘I/O处理模块发送给磁盘。本发明实施例进一步给出实现上述方法实施例中各步骤及方法的装置实施例。请参考图4,其为本发明实施例所提供的控制器的功能方块图,所述控制器应用于存储设备,所述存储设备还包括缓存和硬盘,所述存储设备应用于存储系统,所述存储系统还包括主机;如图所示,该控制器包括:接收单元401,用于接收所述主机发送的M个输入/输出I/O请求消息,M为大于1的自然数,其中每个所述I/O请求消息中包含起始地址;写入单元402,用于将所述M个I/O请求消息写入所述缓存;获取单元403,用于从所述缓存中获得N个I/O请求消息,所述N个I/O请求消息是所述M个I/O请求消息中最早接收的I/O请求消息的集合,其中,N为大于1的自然数,并且N小于或等于M;处理单元404,用于按照每个所述I/O请求消息的起始地址将所述N个I/O请求消息排序,以获得K个I/O请求消息,其中,K为大于1的自然数;读取单元405,用于从所述缓存中获得所述K个I/O请求消息;发送单元406,用于将所述K个I/O请求消息依次发送给所述磁盘。其中,所述每个所述I/O请求消息中还包括长度;所述处理单元404具体用于:按照每个所述I/O请求消息的起始地址,对所述N个I/O请求消息排序,以获得按照起始地址排序的N个I/O请求消息;依据每个I/O请求消息中包含的起始地址和长度,判断相邻的两个所述I/O请求消息是否连续;若相邻的两个所述I/O请求消息连续,将两个所述I/O请求消息的长度的和作为所述两个所述I/O请求消息中前一个所述I/O请求消息的长度,并删除后一个所述I/O请求消息,以合并相邻的两个所述I/O请求消息,获得按照起始地址排序的K个I/O请求消息,K小于或等于N。其中,所述处理单元404,还用于按照接收时间从远到近的顺序,对所述M个I/O请求消息进行排序。请参考图5,其为本发明实施例所提供的一种控制器的结构示意图。如图所示,该控制器包括:接收器501,用于接收所述主机发送的M个输入/输出I/O请求消息,M为大于1的自然数,其中每个所述I/O请求消息中包含起始地址;存储器502,用于存储包括程序例程的信息;处理器503,与接收器501、存储器502和发射器504分别耦合,用于控制所述程序例程的执行,具体包括:将所述M个I/O请求消息写入所述缓存;从所述缓存中获得N个I/O请求消息,所述N个I/O请求消息是所述M个I/O请求消息中最早接收的I/O请求消息的集合,其中,N为大于1的自然数,并且N小于或等于M;按照每个所述I/O请求消息的起始地址将所述N个I/O请求消息排序,以获得K个I/O请求消息,其中,K为大于1的自然数;从所述缓存中获得所述K个I/O请求消息;发射器504,用于将所述K个I/O请求消息依次发送给所述磁盘。本发明实施例提供上述技术方案具有以下有益效果:1、对收到的I/O请求消息中最早收到的部分I/O请求消息按照起始地址进行排序,能够在一定程度上解决I/O请求消息被饿死的问题,从而提升I/O请求消息在磁盘上的顺序度,提高磁盘性能。2、如果在RAID组下创建多个逻辑单元号(LogicUnitNumber,LUN),对LUN上的I/O请求消息,若进行全局排序,I/O请求消息的优先级就会不同,因为靠后的LUN上I/O请求消息的优先级就会一直比较低,因此,本发明实施例中对局部的I/O请求消息按照起始地址排序,可以解决上述同一RAID组下不同LUN上I/O请求消息的优先级问题。以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1