经典QoS调度算法——mClock算法的正确打开方式

mClock paper, OSDI 2010

最近有人找我请教mClock算法,我给他解释完之后,他觉得我讲的不对并搬出某技术网站的博客,如下图:


某网站博客对mClock算法的解释

我暗自一笑,说道“这篇文章完全理解错了,下面请听正解!“。

mClock的调度目标

为什么我一看看那篇博客就立刻说他理解错了呢?其实不看mClock的算法原理,光看mClock的调度目标我就能断定那篇博客理解错了。下面我们一起来看看mClock的调度目标,这里用一个简单的例子来解释。假设有三个用户分别是RD、OLTP、DM,他们的参数配置如下:

Client Reservation Weight Limit
RD 250 100 Unlimited
OLTP 250 200 Unlimited
DM 0 300 1000

下图是经过mClock算法带宽分配之后的理论结果:

mClock算法的调度目标,来自mclock论文原文

如果你将上面博客的思想代入上图验证的话,你会发现当总带宽为700之后,就完全解释不通了。那么怎么理解上图呢?总结两句话:用户分配的带宽要么等于所设置的Reservation值,要么等于按照Weight分配的结果,要么等于Limit值。当按照Weight分配的结果大于用户所设置的Reservation时,则用户最终分配的带宽为按照Weight分配的结果;当按照Weight分配的结果小于用户所设置的Reservation时,则带宽分配的结果等于Reservation;当按照Weight分配的结果大于用户所设置的Limit时,则带宽分配的结果等于Limit。

你可以将上面的总结代入上图进行验证,你会发现完全符合图中的结果。那么怎么理解作者的这个思想呢?其实很简单,mClock算法的思想来源于SFQ算法,这是一个按照权重分配带宽的算法,而mClock算法是这个算法的增强版:它给SFQ算法(按照权重分配)增加了两个限制,也就是不能低于设置的预留值(reservation),也不能高于设置的上限值(limit)。这样就很好理解为什么mClock算法使用这样的调度目标了。另外,我们需要知道mClock相比SFQ算法,有三个参数ReservationWeightLimit,这三个参数的含义应该也不用解释了。

mClock的原理

既然理解了mClock的调度目标,下面我们就进入正题。前面我们说过mClock算法来源于SFQ算法,下面我们先来看下如何实现按照权重调度,假设有三个用户A、B、C,他们的权重分别为1/2,1/3,1/6

按照权重调度

每个用户的请求以1/w为间隔依次打标签(假设用户连续发送请求),那么A用户每个请求的标签分别为2,4,6,8,10,...,B用户的为3,6,9,12,...,C用户的请求标签为6,12,18,24,...。调度请求时按照标签大小调度,调度结果如上图所示。可以发现采用这种方法可以很容易实现按照权重分配带宽。

但是mClock的作者发现,这种方法无法为用户提供带宽保证,当用户特别多或者系统总能力不高时,用户很可能会拿到很少的带宽,那么我们就希望设置一个带宽下限来保证用户的带宽不低于这个值;相反,我也不希望用户无限制的占用带宽,那么我希望设置一个带宽上限来限制用户的带宽不超过这个值。基于这个思想,mClock算法又引入两个标签Reservation标签和Limit标签,同样是按照1/Reservation或者1/Limit的间隔依次打标签。我觉得这也是mClock算法名字的由来:multi-clock,多个时钟标签。

请求标签

下面我们来讲mClock算法如何给请求打标签。当请求到来时,需要给每个请求打标签,标签包括三种:Reservation标签、Proportional标签(也叫Weight标签)、Limit标签。下面是标签计算的公式,其中R_i^{r}表示第i个用户的第r个请求的Reservation标签,L_i^rP_i^r以此类推,rwl分别表示用户设置的Reservation、Weight、Limit参数。

对于Reservation标签,某个请求的Reservation标签值为上一请求的Reservation标签加上1/r和当前时间t的最大值,之所以这样处理基于两个理论:一是我希望请求按照1/r的间隔被处理,二是当用户空闲的话则不会给你补偿(当某个客户端的请求按照大于1/r的间隔来,也就是说某个客户端出现了空闲的情况的话,这样标签就被赋值为当前时间)。第二点符合Reservation的一般共识,也就是如果给某用户设置的预留带宽没有被使用,则分配给其他用户,不会给该用户保留。

类似地,Weight标签、Limit标签也是同样的道理,但是有些许差异。对于Weight标签,由于它是相对值(没有单位),我们期望Weight标签始终按照1/w的间隔,但是当某个客户端由空闲变为活跃时,他的Weight标签就不再和时间呈线性关系了;尤其是当新的客户端到达时,二者的标签不再是同一个基准点,因此需要将空闲的客户端的Weight标签和新来的客户端的基准点对齐。那怎么对齐呢?有两种方法:一是采用一个全局虚拟时间来辅助校正;二是通过最小Weight标签值与当前时间的差来校正。mClock采用了后者,具体方法是当某个空闲的客户端有新请求到达时,计算最小Weight标签与当前时间t的差,然后更新其所有请求的Weight标签,伪代码如下:

Limit标签的计算方法也一样,但Limit标签的作用是用来限制Weight阶段请求被调度的个数的,当Limit标签仍然小于当前时间,表示完成的请求个数仍然没有达到limit所设置的请求个数;相反,当Limit标签大于当前时间时,表示已经达到Limit所设置的请求个数,此时不再入队。

请求调度

了解了mClock如何打标签,可能你还无法理解mClock的设计原理,经过下面这一节你一定会理解mClock算法。

请求调度总共有两个阶段:Constraint-based阶段(可以理解为Reservation阶段)和Weight-based阶段(可以理解为Weight阶段)。你要知道,一个请求要么从Reservation阶段被调度,要么从Weight阶段被调度。你可以这样想,有两个队列,一个队列按照Reservation标签的大小对请求进行排序(我们称之为Reservation队列),另外一个队列按照Weight标签的大小进行排序(我们称之为Weight队列)。首先,mClock算法每次从Reservation阶段开始,也就是会先检查Reservation队列是否有请求,如果有则先从Reservation队列的请求先被处理,直到每个用户的Reservation标签值大于当前时间。看到这里你可能会问,为什么满足这个条件用户的Reservation阶段就结束了呢?这是因为用户的Reservation标签表示用户应当被调度的时间,当这个时间大于当前时间时,表示该请求还未到达调度时间。

当Reservation阶段结束后,此时进入Weight阶段。Weight阶段同样是按照标签的大小依次调度,直到每个用户的Limit标签值大于当前时间,这里的判断条件和Reservation阶段的类似。另外,每次在Weight阶段调度一个请求之后,需要对所有Reservation标签进行调整:

Reservation标签调整

这个很好理解,因为当用户的请求从Weight阶段被调度了之后,那么Reservation标签中间就会出现空档,为了保证用户的Reservation,必须对Reservation标签向前平移,也就是每调度一个Weight标签,则Reservation标签向前移动一个1/r,也就是减去1/r

现在请求的调度过程已经讲完了。这个时候你可能还是一头雾水,别急,听我来给你解释:当用户按照权重分配的带宽小于Reservation时,按照上面的原理,那么该用户的请求会在Reservation阶段全部被调度完成,Weight阶段不会有该用户的请求,最终的结果就是用户每秒被调度了Reservation个请求;相反,当用户按照权重分配的带宽大于Reservation时,用户有一部分请求会在Reservation阶段被调度,剩余的请求在Weight阶段被调度,将二者加起来的结果是剩余带宽按照权重分配的结果。

现在你理解mClock算法了吗?如果有什么疑问,欢迎在评论区与我交流。

其他

关于该算法的具体细节,请参考mClock的原始论文。下一篇文章,我会介绍该算法的分布式版本——dmClock的实现原理。

这篇论文mClock: Handling Throughput Variability for Hypervisor IO Scheduling发表于OSDI 2010,作者分别来自VMware公司、惠普实验室以及莱斯大学(被誉为美国南方哈佛之一,同实验室的一个大佬申请到了该学校)。OSDI这个会议在我们实验室的地位是SS级别的,其他级别分别是S、AA、A、B+、B,足见其地位之高。

参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容