IO请求的调度方法及装置转让专利

申请号 : CN202110375903.8

文献号 : CN112799606B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 孙坚运赵裕众

申请人 : 蚂蚁金服(杭州)网络技术有限公司

摘要 :

本说明书实施例中提供了一种IO请求的调度方法及装置。该方法包括:获取待调度的目标IO请求,并确定目标IO请求是否属于被限流的IO请求;目标IO请求属于未被限流的第一类IO请求时,将当前时刻确定为目标IO请求的调度时刻;目标IO请求属于被限流的第二类IO请求时,根据当前限流资源比例确定目标IO请求的调度时刻,当前限流资源比例是当前时刻所属的当前时间周期中用于处理第二类IO请求的资源比例,当前限流资源比例根据前一时间周期的前一限流资源比例和前一时间周期内调度的第一类IO请求的负载信息计算得到,调度时刻不小于当前时刻;将目标IO请求加入IO请求集合,IO请求集合中的若干IO请求按照调度时刻从小到大的顺序依次被发送到磁盘进行处理。

权利要求 :

1.一种IO请求的调度方法,包括:获取待调度的目标IO请求,并确定所述目标IO请求是否属于被限流的IO请求;

当所述目标IO请求属于未被限流的第一类IO请求时,将当前时刻确定为所述目标IO请求的调度时刻;

当所述目标IO请求属于被限流的第二类IO请求时,根据当前限流资源比例确定所述目标IO请求的调度时刻,所述当前限流资源比例是当前时刻所属的当前时间周期中用于处理第二类IO请求的资源比例,所述当前限流资源比例根据前一时间周期的前一限流资源比例和前一负载信息计算得到,所述前一负载信息是前一时间周期内调度的第一类IO请求的负载信息,所述调度时刻不小于当前时刻;

将所述目标IO请求加入IO请求集合,所述IO请求集合中的若干IO请求按照调度时刻从小到大的顺序依次被发送到磁盘进行处理。

2.根据权利要求1所述的方法,其中,第一类IO请求包括前台IO请求,第二类IO请求包括后台IO请求。

3.根据权利要求1所述的方法,其中,将所述目标IO请求加入IO请求集合具体包括:将所述目标IO请求加入通过最小堆来管理的IO请求集合。

4.根据权利要求1所述的方法,其中,根据当前限流资源比例确定所述目标IO请求的调度时刻,包括:

根据当前限流资源比例以及获取的上一个第二类IO请求的调度时刻,计算所述目标IO请求的期望调度时刻,所述期望调度时刻与当前限流资源比例负相关;

将当前时刻和所述期望调度时刻的较大值确定为所述目标IO请求的调度时刻。

5.根据权利要求4所述的方法,其中,根据当前限流资源比例确定所述目标IO请求的调度时刻,还包括:根据磁盘的性能确定所述目标IO请求的请求带宽所对应的期望读写频次;

根据当前限流资源比例以及获取的上一个第二类IO请求的调度时刻,计算所述目标IO请求的期望调度时刻,具体包括:根据所述期望读写频次、当前限流资源比例,以及获取的上一个第二类IO请求的调度时刻,计算所述目标IO请求的期望调度时刻;其中,所述期望调度时刻与所述期望读写频次负相关。

6.根据权利要求1至5中任一项所述的方法,其中,当所述目标IO请求属于未被限流的第一类IO请求时,所述方法还包括:确定获取所述目标IO请求的第一时刻;

在第二时刻,从所述IO请求集合中选择所述目标IO请求,并将所述目标IO请求发送到磁盘;其中,在所述第二时刻,所述目标IO请求的调度时刻是所述IO请求集合包含的所有IO请求中的最小值;

接收磁盘返回的请求结果;

向所述目标IO请求对应的应用程序发送所述请求结果,并确定发送所述请求结果的第三时刻;

根据所述第三时刻和所述第一时刻确定所述目标IO请求的响应时间。

7.根据权利要求6所述的方法,其中,还包括:在达到当前时间周期的结束时刻时,根据当前时间周期内调度的第一类IO请求的当前负载信息,确定下一时间周期的下一限流资源比例;其中,当前负载信息具体包括,当前时间周期内调度的第一类IO请求的平均响应时间,以及当前时间周期内调度的第一类IO请求的平均请求带宽。

8.根据权利要求7所述的方法,其中,根据当前时间周期内调度的第一类IO请求的当前负载信息,确定下一时间周期的下一限流资源比例,包括:根据磁盘的性能确定所述平均请求带宽对应的期望响应时间;

当所述平均响应时间不小于所述期望响应时间时,按照预设步长减小所述当前限流资源比例,获得下一时间周期的下一限流资源比例;或者,当所述平均响应时间小于所述期望响应时间时,按照预设步长增大所述当前限流资源比例,获得下一时间周期的下一限流资源比例。

9.根据权利要求7所述的方法,其中,下一时间周期的下一限流资源比例不大于第一预设阈值且不小于第二预设阈值。

10.一种IO请求的调度方法,包括:获取IO请求集合,所述IO请求集合通过权利要求1至9中任一项所述的方法得到,所述IO请求集合中包括若干IO请求,每个IO请求具有对应的调度时刻;

从所述IO请求集合中选择调度时刻最小的IO请求作为当前IO请求;

将所述当前IO请求发送到磁盘,使磁盘处理所述当前IO请求并返回请求结果。

11.根据权利要求10所述的方法,其中,将所述当前IO请求发送到磁盘,具体包括:在所述当前IO请求对应的调度时刻小于当前时刻时,将所述当前IO请求发送到磁盘。

12.一种IO请求的调度装置,包括:请求获取单元,配置为获取待调度的目标IO请求;

分类确定单元,配置为确定所述目标IO请求是否属于被限流的IO请求;

调度时刻确定单元,配置为当所述目标IO请求属于未被限流的第一类IO请求时,将当前时刻确定为所述目标IO请求的调度时刻;当所述目标IO请求属于被限流的第二类IO请求时,根据当前限流资源比例确定所述目标IO请求的调度时刻,所述当前限流资源比例是当前时刻所属的当前时间周期中用于处理第二类IO请求的资源比例,所述当前限流资源比例根据前一时间周期的前一限流资源比例和前一负载信息计算得到,所述前一负载信息是前一时间周期内调度的第一类IO请求的负载信息,所述调度时刻不小于当前时刻;

请求调度单元,配置为将所述目标IO请求加入IO请求集合,所述IO请求集合中的若干IO请求按照调度时刻从小到大的顺序依次被发送到磁盘进行处理。

13.一种IO请求的调度装置,包括:获取单元,配置为获取IO请求集合,所述IO请求集合通过权利要求12所述的装置得到,所述IO请求集合中包括若干IO请求,每个IO请求具有对应的调度时刻;

选择单元,配置为从所述IO请求集合中选择调度时刻最小的IO请求作为当前IO请求;

发送单元,配置为将所述当前IO请求发送到磁盘,使磁盘处理所述当前IO请求并返回请求结果。

14.一种计算设备,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器执行所述计算机程序时,实现权利要求1‑9或者权利要求10‑11中任一项所述的方法。

15.一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算设备中执行时,计算设备执行权利要求1‑9或者权利要求10‑11中任一项所述的方法。

说明书 :

IO请求的调度方法及装置

技术领域

[0001] 本说明书一个或多个实施例涉及计算机领域,尤其涉及IO请求的调度方法及装置。

背景技术

[0002] 对于部分数据存储系统,例如基于日志结构合并树(Log‑Structured Merge Tree,LSM)结构的数据库,来自应用程序的数据查询请求(也可称为前台任务)发起的IO请
求需要占用磁盘的IO资源外,还可能存在不定时的后台任务(例如转储任务或者合并任务)
所发起的IO请求需要占用磁盘的IO资源。后台任务发起的IO请求占用过多的IO资源时,将
会增加前台任务发起的IO请求的响应时间,造成系统卡顿而影响用户体验。
[0003] 通常的,为了确保系统的高效运行以提高用户体验,部分IO请求可能需要能够尽快被处理。然而,在确保用户具有较好的用户体验的情况下,无论是前台任务发起的IO请求
还是后台任务发起的IO请求均应当尽快被处理。
[0004] 因此希望有一种新的技术方案,以期能够更好的完成对IO请求进行调度。

发明内容

[0005] 本说明书一个或多个实施例中提供了一种IO请求的调度方法及装置,能够更好的完成对IO请求进行调度。
[0006] 第一方面,提供了一种IO请求的调度方法。该方法包括:获取待调度的目标IO请求,并确定所述IO目标请求是否属于被限流的IO请求。当所述目标IO请求属于未被限流的
第一类IO请求时,将当前时刻确定为所述目标IO请求的调度时刻;当所述目标IO请求属于
被限流的第二类IO请求时,根据当前限流资源比例确定所述目标IO请求的调度时刻,所述
当前限流资源比例是当前时刻所属的当前时间周期中用于处理第二类IO请求的资源比例,
所述当前限流资源比例根据前一时间周期的前一限流资源比例和前一负载信息计算得到,
所述前一负载信息是前一时间周期内调度的第一类IO请求的负载信息,所述调度时刻不小
于当前时刻。然后将所述目标IO请求加入IO请求集合,所述IO请求集合中的若干IO请求按
照调度时刻从小到大的顺序依次被发送到磁盘进行处理。
[0007] 在一种可能的实施方式中,第一类IO请求包括前台IO请求,第二类IO请求包括后台IO请求。
[0008] 在一种可能的实施方式中,将所述目标IO请求加入IO请求集合具体包括:将所述目标IO请求加入通过最小堆来管理的IO请求集合。
[0009] 在一种可能的实施方式中,根据当前限流资源比例确定所述目标IO请求的调度时刻,包括:根据当前限流资源比例以及获取的上一个第二类IO请求的调度时刻,计算所述目
标IO请求的期望调度时刻,所述期望调度时刻与当前限流资源比例负相关;将当前时刻和
所述期望调度时刻的较大值确定为所述目标IO请求的调度时刻。
[0010] 在一种可能的实施方式中,根据当前限流资源比例确定所述目标IO请求的调度时刻,还包括:根据磁盘的性能确定所述目标IO请求的请求带宽所对应的期望读写频次。相应
的,根据当前限流资源比例以及获取的上一个第二类IO请求的调度时刻,计算所述目标IO
请求的期望调度时刻,具体包括:根据所述期望读写频次、当前限流资源比例,以及获取的
上一个第二类IO请求的调度时刻,计算所述目标IO请求的期望调度时刻;其中,所述期望调
度时刻与所述期望读写频次负相关。
[0011] 在一种可能的实施方式中,所述目标IO请求属于未被限流的第一类IO请求时,所述方法还包括:确定获取所述目标IO请求的第一时刻;在第二时刻,从所述IO请求集合中选
择所述目标IO请求,并将所述目标IO请求发送到磁盘,其中在所述第二时刻,所述目标IO请
求的调度时刻是所述IO请求集合包含的所有IO请求中的最小值;接收磁盘返回的请求结
果;向所述目标IO请求对应的应用程序发送所述请求结果,并确定发送所述请求结果的第
三时刻;根据所述第三时刻和所述第一时刻确定所述目标IO请求的响应时间。
[0012] 在一种可能的实施方式中,还包括:在达到当前时间周期的结束时刻时,根据当前时间周期内调度的第一类IO请求的当前负载信息,确定下一时间周期的下一限流资源比
例;其中,当前负载信息具体包括,当前时间周期内调度的第一类IO请求的平均响应时间,
以及当前时间周期内调度的第一类IO请求的平均请求带宽。
[0013] 在一种可能的实施方式中,根据当前时间周期内调度的第一类IO请求的当前负载信息,确定下一时间周期的下一限流资源比例,包括:根据磁盘的性能确定所述平均请求带
宽对应的期望响应时间;当所述平均响应时间不小于所述期望响应时间时,按照预设步长
减小所述当前限流资源比例,获得下一时间周期的下一限流资源比例;或者,当所述平均响
应时间小于所述期望响应时间时,按照预设步长增大所述当前限流资源比例,获得下一时
间周期的下一限流资源比例。
[0014] 在一种可能的实施方式中,下一时间周期的下一限流资源比例不大于第一预设阈值且不小于第二预设阈值。
[0015] 第二方面,提供了一种IO请求的调度方法,包括:获取IO请求集合,所述IO请求集合通过第一方面中任一项所述的方法得到,所述IO请求集合中包括若干IO请求,每个IO请
求具有对应的调度时刻;从所述IO请求集合中选择调度时刻最小的IO请求作为当前IO请
求;将所述当前IO请求发送到磁盘,使磁盘处理所述当前IO请求并返回请求结果。
[0016] 在一种可能的实施方式中,将所述当前IO请求发送到磁盘,具体包括:在所述当前IO请求对应的调度时刻小于当前时刻时,将所述当前IO请求发送到磁盘。
[0017] 第三方面,提供了一种IO请求的调度装置,包括:请求获取单元,配置为获取待调度的目标IO请求;分类确定单元,配置为确定所述目标IO请求是否属于被限流的IO请求;调
度时刻确定单元,配置为当所述目标IO请求属于未被限流的第一类IO请求时,将当前时刻
确定为所述目标IO请求的调度时刻;当所述目标IO请求属于被限流的第二类IO请求时,根
据当前限流资源比例确定所述目标IO请求的调度时刻,所述当前限流资源比例是当前时刻
所属的当前时间周期中用于处理第二类IO请求的资源比例,所述当前限流资源比例根据前
一时间周期的前一限流资源比例和前一负载信息计算得到,所述前一负载信息是前一时间
周期内调度的第一类IO请求的负载信息,所述调度时刻不小于当前时刻;请求调度单元,配
置为将所述目标IO请求加入IO请求集合,所述IO请求集合中的若干IO请求按照调度时刻从
小到大的顺序依次被发送到磁盘进行处理。
[0018] 在一种可能的实施方式中,第一类IO请求包括前台IO请求,第二类IO请求包括后台IO请求。
[0019] 在一种可能的实施方式中,所述请求调度单元,具体配置为将所述目标IO请求加入通过最小堆来管理的IO请求集合。
[0020] 在一种可能的实施方式中,所述调度时刻确定单元,包括:计算子单元,配置为根据当前限流资源比例以及获取的上一个第二类IO请求的调度时刻,计算所述目标IO请求的
期望调度时刻,所述期望调度时刻与当前限流资源比例负相关;第一确定子单元,配置为将
当前时刻和所述期望调度时刻的较大值确定为所述目标IO请求的调度时刻。
[0021] 在一种可能的实施方式中,所述调度时刻确定单元还包括第二确定子单元,配置为根据磁盘的性能确定所述目标IO请求的请求带宽所对应的期望读写频次;所述计算子单
元,具体配置为根据所述期望读写频次、当前限流资源比例,以及获取的上一个第二类IO请
求的调度时刻,计算所述目标IO请求的期望调度时刻;其中,所述期望调度时刻与所述期望
读写频次负相关。
[0022] 在一种可能的实施方式中,所述装置还包括请求处理单元,配置为所述目标IO请求属于未被限流的第一类IO请求时,确定获取所述目标IO请求的第一时刻;在第二时刻,从
所述IO请求集合中选择所述目标IO请求,并将所述目标IO请求发送到磁盘,其中在所述第
二时刻,所述目标IO请求的调度时刻是所述IO请求集合包含的所有IO请求中的最小值;接
收磁盘返回的请求结果;向所述目标IO请求对应的应用程序发送所述请求结果,并确定发
送所述请求结果的第三时刻;根据所述第三时刻和所述第一时刻确定所述目标IO请求的响
应时间。
[0023] 在一种可能的实施方式中,还包括计算单元,配置为在达到当前时间周期的结束时刻时,根据当前时间周期内调度的第一类IO请求的当前负载信息,确定下一时间周期的
下一限流资源比例;其中,当前负载信息具体包括,当前时间周期内调度的第一类IO请求的
平均响应时间,以及当前时间周期内调度的第一类IO请求的平均请求带宽。
[0024] 在一种可能的实施方式中,所述计算单元具体配置为根据磁盘的性能确定所述平均请求带宽对应的期望响应时间;当所述平均响应时间不小于所述期望响应时间时,按照
预设步长减小所述当前限流资源比例,获得下一时间周期的下一限流资源比例;或者,当所
述平均响应时间小于所述期望响应时间时,按照预设步长增大所述当前限流资源比例,获
得下一时间周期的下一限流资源比例。
[0025] 在一种可能的实施方式中,下一时间周期的下一限流资源比例不大于第一预设阈值且不小于第二预设阈值。
[0026] 第四方面,提供了一种IO请求的调度装置,包括:获取单元,配置为获取IO请求集合,所述IO请求集合通过第三方面中任一项所述的装置得到,所述IO请求集合中包括若干
IO请求,每个IO请求具有对应的调度时刻;选择单元,配置为从所述IO请求集合中选择调度
时刻最小的IO请求作为当前IO请求;发送单元,配置为将所述当前IO请求发送到磁盘,使磁
盘处理所述当前IO请求并返回请求结果。
[0027] 在一种可能的实施方式中,所述发送单元配置为在所述当前IO请求对应的调度时刻小于当前时刻时,将所述当前IO请求发送到磁盘。
[0028] 第五方面,提供了一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算设备中执行时,计算设备实现第一方面或第二方面中任一项所述的方法。
[0029] 第六方面,提供了一种计算设备,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器执行所述计算机程序时,实现第一方面或第二方面中任一项所述的方
法。
[0030] 通过本说明书一个或多个实施例中提供的方法及装置,通过将IO请求划分为未被限流的第一类IO和被限流IO的第二类IO请求,根据前一时间周期内调度的第一类IO请求的
负载信息,动态调整当前时间周期内第二类IO请求的限流情况,实现根据磁盘的负载自适
应的分配IO资源。如此,既可在磁盘高负载时降低第二类IO请求对IO资源的占用,确保未被
限流的第一类IO请求能够尽快被执行,即确保系统的高效运行以提高用户体验,还可在磁
盘低负载时增加第二类IO对IO资源的占用,加速第二类IO请求的执行,从而实现更好的完
成对IO请求进行调度。

附图说明

[0031] 为了更清楚地说明本说明书实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于
本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它
的附图。
[0032] 图1为本说明书实施例中提供的一种IO请求的调度方法的流程图;
[0033] 图2为本说明书实施例中确定第二类IO请求的调度时刻的过程示意图;
[0034] 图3为本说明书实施例中通过最小堆管理IO请求集合的示意图;
[0035] 图4为本说明书实施例中提供的另一种IO请求的调度方法的流程图;
[0036] 图5为本说明书实施例中获取下一时间周期的资源比例的过程示意图;
[0037] 图6为本说明书实施例中提供的又一种IO请求的调度方法的流程图;
[0038] 图7为本说明书实施例中提供的一种IO请求的调度装置的结构示意图;
[0039] 图8为本说明书实施例中提供的另一种IO请求的调度装置的结构示意图。

具体实施方式

[0040] 下面结合附图,对本说明书所提供的各个非限制性实施例进行详细描述。
[0041] 包含基于LSM结构的数据库在内的部分数据存储系统,在单位时间内调度的IO请求通常包括前台IO请求和后台IO请求等两种类型的IO请求。
[0042] 以基于LSM结构的数据库为例。写入新数据的过程包括:首先,活跃Memtable作为LSM的内存数据结构,将负责应用程序对新数据的写入;活跃Memtable中写入相应大小的新
数据后将会停止写入,并且被冻结为冻结Memtable,此外还会创建新的活跃Memtable来负
责新数据的写入。接着,系统后台可以调度转储任务,通过转储任务将冻结Memtable转换格
式转储(Dump)到磁盘中生成SSTable结构文件,此后该冻结Memtable占用的内存可以被释
放以供后续的活跃Memtable使用,其中SSTable结构文件也被表述为转储SSTable。此外,还
可以在转储SSTable积累到相应数量后,由系统后台调度合并任务将相应数量的转储
SSTable合并成基线SSTable并写入磁盘。其中需要说明的是,转储任务或者合并任务将会
通过向磁盘发起若干IO请求来实现向磁盘写入转储SSTable或者基线SSTable,其中由转储
任务和/或合并任务等后台任务发起的IO请求均属于后台IO请求。
[0043] 以基于LSM结构的数据库为例。应用程序读取数据时需要发起数据查询请求(数据查询请求属于前台任务),首先会基于数据查询请求查询内存中的Memtable。如果内存中的
Memtable并不包含数据查询请求期望查询的目标数据,则需要向磁盘发起若干IO请求来实
现从磁盘中的SSTable读取目标数据,数据查询请求发起的IO请求属于前台IO请求。
[0044] 后台任务发起的IO请求和前台任务发起的IO请求将会对磁盘的IO资源形成竞争。例如在转储任务和合并任务执行期间,往往需要通过大量的后台IO请求实现向磁盘写入大
规模数据;如果此时前台任务较多,由于后台IO请求占用过多的磁盘带宽/IO资源,将会导
致前台任务所对应的前台IO请求的响应时间增加,进而造成整个前台任务的响应时间增加
甚至超时失败。
[0045] 需要说明的是,数据查询请求查询多个数据源,或者说需要通过超过预设数量的IO请求来实现从磁盘中的SSTable读取某个数据查询请求期望读取的目标数据时,该数据
查询请求可以被称为大查询请求。大查询请求会影响其它前台任务所发起的IO请求的响应
时间,造成其它前台任务的响应时间增加甚至超时失败。
[0046] 通常需要对部分IO请求进行直接限流,例如对后台IO请求和/或大查询请求对应的IO请求进行直接限流,使其它IO请求能够尽快被处理,确保系统的高效运行以提高用户
体验。然而,如果对部分IO请求进行直接限流,可能会造成被限流的IO请求始终无法被快速
执行而带来其它问题,例如对后台IO请求进行直接限流则可能导致转储任务和合并任何执
行较慢,甚至造成内存空间不足而无法提供更多的活跃Memtable来写入新数据。
[0047] 考虑到以上问题,本说明书实施例中至少提供了一种IO请求的调度方法和装置。通过将IO请求划分为未被限流的第一类IO和被限流IO的第二类IO请求,根据前一时间周期
内调度的第一类IO请求的负载信息,动态调整当前时间周期内第二类IO请求的限流情况,
实现根据磁盘的负载自适应的分配IO资源。如此,既可在磁盘高负载时降低第二类IO请求
对IO资源的占用,确保未被限流的第一类IO请求能够尽快被执行,即确保系统的高效运行
以提高用户体验,还可在磁盘低负载时增加第二类IO对IO资源的占用,加速第二类IO请求
的执行,从而实现更好的完成对IO请求进行调度。
[0048] 图1为本说明书实施例中提供的一种IO请求的调度方法的流程图。该方法可以由计算设备执行,该方法至少可以包括如下步骤:
[0049] 步骤101,获取待调度的目标IO请求。
[0050] 该目标IO请求可以包括前台IO请求或者后台IO请求。
[0051] 步骤102,确定目标IO请求是否属于被限流的IO请求。
[0052] 可以将IO请求划分为两个分类,即划分为未被限流的第一类IO请求和被限流的第二类IO请求;具体如何划分第一类IO请求和第二类IO请求,可以结合实际业务需求进行灵
活配置。例如,可以将全部的前台IO请求划分到未被限流的第一类IO请求,将全部的后台IO
请求划分到被限流的第二类IO请求;或者,将前台IO请求中除大查询请求对应的IO请求以
外的其它前台IO请求划分到第一类IO请求,将大查询请求对应的IO请求以及全部的后台IO
请求划分到第二类IO请求。
[0053] 当目标IO请求属于未被限流的第一类IO请求时,执行步骤103,将当前时刻确定为IO请求的调度时刻,并接着执行步骤105。
[0054] 当目标IO请求属于被限流的第二类IO请求时,执行步骤104,根据当前限流资源比例确定目标IO请求的调度时刻,并接着执行步骤105。
[0055] 当前限流资源比例是当前时刻所属的当前时间周期中用于处理第二类IO请求的资源比例,该比例越大,则允许更多的IO资源被用于处理第二类IO请求。在一个示例中,当
前限流资源比例根据前一时间周期的前一限流资源比例和前一负载信息计算得到,前一负
载信息是前一时间周期内调度的第一类IO请求的负载信息,并且该目标IO请求的调度时刻
不小于当前时刻。
[0056] 在一个较为具体的示例中,如图2所示,步骤104可以包括:
[0057] 步骤1041,根据磁盘的性能确定目标IO请求的请求带宽对应的期望读写频次。
[0058] 可以通过io_benchmark或者其它磁盘性能测量工具,在初始化计算设备的数据存储系统时对磁盘的性能进行测量,以获得磁盘的性能。
[0059] 举例来说,可以测量磁盘处理样本请求带宽(后续利用io_size表征单个IO请求的请求带宽)的前台IO请求时,样本io_size对应的样本响应时间(后续利用io_rt表征单个IO
请求的响应时间)和样本IOPS(IO request count per second,每秒IO请求计数)。接着对
该组样本io_size、样本io_rt和样本IOPS进行存储,例如存储至配置文件io_
resource.conf中。测量并存储多组样本io_size、样本io_rt和样本IOPS之后,通常来说不
同组中的样本io_size和样本IOPS的乘积相等或者近似于相等,并且样本io_size和样本
IOPS的乘积能够用于表征磁盘提供的IO资源/带宽。因此,可以通过对多个组中的样本io_
size和样本IOPS进行线性拟合,例如进行对数线性拟合,得到样本io_size和样本IOPS之间
的第一线性关系,即得到变量io_size和变量IOPS之间的第一线性关系;以及,通过对多个
组中的样本io_size和样本io_rt进行线性拟合,例如进行简单线性拟合,得到样本io_size
和样本io_rt之间的第二线性关系,即得到变量io_size和变量io_rt之间的第二线性关系。
最后,对第一线性关系和第二线性关系进行存储,以便后续对第一线性关系和第二关系进
行使用,其中第一线性关系和第二线性关系可以用于描述磁盘的性能。
[0060] 相应的,步骤1041中具体可以将目标IO请求的io_size代入第一线性关系中的变量io_size,计算得到第一线性关系中变量IOPS的取值,变量IOPS的取值即为目标IO请求的
io_size对应的期望读写频次。
[0061] 步骤1042,根据期望读写频次、当前限流资源比例,以及获取的上一个第二类IO请求的调度时刻,计算目标IO请求的期望调度时刻。
[0062] 目标IO请求的期望调度时刻可以是在上一个第二类IO请求的调度时刻上加上期望时间差,该期望时间差与期望读写频次负相关,也与当前限流资源比例负相关。换而言
之,期望读写频次越大,当前限流资源比例越大,则预期会在处理上一个第二类IO请求后更
短的时间内,处理本次获取的目标IO请求,因此期望时间差越小。
[0063] 例如,可以通过如下公式1计算目标IO请求的期望调度时刻:
[0064] Expect_deadline=last_deadline + 1/ (a*Expect_IOPS)     (1)
[0065] 其中,Expect_deadline表征目标IO请求的期望调度时刻,last_deadline表征在先获取的上一个第二类IO请求的调度时刻,a表征当前限流资源比例,Expect_IOPS表征期
望读写频次。
[0066] 需要说明的是,步骤1041是可选地。与此相应的,在步骤1042中可以根据当前限流资源比例以及上一个第二类IO请求的调度时刻,计算本次获取的目标IO请求的期望调度时
刻,例如前述公式1中的Expect_IOPS可以作为非必要的参数而被删除。
[0067] 在步骤1043,将当前时刻和期望调度时刻中的较大值确定为目标IO请求的调度时刻。
[0068] 当前时刻是较大值时,说明磁盘负载可能相对较小,当前时刻作为目标IO请求的调度时刻能够使IO请求尽快被处理。
[0069] 期望调度时刻是较大值时,说明获取的上一个第二类IO请求可能还未被发送到磁盘进行处理,磁盘负载可能相对较大,将期望调度时刻作为目标IO请求的调度时刻能够对
第二类IO请求进行限流,单位时间内能够有更多的IO资源被用于处理第一类IO请求,同时
还能确保获取的前一个第二类IO请求相比于目标IO请求能够更早的被处理。
[0070] 回到图1,在步骤105,将目标IO请求加入IO请求集合。
[0071] IO请求集合中的若干IO请求按照调度时刻从小到大的顺序依次被发送到磁盘进行处理。在一个较为具体的示例中,为了方便后续过程中快速的实现从IO请求集合中选择
调度时刻最小的IO请求,IO请求集合中可以按照调度时刻由小到大的顺序,对IO请求集合
中的若干IO请求进行排序以形成IO请求序列;或者,通过堆结构中的最小堆来管理IO请求
集合,最小堆是已经按照调度时刻的大小进行排序的完全二叉树,其中作为根节点的IO请
求的调度时刻是若干IO请求中的最小值。
[0072] 举例来说, IO请求集合中包括IO请求A1、A2、A3、A4以及本次加入IO请求集合中的目标IO请求A5,假设按照调度时刻由小到大的顺序排列时可以形成序列A1、A5、A2、A3、A4,
通过最小堆来管理IO请求集合时,则可能形成如图3中所示根节点为A1的完全二叉树。其中
需要说明的是,该完全二叉树仅仅是示例性,即除了根节点为A1外,其它节点的所在位置可
能不同于如图3中所示的完全二叉树。
[0073] 在一些实施例中,在图1中获取的目标IO请求属于未被限流的第一类IO请求时,还可以进一步根据该目标IO请求从IO请求集合中被读出处理的情况,确定其响应时间,该响
应时间用于确定第一类IO请求的负载信息,从而更新前述的限流资源比例。下面参考图4,
描述属于第一类IO请求的目标IO请求的处理过程。如图4所示,该处理过程在图1基础上,还
可以包括进一步的处理步骤,下面详细描述。
[0074] 在通过前述步骤102确定目标IO请求为第一类IO请求的情况下,还执行步骤401,确定获取目标IO请求的当前时刻,记为第一时刻。
[0075] 此外,如前所述,在步骤105将前述目标IO请求加入到IO请求集合中,并且该IO请求集合按照调度时刻从小到大的顺序依次读出IO请求。也就是说,每次从IO请求集合读取
IO请求进行处理时,IO请求集合将会“弹出”当前调度时刻最小的IO请求。如此,随着调度时
刻更小的IO请求依次被读出,在某些时刻,该目标IO请求成为IO请求集合中调度时刻最小
的IO请求。此时,从IO请求集合中读取IO请求时,将读出上述目标IO请求。将该时刻记为第
二时刻。
[0076] 于是,在步骤402,在第二时刻,从IO请求集合中选择上述目标IO请求,并将其发送到磁盘。其中,在第二时刻,上述目标IO请求的调度时刻是IO请求集合包含的所有IO请求中
的最小值。
[0077] 步骤403,接收磁盘返回的请求结果。
[0078] 步骤404,向目标IO请求对应的应用程序发送请求结果,并确定发送请求结果的第三时刻。
[0079] 步骤405,根据第三时刻和第一时刻确定目标IO请求的响应时间。
[0080] 即将第三时刻和第二时刻的时间差确定为目标IO请求的响应时间。
[0081] 在一些实施例中,为了方便后续对下一时间周期的下一限流资源比例进行更新,在步骤405之后还可以执行步骤406,根据目标IO请求的响应时间和请求带宽,更新已调度
的所有第一类IO请求的累计请求带宽和累计响应时间,以及更新已调度的所有第一类IO请
求的累计数量。
[0082] 举例来说,可以定义用于存储累计请求带宽的参数cumulative_size,定义用于存储累计响应时间的参数cumulative_rt,以及定义用于存储累计数量的参数cumulative_
count,其中前述三个参数的初始值均可以为0。步骤406中具体根据目标IO请求的请求带宽
和响应时间,对cumulative_size以及cumulative_rt的值进行更新,并将cumulative_
count的值加1。
[0083] 在一些实施例中,还可以对当前处理的目标IO请求的响应时间和请求带宽进行独立存储,对当前时间周期内已调度的第一类IO请求的数量进行独立更新,以便根据这些数
据确定当前时间周期内调度的第一类IO请求的当前负载信息,并基于当前负载信息获取下
一时间周期的下一限流资源比例。
[0084] 与之相应的,当达到当前时间周期的结束时刻时,还可以执行步骤407,确定当前时间周期内调度的第一类IO请求的当前负载信息。以及执行步骤408,根据当前负载信息获
取下一时间周期的下一限流资源比例。
[0085] 单个时间周期的时长可以灵活配置,例如配置为100ms或者其它数值。
[0086] 当前负载信息包括当前时间周期内调度的第一类IO请求的平均响应时间,以及当前时间周期内调度的第一类IO请求的平均请求带宽。
[0087] 举例来说,达到前一时间周期的结束时刻时,cumulative_count的取值为last_count、cumulative_size的值为last_size、cumulative_rt的值为last_rt。达到当前时间
周期的结束时刻时,cumulative_count的值为current_count、cumulative_size的值为
current_size、cumulative_rt的值为current_rt。则,
[0088] 可以通过如下公式2计算平均请求带宽:
[0089] avg_size=(current_size‑last_size)/(current_count‑last_count )  (2)
[0090] 其中,avg_size表征平均请求带宽。
[0091] 可以通过如下公式3计算平均响应时间:
[0092] avg_rt=(current_rt‑last_rt)/(current_count‑last_count )   (3)
[0093] 其中,avg_rt表征平均响应时间。
[0094] 在一个较为具体的示例中,请参考图5,步骤408可以包括:
[0095] 步骤4081,根据磁盘的性能确定平均请求带宽对应的期望响应时间。
[0096] 如前所述,磁盘的性能可通过第一线性关系和第二线性关系来描述。这里可以将平均请求带宽代入第二线性关系中的变量io_size,计算出第二线性关系中变量io_rt的取
值,变量io_rt的取值即为平均请求带宽所对应的期望响应时间。
[0097] 步骤4082,确定平均响应时间是否小于期望响应时间。
[0098] 如果是,则执行步骤4083,按照预设步长增大当前限流资源比例,获得下一时间周期的限流资源比例。
[0099] 如果否,则执行步骤4084,按照预设步长减小当前限流资源比例,获得下一时间周期的限流资源比例。
[0100] 如果平均响应时间小于期望响应时间,说明磁盘负载相对较低,增大限流资源比例,减小对第二类IO请求的限流力度,下一时间周期内能够有更多的IO资源被用于处理第
二类IO请求。如果平均响应时间不小于期望响应时间,说明磁盘负载相对较高,减小限流资
源比例,增大对第二类IO请求的限流力度,下一时间周期内能够有更多的IO资源被用于处
理第一类IO请求。
[0101] 在一些实施例中,可以预先设置限流资源比例的取值范围,即预先设置限流资源比例的取值范围不大于第一预设阈值且不小于第二预设阈值。相应的,如果当前时间周期
的当前限流资源比例为第一预设阈值或第二预设阈值,则将当前限流资源比例继续作为下
一时间周期的限流资源比例,不再通过步骤4083或步骤4084重新获得下一时间周期的限流
资源比例。
[0102] 第一预设阈值、第二预设阈值以及预设步长可以灵活配置,例如将第一预设阈值配置为50%,将第二预设阈值配置为10%,将预设步长配置为1%。
[0103] 与前述方法实施例对应的,本说明书实施例中还提供了另一种IO请求的调度方法,该方法由计算设备执行。如图6所示,该方法包括:
[0104] 步骤601,获取IO请求集合。
[0105] 该IO请求集合中包括若干IO请求,每个IO请求均是通过如图1或图4所示实施例中的方式加入到IO请求集合的。
[0106] 步骤602,从所述IO请求集合中选择调度时刻最小的IO请求作为当前IO请求。其中,当前IO请求可能属于未被限流的第一类IO请求,也可能属于被限流的第二类IO请求。
[0107] 步骤603,将当前IO请求发送到磁盘。
[0108] 在一种可能的实施方式中,选择当前IO请求之后,如果存在能够用于将当前IO请求发送到磁盘的IO资源,则立即执行步骤603。
[0109] 在一种可能的实施方式中,选择当前IO请求之后,还可以确定当前IO请求的调度时刻是否小于当前时刻。如果当前IO请求的调度时刻小于当前时刻,并且存在能够用于将
当前IO请求发送到磁盘的IO资源,则执行步骤602。如果当前IO请求的调度时刻不小于当前
时刻,即使存在能够用于将当前IO请求发送到磁盘的IO资源,也将再次通过步骤602从IO请
求集合中重新选择调度时刻最小的IO请求作为新的当前IO请求;对于已经选择的并且未能
被发送到磁盘的IO请求,可以在当前时刻大于该IO请求的调度时刻时,通过步骤603将该IO
请求发送到磁盘。
[0110] 当前IO请求属于第一类IO请求时,从IO请求集合中选择当前IO请求的第二时刻大于当前IO请求的调度时刻,当前时刻必然大于当前IO请求的调度时刻。前述的两种实施方
式均可确保当前IO请求能够尽快被发送到磁盘进行处理。
[0111] 当前IO请求属于第二类IO请求时,从IO请求集合中选择当前IO请求之后的当前时刻可能小于当前IO请求的调度时刻。当前时刻小于当前IO请求的调度时刻,说明磁盘在当
前时刻的负载可能相对较小。如果将当前IO请求直接发送到磁盘进行处理,能够增加第二
类IO请求在单位时间内占用的IO资源,加速第二类IO请求的处理;如果直到当前时刻小于
当前IO请求的调度时刻时,才将当前IO请求发送到磁盘进行处理,能够确保第二类IO请求
不会过多的占用IO资源,第一类IO请求能够尽快被发送到磁盘进行处理。
[0112] 需要说明的是,当前IO请求属于第一类IO请求时,该方法还可以包括前述如图4所示方法实施例中步骤403至步骤406中的部分或全部。
[0113] 与前述方法实施例基于相同的构思,本说明书实施例中还提供了一种IO请求的调度装置。如图7所示,该装置包括:请求获取单元701,配置为获取待调度的目标IO请求;分类
确定单元703,配置为确定所述目标IO请求是否属于被限流的IO请求;调度时刻确定单元
705,配置为当所述目标IO请求属于未被限流的第一类IO请求时,将当前时刻确定为所述目
标IO请求的调度时刻;当所述目标IO请求属于被限流的第二类IO请求时,根据当前限流资
源比例确定所述目标IO请求的调度时刻,所述当前限流资源比例是当前时刻所属的当前时
间周期中用于处理第二类IO请求的资源比例,所述当前限流资源比例根据前一时间周期的
前一限流资源比例和前一负载信息计算得到,所述前一负载信息是前一时间周期内调度的
第一类IO请求的负载信息,所述调度时刻不小于当前时刻;请求调度单元707,配置为将所
述目标IO请求加入IO请求集合,所述IO请求集合中的若干IO请求按照调度时刻从小到大的
顺序依次被发送到磁盘进行处理。
[0114] 在一种可能的实施方式中,第一类IO请求包括前台IO请求,第二类IO请求包括后台IO请求。
[0115] 在一种可能的实施方式中,所述请求调度单元707,具体配置为将所述目标IO请求加入通过最小堆来管理的IO请求集合。
[0116] 在一种可能的实施方式中,所述调度时刻确定单元705,包括:计算子单元,配置为根据当前限流资源比例以及获取的上一个第二类IO请求的调度时刻,计算所述目标IO请求
的期望调度时刻,所述期望调度时刻与当前限流资源比例负相关;第一确定子单元,配置为
将当前时刻和所述期望调度时刻的较大值确定为所述目标IO请求的调度时刻。
[0117] 在一种可能的实施方式中,所述调度时刻确定单元705还包括第二确定子单元,配置为根据磁盘的性能确定所述目标IO请求的请求带宽所对应的期望读写频次;所述计算子
单元,具体配置为根据所述期望读写频次、当前限流资源比例,以及获取的上一个第二类IO
请求的调度时刻,计算所述目标IO请求的期望调度时刻;其中,所述期望调度时刻与所述期
望读写频次负相关。
[0118] 在一种可能的实施方式中,所述装置还包括请求处理单元709,配置为在所述目标IO请求属于未被限流的第一类IO请求时,确定获取所述目标IO请求的第一时刻;在第二时
刻,从所述IO请求集合中选择所述目标IO请求,并将所述目标IO请求发送到磁盘,其中在所
述第二时刻,所述目标IO请求的调度时刻是所述IO请求集合包含的所有IO请求中的最小
值;接收磁盘返回的请求结果;向所述目标IO请求对应的应用程序发送所述请求结果,并确
定发送所述请求结果的第三时刻;根据所述第三时刻和所述第一时刻确定所述目标IO请求
的响应时间。
[0119] 在一种可能的实施方式中,还包括计算单元711,配置为在达到当前时间周期的结束时刻时,根据当前时间周期内调度的第一类IO请求的当前负载信息,确定下一时间周期
的下一限流资源比例;其中,当前负载信息具体包括,当前时间周期内调度的第一类IO请求
的平均响应时间,以及当前时间周期内调度的第一类IO请求的平均请求带宽。
[0120] 在一种可能的实施方式中,所述计算单元711具体配置为根据磁盘的性能确定所述平均请求带宽对应的期望响应时间;当所述平均响应时间不小于所述期望响应时间时,
按照预设步长减小所述当前限流资源比例,获得下一时间周期的下一限流资源比例;或者,
当所述平均响应时间小于所述期望响应时间时,按照预设步长增大所述当前限流资源比
例,获得下一时间周期的下一限流资源比例。
[0121] 在一种可能的实施方式中,下一时间周期的下一限流资源比例不大于第一预设阈值且不小于第二预设阈值。
[0122] 与前述方法实施例基于相同的构思,本说明书实施例中还提供了一种IO请求的调度装置。如图8所示,该装置包括:获取单元801,配置为获取IO请求集合,所述IO请求集合通
过如图1或图4中所示方法得到,所述IO请求集合中包括若干IO请求,每个IO请求具有对应
的调度时刻;选择单元803,配置为从所述IO请求集合中选择调度时刻最小的IO请求作为当
前IO请求;发送单元805,配置为将所述当前IO请求发送到磁盘,使磁盘处理所述当前IO请
求并返回请求结果。
[0123] 在一种可能的实施方式中,所述发送单元805配置为在所述当前IO请求对应的调度时刻小于当前时刻时,将所述当前IO请求发送到磁盘。
[0124] 本领域技术人员应该可以意识到,在上述一个或多个示例中,本说明书所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功
能所对应的计算机程序存储在计算机可读介质中或者作为计算机可读介质上的一个或多
个指令/代码进行传输,以便这些功能所对应的计算机程序被计算机执行时,通过计算机实
现本说明书任意一个实施例中所述的方法。
[0125] 本说明书实施例中还提供了一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算设备中执行时,计算设备执行本说明书任意一个实施例中提供的
IO请求的调度方法。
[0126] 本说明书实施例中还提供了一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现本说明书任意一个实施例中
提供的IO请求的调度方法。
[0127] 本说明书中的各个实施例均采用递进的方式描述,各个实施例中相同、相似的部分互相参见即可,每个实施例中重点说明的都是与其他实施例的不同之处。尤其,对于装置
实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施
例的部分说明即可。
[0128] 上述对本说明书特定实施例进行了描述。其它实施例在本申请要求保护的范围内。在一些情况下,部分动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以
实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才
能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有
利的。
[0129] 以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明
的保护范围,凡在本发明的技术方案的基础之上,所做的任何修改、等同替换、改进等,均应
包括在本发明的保护范围之内。