稳定性思考-强弱依赖2

弱依赖“并发请求数阀值”这个值设置多少合适?

    “并发请求数阀值”在大部分情况下可以理解为同时工作的线程数阀值,这个值不是越大越好,也不是越小越好,而是在最高QPS输出的情况下这个值越小越好。这个也是系统性能优化的一个方向,高QPS,少线程。

    线程它是驱动业务逻辑执行的载体,在执行逻辑的生命周期中,它会申请各种各样的资源,会占有CPU,会申请内存对象并持有,会申请锁并持有,会申请IO资源并持有,然后再完成一些工作之后,在恰当的时间释放这些资源。如果这个生命周期越长,那么直接导致这些资源被持有的时间越长。导致资源的竞争更加厉害。在java应用中,一个明显的场景就是由于内存申请之后长时间不能释放,导致FULLgC非常频繁。

    另一个角度,因为响应时间变长之后,会直接导致需要更多的线程数来满足不变的QPS,由于线程越多,导致对资源的持有和竞争更加激烈,表现CPU占用很高,Load很高,这是一个恶性循环,需要打破这个环。

    以cache访问为例

    假设客户端app(相对cache而言)本身的输入QPS为200(平均每秒有100个用户请求到此系统),每次业务请求会调用2次Cache,相当于对cache请求的QPS是200*2=400,也就是说如果要满足客户端app 200的qps,那么需要客户端app对Cache有400qps的访问能力,假设客户端app访问cache的平均响应时间为1ms。

    用户--1次请求-->[APP]--2次请求-->[Cache]

根据公式:QPS=1000ms/RT(平均响应时间) * threadNum(并行线程数)

threadNum=QPS/1000 * RT = 400/1000 * 1

                    = 1

Cache响应时间为1ms,那么只需要一个线程就足以提供每秒400次的请求服务,其实理论上1个线程可以提供1000的qps,当然前提条件是cacheServer有非常高的吞吐容量

        我们模拟一下故障

        此时CacheServer发生了故障,对CacheServer的调用全部超时,响应时间变成了3000ms

根据公式计算:threadNum=QPS/1000 * RT = 400/1000 * 3000 =1200

此时需要1200个线程才能满足400QPS的流量 ,换而言之就是客户端会有1200个线程堵塞在CacheServer的访问请求上。这个线程数量早就超过了客户端配置的线程数量,app系统表现为hung住,几乎不能处理任何用户的请求,如果客户端配置的线程数是200,那么根据之前对detail,hesper等java应用系统的压测,200个app线程,会导致系统频繁的发生FullGC(原因是线程数量多,每个线程执行的时间长),此时app的实际QPS反而会比系统极限QPS低很多。

对于APP来说,此时应该是减少对cache的访问量,让少量的线程去试探是否恢复,而不是所有线程都堵塞在这里,原则上来说不管对什么资源的访问,都不能出现大量线程堵塞的情况。

最佳的做法是,限制对cache访问请求的线程数量。比如限制为10: 此时我们再来看一下上面的故障

此时APP的qps仍然为200(假设用户流量不会发生变化),那么可以计算得到app对CacheServer访问的qps变为3:QPS=1000ms/RT(平均响应时间) * threadNum(并行线程数)=1000/3000 * 10 = 3。由于APP只是堵塞了10个线程,超过10个请求后会直接return,并做好return之后相关逻辑处理。app本身并没有因为大量线程消耗大量的资源,app的状态依旧正常,只是cache不能命中。

        接下去故障恢复

        由于用户对APP的请求没有堆积,堵塞在访问cache的线程会因为超时设置,导致每隔3秒会有一个堆积请求退出,同时会放入新的线程,一旦cacheserver恢复,即便是1个线程理论上都可以提供1000的qps,所以系统会非常快速的恢复。

从结果上来看,“超时设置”策略是一种对每一个请求都会起作用的策略,而“并发请求阀值限制”策略是对一段时间持续发生系统变慢后才起作用。系统都正常的情况下超时设置会有一定的误杀,但是异常情况下由于超时的设置还是会导致一定线程的堵塞,所以“超时设置”加上“并发请求阀值设置”是一个很好的降级,流控策略,比单独使用一种有更好的效果。

        另外阀值为什么是10,不是20,不是100,关于这个值到底是多少?可以通过计算得到

        还是400QPS为例,对于客户端来说需要提供一个数据:你可以接受cache的响应时间是多少,平均响应时间为1ms,假设我们可以接受的是10ms:

QPS=1000ms/RT(平均响应时间) * threadNum(并行线程数)

threadNum = 400 * 10 / 1000 = 4

4个线程,没错是4个,不过设置4个线程阀值还是太小

如果是接受100ms:

threadNum = 400 * 100 / 1000 = 40

        一般建议设置40个,40个线程阀值的效果等同于设置100ms超时时间。

 另外,对于客户端APP来说可以接受堵塞多少线程?根据性能压测经验,一般平均50ms左右响应时间的java-APP,最好不要超过60,平均响应时间100ms的最好不要超过100。这个值是相对的,和系统有关系,特别是和系统单次请求所需内存开销,响应时间变化有关。

        再谈一下系统的响应时间

        正常情况RT这个值说应该是一个相对固定的值,因为代码的逻辑是一样的,干活的量也是一样的,好比一个卖票的窗口,卖一张票所需要的时间是固定的。那为什么有时候我们买票需要花更多的时间呢?原因是由于需求的QPS大于供给的QPS,我们被进入了排队,我们的时间消耗在了排队和资源争夺。而且一旦这个条件持续满足“需求的QPS大于供给的QPS”,响应时间会越来越慢,慢到无穷的大。

在系统做性能压测的情况下响应时间的曲线一般是这样的:

                                 /

__________________/    x轴压测用户数,y轴响应时间

        虽然响应时间变长,但是QPS不会变高,反而会下降,系统的极限QPS是由系统的瓶颈资源的极限QPS决定的,因为瓶颈资源的极限QPS几乎是一个固定的值,所以决定了系统只有一个最高QPS,听起来好像很奇怪,因为这个值并不会因为系统补充了其他资源而变的更高,有时候有人会认为我增加线程数量,是不是会增加这个最高QPS,答案肯定是不一定的。

时间: 2024-09-30 04:43:21

稳定性思考-强弱依赖2的相关文章

稳定性思考-强弱依赖

淘宝系统依赖关系比较复杂.A系统依赖B系统资源,当B系统发生故障的时候,A系统势必会被拖累,导致A系统也发生故障                                  图:[ A]--依赖-->[B] 这里的依赖要区分两种情况 1.A强依赖于B     任何强依赖都要尽可能的转化成弱依赖,因为强依赖本身意味着一荣俱荣,一损俱损.老婆管账,但是老公又没有私房钱,对老公来说强依赖于老婆,也许是很幸福的事情.在系统角度来说这并不是好事情,比如支付系统强依赖银行的支付,一旦银行支付出现问题,

中间件技术及双十一实践·稳定性平台篇

稳定性平台--系统稳定运行的保障者 综述 大多数互联网公司都会根据业务对自身系统做一些拆分,大变小,1变n,系统的复杂度也n倍上升.当面对几十甚至几百个应用的时候,再熟悉系统的架构师也显得无能为力.稳定性平台从2011年就开始了依赖治理方面的探索,目前实现了应用级别和接口级别的依赖自动化治理.在2013的双11稳定性准备中,为共享交易链路的依赖验证和天猫破坏性测试都提供了支持,大幅度减小了依赖治理的成本和时间.另一方面,线上容量规划的一面是稳定性,另一面是成本.在稳定性和成本上找到一个最佳的交汇

2017QCon分享:从淘宝到云端的高可用架构演进

大家好,我今天分享的题目是<高可用实践:从淘宝到上云的差异>,取这个标题是因为会涉及到两个方面内容,一方面以淘宝为例子,传统的IDC的时候,我们稳定性是怎么做的,另外在云计算背景下,有很多创业公司是基于阿里云这样的公有云基础设施做研发,在公有云的环境下怎么做好我们系统的高可用. 长期做稳定性的人会有一些职业病,记得去年冬天有个周末,我要寄快递,穿着睡衣在门口填快递单,那时候我家里养了一只猫,因为怕猫跑出去,就把门关上了.寄完快递口袋一掏发现自己没带钥匙,冷静了3秒钟,打车到公司刚巧碰到同事,看

纯干货 | 从淘宝到云端的高可用架构演进

近日在Qcon开发者大会北京站上,来自阿里巴巴商家事业部技术专家沐剑在专场分享了题为<高可用实践:从淘宝到上云的差异>的演讲,主要介绍了其近几年在阿里电商平台及阿里云上的高可用设计的经验,分为两个部分:第一部分主要包括传统的淘宝店铺稳定性体系的建设及相关的基础链路设计.缓存和容灾方案的设计及部署:第二部分主要包括目前公有云高可用设计的主要思路.经典故障及应对措施等. 演讲全文: 沐剑 大家好,我今天分享的题目是<高可用实践:从淘宝到上云的差异>,取这个标题是因为会涉及到两个方面内容

阿里10年分布式技术沉淀:阿里高可用体系核心缔造者、全链路压测创始人告诉你!

本次活动看点十足,大咖齐聚.纯正干货,下面给大家做下详解介绍,相信看后定会让你动心! 议题详情 双11核武器全链路压测--张军 / 阿里巴巴中间件高级技术专家 阿里巴巴双11备战期间,保障系统稳定性最大的难题在于容量规划,而容量规划最大的难题在于准确评估从用户登录到完成购买的整个链条中,核心页面和交易支付的实际承载能力.全链路压测的诞生改变了这一现状,通过对双11进行模拟,支持线上不影响正常用户访问的集群读写压测,获得最真实的线上承载能力数据.全链路压测开启了大促稳定性保障的新纪元,被誉为备战核

八年来我们到底经历了什么?——中间件专家带你“重走”双11高可用架构演进之路

双11的技术挑战 双11技术挑战的本质使用用有限的成本去是实现最大化的用户体验和集群整体吞吐能力,用最合理的代价解决零点峰值,支撑好业务的狂欢.阿里做双11已经有八年之久了,八年来双11的交易额增长200倍,交易峰值增长400多倍,系统复杂度和大促支撑难度以指数级攀升:并且经过多年的发展,双11技术实现链条中的变量不断增加,如峰值的增量和系统架构的变化.交易峰值的组成.拆单比.每个业务入口的访问量等,这些变量也给系统带来了不确定性.回顾这八年的双11零点之战,它推动了阿里的技术进步.推动了架构优

BaaS后端即服务 - 通往中台架构之路

该文章来自阿里巴巴技术协会(ATA)精选集 BaaS代表第二代云服务,相对于AWS.阿里云等公有云(IaaS,PaaS)是第一代云服务,通过广泛部署云数据中心解决了开发和运维系统不需要管理服务器的问题,BaaS则在第一代公有云数据中心基础之上,对云计算资源进一步封装.简化与优化,提供开发.运维和服务的一站式云服务. 这就是所谓BaaS(后端即服务)模式的兴起,BaaS将公有云数据中心资源根据前端应用场景打包,通过简化的调用接口提供给开发者使用.通过减负,开发者得以集中精力于用户的研究.APP软件

超全总结 | 阿里如何应对电商故障?神秘演练细节曝光

近日,在 QCon北京2017大会上,来自阿里巴巴中间件团队的技术专家周洋(花名中亭)发表了题为<阿里电商故障治理和故障演练实践>专题演讲.在会后官方组织的评选中,本次演讲的内容得到了一致好评,中亭获选为本次大会的明星讲师.此次演讲整体上分享了从 2011 年至今,阿里巴巴电商平台遇到的诸多有代表性的故障,以及在此过程中积累的非常多的高可用保障经验和解决方案. 演讲内容包括两大部分:第一部分会从分布式系统经典依赖故障出发,剖析故障成因,介绍治理方案和技术演进:第二部分从宏观视角探讨构建一套&q

一杯茶一本书 读懂&quot;双11&quot;8年技术保卫战

文章讲的是一杯茶一本书 读懂"双11"8年技术保卫战,喝茶醒神,读书清心.在古代,对于文人骚客来说,饮茶与读书是一样的风雅.书室之内,燃上一柱香,泡上一壶茶,淡淡的清香营造出一种幽静的氛围,意境很典雅,用现在时髦点的话说,就是"有品位". 4月12日,阿里巴巴技术团队在京就办了一场有品位的分享会,在一个佛堂环境,用一杯茶,一个本书,为我们揭秘"双11"这一世界级经济现象背后的技术支撑. 茶是禅茶,书是阿里巴巴集团唯一官方出品的<尽在双11-