本发明涉及计算机存储计算技术领域,尤其涉及一种IO调度方法及IO调度装置。
背景技术:
随着互联网、云计算、物联网等技术的发展,固态硬盘作为新的一代存储,被广泛应用。目前调度算法主要有两类,一、先进先出服务FIFO;二、电梯算法,也即就近原则进行服务。传统的IO调度方式主要结合机械硬盘的寻址特点采用电梯算法实现,简单利用电梯算法不能充分发挥固态硬盘SSD的特性进行处理。而且,由于缓存的存在,改变了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操作。
进一步地,还包括:判断IO请求的待操作固态硬盘的物理地址是否在地址映射表中,若否,则将该IO请求的待操作固态硬盘的物理地址存入临时地址映射表,每个周期后,将临时地址映射表并入地址映射表。
本发明提供一种IO调度装置,包括:
应用模块,用于组织IO请求,并将IO请求发送给IO调度模块;
地址映射表创建模块,用于在缓存中建立固态硬盘的地址映射表;
IO调度模块,用于接收IO请求,将IO请求加入到IO调度队列中,调度队列包括多个不同优先级的子队列;
IO操作模块,用于根据IO调度队列的优先级,选择IO请求并下发到固态硬盘进行处理;
第一判断模块,用于判断IO请求的待操作固态硬盘的物理地址的是否在地址映射表中;
第二判断模块,判断IO请求的待操作固态硬盘是否正在进行垃圾回收操作。
优选地,还包括:
时间检测模块,用于记录IO请求进入IO调度队列的时间。
优选地,还包括:
轮询模块,用于根据子队列的优先级对IO调度队列进行周期性操作。
进一步地,还包括:
临时地址映射表创建模块,用于创建临时地址映射表,所述临时地址映射表用于暂存未被操作的IO请求的待操作固态硬盘的物理地址,每个周期后,将临时地址映射表并入地址映射表。
本发明所提供的一种IO调度方法,有益效果如下:
1.本发明结合固态硬盘的特点,通过判断IO请求的待操作固态硬盘的物理地址是否在地址映射表中;判断IO请求的待操作固态硬盘是否正在进行垃圾回收操作,使固态硬盘的IO调度过程具有缓存感知、垃圾回收感知的功能,解决了固态硬盘写操作需要先擦除后再写入、写操作次数受限等问题,提高固态硬盘的读写速度,从一定方面也提高了固态硬盘的使用寿命;
2.本发明设有时间检测模块,在IO进行队列之前,记录IO的操作时间,系统通过时间检测模块检测IO队列中是否有IO操作达到最长的等待时间,如果达到最长等待时间,IO将被强制处理,避免了某些IO长时间没有处理的情况,提高提高固态硬盘的读写效率;
本发明所提供的IO调度装置与IO调度方法的有益效果类似,不再赘述。
附图说明:
图1为本发明实施例所提供的IO调度方法的流程示意图;
图2为本发明实施例所提供的IO调度装置的模块示意图;
具体实施方式:
依照附图详细说明关于本发明的示例性实施例。
本发明提供一种IO调度方法,包括:
缓存中,通过IO调度将IO请求形成IO调度队列;
判断IO请求的待操作固态硬盘的物理地址是否在地址映射表中:若是则进行下一步;否则将IO请求放回IO调度队列;
判断IO请求的待操作固态硬盘是否正在进行垃圾回收操作:若是则将IO请求放回IO调度队列;否则将IO请求进行IO操作。
请参考图1,图1为本发明实施例所提供的IO调度方法的流程示意图;本实施例提供一种IO调度方法,结合固态硬盘地址映射的特点和垃圾回收的特点进行映射,包括以下步骤:
S101、缓存中,通过IO调度将IO请求形成IO调度队列;
其中,具体步骤为:
在缓存中,以预设值为单位组织IO请求,在本实施例中,以页为单位进行组织IO请求,页的大小为4K;
作为一种可实施方式,预设值还可以设置为2K、8K、16K、32K等。
将IO请求进行IO调度;
将IO请求形成IO调度队列。
所述IO调度队列包括有多个不同优先级的子队列,在本实施例中,IO调度队列是一个多子队列数据结构,每个子队列具有不同的优先级。每个子队列的IO数目相等,均等于QueueMax。当一个子队列(N)的IO请求数达到最大值时,将从子队列链表底部抽取IO请求移到前一个子队列。
作为一种可实施方式,所述IO调度队列还可以包括一个数组,数组的长度为优先级的个数,设置序号为0为最高调度优先级。数组的每个元素包括一个链表指针,该指针用于指向属于该优先级的IO请求。另外还可以采用链表、树等其他数据结果进行存储。
作为另一种可实施方式,所述数组元素还可以保存当前是否有IO请求需要处理的信息。除此之外,所述数据元素还可以保存与应用属性、固态盘属性相关的信息。
根据优先级周期性地对IO调度队列中的IO请求进行IO操作,在本实施例中, IO操作模块从优先级最高的队列进行处理,当一个队列处理完成之后即进行休眠状态;当时间片轮转到之后,继续上述处理,直至队列中所有的操作均被请求完成。其中,时间片轮转是分时操作系统任务调度机制。在完成指定的任务后,可以将系统转入休眠状态,当达到预设的时间或者达到调度条件后,可以继续执行。
在步骤S101进行的同时,记录IO请求进入IO调度队列的时间,进入时间达到预设值的IO请求将被强制进行IO操作。在本实施例中,通过一个时间检测模块记录IO请求进入IO调度队列的时间。
作为一种可实施方式,系统通过deadline检测模块检测IO队列中是否有IO操作达到最长的等待时间Qmax,如果达到最长等待时间,IO将被强制处理。所述deadline检测模块,通过系统的Timer机制实现检测程序定时运行。当运行器达到预设的时间如1秒种,就激发检测程序检测IO队列中IO请求等待时长,当检测到等待时间达到Qmax时,将被处理。该模块检测完成所有的IO请求后,创建新的定时器。
S102、在缓存中,建立固态硬盘的地址映射表。固态硬盘的地址映射表的换入换出由驱动实现的,即驱动程序根据一定的规则将存储的固态硬盘的映射表调入内存中,本发明所涉及的机制将优先处理映射表在缓存中的IO请求。
S103、判断IO请求的待操作固态硬盘的物理地址是否在地址映射表中:若是则进行下一步;否则将IO请求放回IO调度队列;
作为一种可实施方式,驱动程序可以提供API用以检查其映射表(Mapping Cache)是否在缓存中
作为另一种可实施方式,判断IO请求的待操作固态硬盘的物理地址是否在地址映射表中,若否,则将该IO请求的待操作固态硬盘的物理地址存入临时地址映射表,每个周期后,将临时地址映射表并入地址映射表。
S104、判断IO请求的待操作固态硬盘是否正在进行垃圾回收操作:若是则将IO请求放回IO调度队列;否则将IO请求进行IO操作。
本发明提供一种IO调度装置,包括:
应用模块,用于组织IO请求,并将IO请求发送给IO调度模块;
地址映射表创建模块,用于在缓存中建立固态硬盘的地址映射表;
IO调度模块,用于接收IO请求,将IO请求加入到IO调度队列中,调度队列包括多个不同优先级的子队列;
IO操作模块,用于根据IO调度队列的优先级,选择IO请求并下发到固态硬盘进行处理;
第一判断模块,用于判断IO请求的待操作固态硬盘的物理地址的是否在地址映射表中;
第二判断模块,判断IO请求的待操作固态硬盘是否正在进行垃圾回收操作。
请参考图2,图2为本发明实施例所提供的IO调度装置的模块示意图;本实施例提供一种IO调度装置,包括:
应用模块201,用于组织IO请求,并将IO请求发送给IO调度模块;
地址映射表创建模块206,用于在缓存中建立固态硬盘的地址映射表;
IO调度模块202,用于接收IO请求,将IO请求加入到IO调度队列中,调度队列包括多个不同优先级的子队列;
IO操作模块203,用于根据IO调度队列的优先级,选择IO请求并下发到固态硬盘进行处理;
第一判断模块204,用于判断IO请求的待操作固态硬盘的物理地址的是否在地址映射表中;
第二判断模块205,判断IO请求的待操作固态硬盘是否正在进行垃圾回收操作。
优选地,还包括:
时间检测模块207,用于记录IO请求进入IO调度队列的时间。
优选地,还包括:
轮询模块208,用于根据子队列的优先级对IO调度队列进行轮询。
进一步地,还包括:
临时地址映射表创建模块209,用于创建临时地址映射表,所述临时地址映射表用于暂存未被操作的IO请求的待操作固态硬盘的物理地址,每个轮询周期后,将临时地址映射表并入地址映射表。
以上所述仅为本发明示意性的具体实施方式,并非用以限定本发明的范围,任何本领域的技术人员在不脱离本发明构思和原则的前提下所做出的等同变化与修改,均应属于本发明保护的范围。