基于系统负载的动态限流组件 dynamic-limiter

基于系统负载的动态限流组件 dynamic-limiter

来源:Qunar 技术沙龙

背景

一个系统的处理能力是有限的,当请求量超过处理能力时,通常会引起排队,造成响应时间迅速提升。如果对服务占用的资源量没有约束,还可能因为系统资源占用过多而宕机。因此,为了保证系统在遭遇突发流量时,能够正常运行,需要为你的服务加上限流。

通常限流可以分为两类:单机限流、全局限流。常见的单机限流工具有 Guava RateLimiter 和 Java Semaphore,全局限流可以用 Redis 做全局计数器来实现,基础架构组也提供了一个灵活的全局限流组件 common-blocking。这些限流工具有一个共同的缺点:都需要手动设置一个固定的限流阈值。

首先,手动设置固定阈值需要做容量评估,准确的容量评估是比较难的。其次,在每次系统更新升级后,阈值会变得不再准确,需要重新调整,比较繁琐。再次,固定阈值也不能应对服务器性能波动的情况,对于一些日志量比较大的应用,整点日志压缩时,会消耗较多性能,此时系统的处理能力肯定比其他时候要稍差一些。最后,应用大多运行在虚拟机上,同一个实体机上的虚拟机之间也会相互影响,这个体现在监控上就是 CPU 使用率里的 steal 值了。

既然固定阈值有这么多缺点,我们就想有没有什么办法能够自动计算限流阈值呢?下面介绍一下:基于系统负载的动态限流。

动态限流原理

为什么叫动态限流呢?因为我们希望在系统运行时,限流阈值能够根据实际情况做动态调整。具体根据什么来调整呢?系统负载,这里我们使用了最常见的三种监控指标:CPU 使用率、Load 和服务的响应时间。

动态限流的目标是,计算一个合理的阈值,让系统在提供最大处理能力的同时,保持健壮,不被压垮。

动态限流的基本思路可以看下面这幅图,系统负载反过来说就是系统的健康程度。当系统负载较低,处于健康状态时不限流。当系统负载稍高,处于不健康状态时,以最近几秒处理请求的 QPS 计算限流阈值。当系统负载过高,状态恶化时,让限流阈值以一定的系数进行衰减,直到系统负载降低,系统状态由恶化变为不健康,最终让系统负载收敛在两个负载阈值之间。

动态限流基本思路

前面提到在健康状态下不限流,那么系统在从健康状态变为不健康或恶化状态时,就需要计算一个初始限流阈值,初始限流阈值的计算参考了健康状态的 QPS 和当前处理请求的 QPS。具体的计算公式如下图所示,其中 H 表示健康状态下的 QPS,C 表示当前处理请求的 QPS。

限流初始阈值的计算公式

其中的重点是系统状态从健康变成恶化时的阈值计算,限流阈值等于 H 乘以一个系数,这个系数是 C 除以 H 的二分之一次方,也就是流量暴涨倍数的二分之一次方。这样计算的目的,是避免像下图这样的情况,初始阈值设置的不合理时,限流阈值收敛到合理区间太慢,浪费系统资源。

初始限流阈值不合理的情况

初始阈值设定之后,还需要根据系统负载进行动态调整,如何动态调整呢?可以先看下面这幅阈值调整示意图,相比之前的基本思路图,这里多了一个负载阈值 0,设置它的目的是希望当初始阈值设置不合理导致系统负载变得很低时,能够快速提升阈值。当系统负载接近收敛区间时,进行细微调整,避免步子迈得太大,把系统搞垮了。简单说就是当系统负载低的时候,快速调整,当系统负载高的时候,细微调整。

阈值动态调整示意图

在实际中,负载阈值 1 和 2 可以灵活配置,为了减少配置工作量,负载阈值 0 固定为负载阈值 1 的 70%。

最后再说一下,何时不再限流,恢复正常呢?当突发流量消失,系统能够处理全部请求,并且处于健康状态时,不再限流。

到这里动态限流的原理就讲完了,下面我们看一下线上测试效果。

测试效果

最初我们做了基于 Load 的动态限流,服务器 CPU 是 4 核的,所以两个负载阈值分别设置成 3 和 5,限流阈值更新频率为 1 秒一次。

实际效果请看下面的监控图,左边是 10 倍流量压测而未开限流的情况,未开限流时 CPU 使用率高达 99%,Load 也高达 20。中间打开限流之后,Load 降到 5 左右,CPU 使用率也降了下去,但是波动很大,为什么呢?想到之前看过的文章里提到 Load 是 5 秒采样一次,而这里阈值 1 秒更新一次,更新太快了,更新之后还没有体现在 Load 计算上就又更新了。

基于 Load 的动态限流测试 1

当我们将阈值更新频率改为 10 秒一次时,从下图可以看出来,CPU 和 Load 的波动小了很多。

基于 Load 的动态限流测试 2

看监控我们发现 Load 在 3 到 5 之间波动时,CPU 使用率才 60%,还有提高的空间。我们知道 Load 和 CPU 不同步的原因是,Load 不仅和计算有关,也和 IO 有关。而报价是计算密集型的应用,所以我们又试验了基于 CPU 使用率的动态限流。

我们将阈值设定为 70 到 90,看下面的监控图,CPU 使用率基本稳定在 70 到 90 之间,Load 稍微高一些。压测之后搜索耗时从 70 涨到了 150 并保持稳定,稳定就表示服务是正常的。

基于 CPU 的动态限流压测效果

下面我们再看一下,基于 CPU 和基于 Load 限流时搜索成功量的对比,分别是 164 和 134,说明基于 CPU 的限流的确提升了系统处理能力,提高了资源利用效率。

Load 和 CPU 动态限流对比

一些服务可能对响应时间比较敏感,所以我们又做了基于时间的动态限流,当我们将阈值设定在 140 到 200 之间时,看监控压测之后搜索耗时也基本稳定在这个 140 到 200 之间,CPU 和 Load 监控也保持稳定。

基于 TIME 的动态限流压测效果

总结

我们将上述讲的基于负载的动态限流封装到了一个 API dynamic-limiter 中,供各个系统使用。最后总结一下,动态限流适合什么样的场景呢?

  1. 如果你的系统内单个服务占用大部分资源,就可以使用基于 CPU 或 Load 的动态限流。
  2. 如果你的服务对响应时间要求比较高,可以使用基于时间的动态限流。

实际中,也可以同时参考多种因素来进行动态限流,起到一个多重约束的作用。比如同时使用 CPU 和 TIME 时,表示既对 CPU 使用率有一个硬约束,又对服务响应时间有一个硬约束。

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

推荐阅读更多精彩内容

  • 当资源成为瓶颈时,服务框架需要对消费者做限流,启动流控保护机制。流量控制有多种策略,比较常用的有:针对访问速率的静...
    c84f3109853b阅读 5,852评论 0 2
  • [TOC] 系统设计:关于高可用系统的一些技术方案 可靠的系统是业务稳定、快速发展的基石。那么,如何做到系统高可靠...
    albon阅读 1,801评论 0 14
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 操蛋的人生, 有时候真是无法预料。 悲欢离合,酸甜苦辣,人生百态。 你始终不知道生活下一刻会迎来什么样的滋味。 你...
    元气满满的慧慧酱阅读 385评论 0 2
  • Frank Sinatra的曲子回荡在开着暖气的房间 我听到了,往烈酒杯子里,加冰块的声音 记起了童年的冬天 炉子...
    很深的绿阅读 126评论 0 0