虚拟化I/O qos——mClock算法介绍

这里介绍VMware在2010年在OSDI发表的一篇论文mClock: handling throughput variability for hypervisor IO scheduling论文中实现的算法。

该算法在最近才在分布式存储ceph项目得到开发和应用。

在云计算平台中,保证I/O的服务质量(QOS),对于虚拟机的稳定性至关重要。所谓QOS,其实是指对虚拟机使用I/O资源的界定参数,比如比例(proportion 或者 share)、最小值(reservation)、最大值(limit)等等。这篇论文中提到的mClock算法实际上就是要保证虚拟机的I/O尽可能的保持weight、reservation、limit等限制条件。

1 考虑一个简单的例子

有三台虚拟机v1、v2 、v3 , v1和v2要求reservation值为250 IOPS,它们的权重分别是1:2:3,现在有1200IOPS,如何分配IOPS?
v1 : 250 IOPS
v2 : 380 IOPS
v3 : 570 IOPS

基本思想:首先保证最小值IOPS,然后对于没有超过最大值IOPS的虚拟机,按照权重分配IOPS。

2 mClock算法

2.1 整体把握在线IO请求分配如何实现基本思想

  • 保证最小值,不超过最大值
    记录虚拟机的IO请求获得分配的数量N,记录虚拟机开始IO请求的时间戳,对比当前时间,总时间长为t,很容易计算虚拟机平均的IOPS,可以用于对比分配给的虚拟机IOPS的最小值r,和最大值l。
    虚拟化I/O qos——mClock算法介绍_第1张图片

  • 维持比例
    假设虚拟机v1、v2的IO请求获得分配数量分别为N1和N2,它们运行的时间都为t,比例分别为p1 和p2。那么如果它们的IOPS满足权重的要求:
    这里写图片描述
    如果N1/p1 > N2/p2,为了维持上述等于关系,v2的I/O请求将会比v1先获得分配。

2.2 基于标签和时间戳的算法

上面一个部分,我们对在线IO请求分配算法如何实现基本思想有了一个整体的把握,实际上这种公平调度算法在大量论文中得以运用,它的名字叫做基于标签的算法(tag-based algorithm)。

2.2.1 标签标记和IO分配调度

在基于标签的算法中,在虚拟机发出IO请求后,针对QOS中的三个参数proportion、reservation、limit,给到达的IO请求打上三个标签(分别用P、R、L),对于第一个IO请求,这三个标签均是第一个IO请求到达的时间,之后每个IO请求,它们的标签分别是:(其中i标签指的是第i台虚拟机,ri表示第i台虚拟机的IO最小值、li表示第i台虚拟机的最大值,wi表示第i台虚拟机的权重或者比例)
虚拟化I/O qos——mClock算法介绍_第2张图片
其中share tag代表比例的标签。

这些标签中,如果对应的标签的值是大于当前时间的,对于R标签来说,表示这个虚拟机IO请求到达时,虚拟机最小值已经满足,对于L标签来说,表示这个虚拟机IO请求到达时,虚拟机已经达到IO请求的上限,不能进行分配。如果对应的标签的值是小于等于当前时间,那么对于R标签来说,表示这个虚拟机IO请求到达时,虚拟机的IO最小值要求没有满足,对于L标签来说,表示虚拟机IO请求到达时,虚拟机的IO请求没有达到上限,还可以继续为其IO请求分配IO资源。

对于P标签来说,IO请求的P标签越大,表明其权重越小。P标签不会用来与时间做比较

根据这些标签和当前时间比较,我们可以将IO请求分为三类:

  1. IO请求到达时,虚拟机的IO请求还没有满足最小值,这一部分IO请求优先分配
  2. IO请求到达时,虚拟机的IO请求达到上限,这一部分在分配时暂不考虑
  3. IO请求到达时,虚拟机的IO请求达到最小值,但没有达到上限,这一部分IO请求将会通过P标签代表的权重来分配IO资源。

对于上述第三种情况,在给对应的IO请求分配资源后,要求对应的虚拟机vk的所有IO请求的R标签减去1/rk。举一个比较形象的例子来说明这样做的原因:如果不对R标签减去1/r,一台虚拟机在之前获得了大量的IO请求,现在有新的虚拟机需要请求IO,那么原有的虚拟机IO请求在很长一段时间内都会处于第3类,容易出现饥饿问题。

因此,最终的分配策略是这样的
当虚拟机监控器的处理IO请求的模块接收到这样的IO请求之后,会根据所有IO请求的这些标签,首先查看这些IO请求R标签是否存在小于当前时间,如果存在,表示,存在虚拟机不满足最小值的要求,应该首先满足这些虚拟机,然后从这些小于当前时间的R标签所代表的IO请求中,选择R标签最小的来为其分配IO资源。如果所有IO请求R标签都是大于当前时间,表示虚拟机的所有IO最小值都已经满足。此时,从所有IO请求中选择L标签小于当前时间的集合,从中选择P标签最小的IO请求来应答。

2.2.2 细节问题——标签的调整

P标签标记时,会遇到一个问题是,如果新的虚拟机开启,它的第一个到达的IO请求的P标签是当前时间。但是其他虚拟机的IO请求的P标签实际上与当前时间已经没有多少关系,因为我们只关注IO请求之间的P标签的大小,而不关注P标签与时间之间关系。这样造成的问题是,其他虚拟机的IO请求P标签可能远远大于这个刚刚开启的虚拟机的IO请求的P标签。造成的问题是,这个IO分配策略总是给新开启的虚拟机分配IO请求,造成其他虚拟机饥饿。

因此在虚拟机刚开启时,会对P标签进行调整。调整算法如下:

  • 首先从所有IO请求中取得P标签最小的P标签值minPtag
  • 所有IO请求的P标签都减去minPtag-t的值,这样原来的IO请求的P标签最小值就是t,也就完成了我们的调整目标。

虚拟化I/O qos——mClock算法介绍_第3张图片

3 dmClock算法

上述mClock算法主要用于一台服务器上,而由mClock算法改进的dmClock算法用于分布式存储。虚拟机Vi将IO请求发送到存储集群中的某一个节点。

事实上,dmClock只是对标签标记的方法做出简单的修改:
虚拟化I/O qos——mClock算法介绍_第4张图片

其中公式中的 ρi 表示对于这台虚拟机,在这台存储节点服务的上一次IO请求,与目前这一次IO请求之间,有多少IO请求是被当作第一类IO请求被发送到其他的存储节点上分配IO资源的。 σi 是指对于这台虚拟机,在这台存储设备节点服务的上一次IO请求,与目前这一次IO请求之间,有多少IO请求是被当作第三类IO请求被发送到其他存储节点上被分配IO资源。

你可能感兴趣的:(虚拟化技术)