聊聊dmclock 算法

人们常常容易忽略一些不起眼但特别重要的事物。曾经跟同事聊Python,有人说一切皆对象,这也是一些OOP的广告词,但我始终觉得一切皆函数。至今为止,还尚未听过见过没有函数的编程语言(SQL算不算?)。

很多QoS算法都不提队列,但队列是这类算法中最重要的要素了。具体来说,QoS算法的目的就是定义一个优先级队列,定义队列元素出队列的先后顺序。

从预留说起

起初把Reservation翻译为下限,与上限(Limit)相对应,意为保证用户IO不低于某个值。下限两个字很容易误解,如果用户一段时间内不产生IO那实际IO为0又如何保证IO不低于某个值。它原本的含义是在系统繁忙的情况下,如果用户产生的IO高于该值,保证实际IO不低于该值;如果用户不产生IO或者产生的IO低于该值,那自然不用保证。

一次偶然机会看到有人将其翻译成预留,顿时觉得妙,至少在用户看来非常贴切。预留极易让人联想到生活中预订餐桌的情况,假如预订一个八人桌,那么餐馆的服务生就会在其中一张八人桌上放个已被预订的牌子以防止被其他顾客占用。预订张八人桌能够保证8个以内的人均有位置,但不保证第九个人也有位置,可能有也可能没有。回到存储,与预订餐桌略有区别的是,预留并不会让系统为用户腾出一部分IO处理能力而等着用户IO到来。

如何预留?
假设存储系统有两个用户,两个用户都预留了10个IOPS,并且系统IO能力超过了两个用户的预留之和。

为保证用户的预留,系统处理IO分两个阶段:第一阶段先满足每个用户的预留,第二阶段再将剩余能力分配给所有用户。第一阶段要解决的问题是如何判断预留已满足。对此,不同算法有不同的策略,最直观的当属令牌桶算法。算法每隔1/10秒就为两个用户各生成一张令牌,用户的请求只有拿到令牌后才允许出队列,当用户无令牌可用时就说明该用户已经达到预留,当所有用户都无令牌可用时代表第一阶段结束。令牌桶通过产生令牌的速度来模拟用户预留的IO平均处理速度。

mClock的策略是依据IOPS将请求映射到时间轴,确定每个请求应该被处理的时刻。请求出队列时只要将排在当前时刻前面的请求处理完就能够满足预留要求了

如何确定请求应该被处理的时刻?
依据IOPS的定义,每隔1/10秒处理一个请求,也就是说,时间轴上相邻两个请求的平均间隔为1/10秒。将系统接收到给定用户的第一个请求放到时间轴中接收到该请求的时刻所在的位置,后续请求从前个请求的位置开始向右偏移1/10秒。假设系统在t1时刻开始接收请求,t2时刻开始处理请求,t1、t2的间隔恰好1秒。如果这段时间内系统刚好接收到10个请求,那么t2时刻处理完这10个请求就刚好满足预留;如果这段时间内接收到的请求数目超过10个,那么超过的部分将排到t2后面,t2时刻只要处理掉它前面的请求就能够满足预留要求了。

所谓将请求摆到时间轴,具体到实现层面就是为请求添加一个Tag,Tag的内容为请求应该被处理的时刻。后文将预留的Tag,称为R Tag。

考虑这样一种应用场景,用户起初有部分IO(时间段I),空闲了10分钟(时间段II)后,又有了IO(时间段III)。根据上文描述的方法,时间段III中请求的R Tag将严重滞后当前时间。这将导致时间段III中的某个时刻解决掉所有排在它前面的请求后用户实际的IOPS超过预留。这对该用户来说是件好事,但对其它用户极不公平,甚至会因为无法分配到IO而饿死。

上面的公式就是解决这个问题的方法,空闲了段时间后的第1个新请求将重新被设置为接收到该请求的时刻。公式中i代表用户,r代表请求,R代表Tag的值。

前文的关注点主要在单用户如何保证预留,多用户情况最容易导致的问题是IO分配不公平。如果系统总IO能力低于两个用户的预留之和,会不会出现用户饿死的情况?因为两个用户的请求都映射到时间轴,出队列时按照时间从小到大的顺序执行,因此不会出现不公平的问题。

上限有何不同

没有。
预留过程可以分成两步,第一步请求入队列时为请求添加R Tag,第二步请求出队列时决定哪些请求应该出队列哪些请求不能出队列。简单来说,当前时刻前的请求出队列,当前时刻后的请求不能出队列。

上限也是如此两步,只是含义略有不同。出队列时,当前时刻前面的请求全部被处理掉代表此时IOPS已经达到用户的上限,所以不能继续处理当前时刻后面的请求,否则就超出上限了。

权重有何不同

有点。
上限和预留是针对给定用户的绝对值,权重是用户间的相对值。第二步只要根据P Tag从小到大的顺序依次出队列即可,即使P Tag超过了当前时间也可以继续出队列。

IOPS、带宽和延迟

IOPS比较简单,两个请求之间没有差别。带宽稍微复杂点,要考虑到每个请求的大小。

假设某用户的预留为10MB/s,可以理解为每秒钟处理10MB数据,也可以理解为每1/10秒处理1个请求,每个请求的大小为1MB。为什么这么理解呢?因为我们需要找个参照物,此例以1MB的请求为参考,两个相邻的1MB大小的请求在时间轴上的间隔为1/10秒。那么,一个大小为512k的新请求与前一个请求的间隔应该设置为1/20;一个大小为2MB的请求和前个请求的间隔应该设置为1/5。

为什么比参照物小的请求间隔小,比参照物大的请求间隔大?这要从带宽的定义来理解。

(待续)

突发IO

应用场景
大文件拷贝、虚拟机的启动和迁移、数据库批量更新、页缓存刷新等。

不同厂商的定义
SolidFire定义突发IOPS能够超过上限IOPS,只能持续一小段时间。HP 3PAR定义突发IO不能超过上限,只是通过抑制其它应用来提高突发应用的优先级。mClock对突发IO的定义和HP 3PAR相同,只是提高其比例不能越过上限。

(1)只在系统有余力的情况才允许突发IO;
(2)只调整P Tag,不影响预留和上限。

dmClock先检查给定的应用是否空闲,如果空闲就给予一定的突发能力。

读、写和读写

(待续)

调度和调度引发的危机

(待续)

扩展mClock到多服务器

(待续)

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 转载自:https://xiaobailong24.me/2017/03/18/Android-RxJava2.x...
    Young1657阅读 2,016评论 1 9
  • 摘要:在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。而有些场景并不能用缓存和降级来解决,因此需有一种...
    落羽成霜丶阅读 2,150评论 0 18
  • AFHTTPRequestOperationManager 网络传输协议UDP、TCP、Http、Socket、X...
    Carden阅读 4,333评论 0 12
  • 昨晚,偶然听到了这首《My prayer》,第一次知道这首歌是在一本叫《十年一品温如言》的小说中,虽然这本小说的争...
    请叫我花哥阅读 401评论 0 0