`
huorongbj
  • 浏览: 19609 次
文章分类
社区版块
存档分类
最新评论

做「容量预估」可没有true和false

阅读更多

如果第二次看到我的文章,欢迎「文末」扫码订阅我个人的公众号(跨界架构师)哟~ 

每周五11:45 按时送达。当然了,也会时不时加个餐~

我的第「85」篇原创敬上

 

随着20年来互联网的蓬勃发展,一个软件系统所要面对的访问压力上限被逐渐提高。

 

虽然如此,但是那些体量达到亿级或者是千万级的产品也只是少数公司的专属。对于整个行业里百万+的程序员群体来说,估计也就只有10%人有机会接触到这些“大系统”。

 

所以,一提到容量预估,大家可能第一时间想到的是,这是大公司的事,我们这种小系统不用考虑这个问题。

 

这说法其实不太对。现在这个时代,营销活动满天飞,初创企业更是在绞尽脑汁想着“一炮而红”,所以哪怕不是那些千万级以上的系统也需要考虑容量预估的问题。

 

 

对大型系统来说,容量预估是刚需,关乎到系统能不能扛住,或者投入的资源会不会过度浪费,毕竟1%都是好多钱呐。

 

而对小系统来说,多花个百八十万,多冗余一些资源也没问题。

 

虽然如此,但是Z哥觉得,能不能做好「容量预估」,背后体现的是一个人解决没有标准答案的问题的能力。

 

这是很多程序员都缺乏的一个能力。

 

所以,不管你当前是在大公司还是小公司,只要你希望提高你的架构能力,或者未来想有机会把握住在大公司的工作机会,那么这是一个必须要掌握的基本技能。

 

 

日积月累的程序员思维让大家都习惯了事事都有0和1,true和false。然而真正复杂的问题是那些没有标准答案的问题,在这些问题中,没有对和错,只有合适和不合适。

 

而且,如今大家的生活越来越“在线化”。如果一个系统的负载能力,我们一直不去关注它。那么,当好不容易熬到的“风口”真的吹来的时候,能把握住吗?还是眼睁睁的错过它们。

 

 

我想,大多数人对容量预估还是有一些概念的。通过数据推算出对系统承载能力的要求,并且实施满足要求的程序部署。

 

比如,下个月要做一轮大促。系统要达到一个什么状态才能顺利支撑大促的开展?

 

大家脑子里至少都会有这样的一个公式:

 

流量 / 单机性能 = X台机器

 

但我认为这个理解还可以再深入一些。Z哥的理解是:容量预估的本质是为了获得技术投入与业务发展之间的合理值,追求的是无限接近于“刚刚好”的状态

 

要达到“刚刚好”的状态,必然意味着不能凭借拍脑袋办事,而要考虑到尽可能多的维度,采集更多维度的数据作为参考。

 

因为实际的情况,肯定不是像上面公式一样简单的线性关系。而是类似下面这样的对数曲线关系。

 

 

那么具体该怎么做容量规划呢?

 

在这之前我们先得搞清楚几个概念。

 

首先是指标。我们主要关注以下几个指标。

  • UV(Unique Vistor):一段时间内的访客数,同一访客在该时段内的多次访问只计一次。

  • PV(page view):一段时间内的页面浏览次数,同一用户多次打开同一页面也继续累计。

  • 响应时间/系统延迟(Latency):系统处理一个请求/任务的延迟(请求处理时间+数据传输时间)

  • 吞吐量(Throughput):一个单位时间内可以处理的请求数。也就是该单位时间内发起的请求总数/平均响应时间,请求数可以是一次pv、也可以是一次rpc调用等等。

  • TPS(Transaction Per Second):可以理解为,单位时间是“秒”的「吞吐量」。

 

 

其次,我们要对会产生性能开销的地方要有认识。这主要分为3个部分。

  • 硬件/操作系统层面的开销。如磁盘I/O、网络I/O,CPU的多线程切换等等。

  • 进程运行的开销。如代码逻辑啊、锁啊等等。

  • 多个进程之间的通信开销。rpc框架、数据库访问框架、redis/memcached访问SDK、MQ访问SDK等等。

 

 

然后就可以开始做「容量规划」了。

 

我一般是按以下5个步骤进行。

 

第一步,搞清楚业务的状况,先得到业务上的指标

 

技术工作最怕隔着“部门墙”,蒙着头做,沉浸在自己的“小世界”里。

 

所以,不管通过什么途径,得先对一些业务指标有客观的认识,PV、UV的数据是必须的。可以找业务方聊,也可以借助百度指数、微信指数等更宏观数据来进行参考和修正。

 



第二步,围绕这个业务指标,对所涉及的相关技术接口制定性能指标

 

其实就是要得到一个业务流量与技术的性能指标之间的一个比例关系。

 

比如,访问一次A页面,涉及到调用a接口2次,b接口1次,c接口3次这样。

 

做这事儿有一个简单的办法。

 

先在系统中的每个api接口做好数据采集,目的是为了后续能获得两个数据,响应时间和次数等等。

 

然后借助一些压测工具,比如loadrunner之类,对当前的业务场景做一轮的全链路压测。模拟的用户数不用很大,因为我们只是为了得到一个比例。


这样,在压测结束后,你就可以将loadrunner中所记录的发起请求的数量,对比api接口采集到的数据,就能得到每个接口与业务流量之间的关系。顺带也能看到在低压力下的错误率、平均响应时间、tp95、tp99等等的情况。



第三步,借助过去的经验对标准进行校准


真实的生产环境是错综复杂的,因为一个api接口往往会被众多地方调用。


那么做校准就是为了让我们的预估更接近真实的生产环境一些。


如果有过去成功支撑的案例数据就最好了。用当时的UV、PV数据、接口与业务量比例对比当前的业务预估的UV、PV、接口与业务量比例进行同比例的调整。


可以得出下面这样的公式:

应满足的TPS = 成功时的TPS * (当前预估业务流量 / 成功时业务流量) * (当前业务接口比例/成功时业务接口比例)。



没有成功案例的话,可以通过分析数据库中任何带有“时间”字段的数据,找到其中已知可承受的最高并发值,以及对应的时间点。(简单粗暴的方式可以groupby“时间字段”)


再反向去找对应这个时间节点的PV、UV。


然后再与这次的业务指标预估进行对比,看下差异比例。

应满足的TPS = 历史最高TPS(不管抗没扛住) * (当前预估业务流量 /  历史最高TPS时业务流量) * (当前业务接口比例 / 历史最高TPS(不管抗没扛住) 时业务接口比例)。

 

 

当然了,最坏的情况就是,过去对数据不够重视,完全没有数据可以参考。

 

那就马上做数据埋点,分析当前系统的运行时数据,得到当前某个时段的业务流量以及对应的TPS。这应该不是难事。


这样也可以推算出一个「应满足的TPS」。

 

应满足的TPS = 该TPS * (当前预估业务流量 / 某时段业务流量) * 当前业务接口比例

 

 

最后,得到了一个这样的每个接口的性能指标。

接下来要做的第四步,就是确定到底要部署多少服务器,多少程序才能满足这些标准

 

正如前面所说,得到这个结果不是简单的做除法,因为这不是一个线性关系。

 

所以,我们需要动手进行验证。

 

你可以通过分别压测1台、2台、3台、……,不同数量的服务器,得到下面这样的一个曲线。(当然,性能优化工作也是在这个期间进行)

  

如此一来,你就可以根据这个衰减的趋势,得到一个理论上能支撑业务所需的程序数量和服务器数量。

 

 

当然了,理论毕竟是理论,为了保险起见,还是要预留一定的弹性空间,这就是第五步。免得算的太“扣”,没给自己留后路。

 

该“弹”多少合适呢?

 

Z哥的建议是,同比分析一下过去一段时间内的业务量情况,观察每个波峰的同比增长大小,将同比增长的最大值作为弹性部分的比例。

 

弹性部分可以不用100%提前启用,但要随着备着。

 

到这里你就完成了整个容量预估工作的5个步骤。

 

其实最终得到的数据还有一些其他作用。比如,设置程序的线程数量、配置web容器(nginx、tomcat、iis)等等。

 

因为大多数情况下,参数都会设置的过大,甚至有不少小伙伴会一拍脑袋的设置成max值。

 

其实这样的风险是非常大的,不但会有资源耗尽的风险,在分布式系统中还会产生级联反应,影响上游系统。

 

 

好了,我们来总结一下。

 

这次呢,Z哥先和你聊了一下容量预估的意义。

 

然后,分享了我自己做容量预估的思路,通过5步法来实现。

  1. 得到业务的流量指标

  2. 通过调用比例获得相关接口的性能指标

  3. 根据历史数据进行校准

  4. 根据衰减曲线得到预估的节点数量

  5. 预留一些弹性空间

 

希望对你有所帮助。

 

 

推荐阅读:

 


 

作者:Zachary

出处:https://www.cnblogs.com/Zachary-Fan/p/capacityestimate.html

 

如果你喜欢这篇文章,可以点一下「推荐」。

这样可以给我一点反馈。: )

谢谢你的举手之劳。

 

▶关于作者:张帆(Zachary,个人微信号:Zachary-ZF)。坚持用心打磨每一篇高质量原创。欢迎扫描下方的二维码~。

定期发表原创内容:架构设计丨分布式系统丨产品丨运营丨一些思考

如果你是初级程序员,想提升但不知道如何下手。又或者做程序员多年,陷入了一些瓶颈想拓宽一下视野。欢迎关注我的公众号「跨界架构师」,回复「技术」,送你一份我长期收集和整理的思维导图。

如果你是运营,面对不断变化的市场束手无策。又或者想了解主流的运营策略,以丰富自己的“仓库”。欢迎关注我的公众号「跨界架构师」,回复「运营」,送你一份我长期收集和整理的思维导图。

分享到:
评论

相关推荐

    c++语言编程实现史密斯预估器.docx_KP_史密斯预估器_smith预估;_史密斯预估_史密斯C语言_

    **史密斯预估器(Smith Predictor)**是一种在控制理论中广泛应用的预测控制器,它结合了模型预测控制(Model Predictive Control, MPC)的概念,能够处理延迟和非线性问题。在C++语言中实现史密斯预估器,可以提供...

    预估校正算法526991_dydtfraliu_分数阶系统_分数阶_数值解_预估校正LIU_预估校正_

    预估校正算法是控制理论中的一个重要组成部分,特别是在处理非线性系统和复杂动态系统时。分数阶系统则是一种扩展了传统整数阶系统概念的数学模型,它引入了分数阶微积分,使得系统能够更好地模拟现实世界中具有记忆...

    史密斯预估补偿控制及MATLAB仿真.pdf

    它通过引入一个预估补偿环节,抵消纯滞后特性所造成的影响,明显地减小超调量和加速调节过程,提高了控制质量。该方法的基本控制策略是构造一个过程参考模型,将迟延环节e- Ts移出系统闭环,使系统反馈信号不受e- Ts...

    核电厂基于大数据的集体剂量预估方法浅析.pdf

    集体剂量在核电厂中的预估方法是辐射防护领域里的一项重要技术,其主要目的是为了评估和控制在核电站运行、维修过程中工作人员所受的辐射剂量,确保辐射风险处于可接受的范围内。集体剂量是一种安全绩效指标,其预估...

    智能电网的电能预估及价值分析

    智能电网的电能预估及其价值分析对于优化电力分配、提升能源使用效率以及增强电力系统的稳定性和可靠性具有重要意义。以下是对这两个方面的详细探讨: 一、电能预估 电能预估是智能电网的核心功能之一,它基于大量...

    Smith预估控制器算式的改进 (1987年)

    Smith预估器是一种重要的控制系统结构,可以应用于纯滞后补偿控制。本文介绍一种精确、可用的Smith预估控制器算式,这种算式由PID模块与Smith预估模块组成。PID模块算式与G(s)模块算式由虚拟零阶保持器z变换来拟合,G(s...

    Smith预估控制算法设计仿真方法

    根据给定对象特性设计smith预估控制器算法,并利用Matlab软件进行仿真,同时与PID算法控制算法进行比较

    数据中心投资规模预估和经济效益分析.docx

    数据中心投资规模预估和经济效益分析 本文档对数据中心投资规模预估和经济效益分析进行了详细的阐述。数据中心投资规模预估部分对数据中心的投资预算、经济效益及运营费用进行了详细的分析。经济效益分析部分对数据...

    CTR预估模型讲义pdf

    CTR(Click-Through Rate,点击通过率)预估模型是广告商和广告平台不可或缺的一部分。CTR 预估模型的主要目的是预测用户对广告的点击行为,以便于广告商更好地了解用户行为,提高广告的点击率和转换率。下面是 CTR ...

    巫山=成都全年预估

    非常好的预估,能对你的预估能力代理超级的帮助

    项目预估时间表

    项目预估时间表 项目预估时间表 项目预估时间表

    系统最大性能容量的预估方法、装置、设备及存储介质与流程.mht

    系统最大性能容量的预估方法、装置、设备及存储介质与流程.mht

    一阶惯性大时滞系统Smith预估自抗扰控制.pdf

    2. Smith预估器的原理和应用:Smith预估器是一种常用的延迟补偿方法,通过预估延迟的输出值来补偿延迟的影响,从而提高系统的稳定性和响应速度。Smith预估器广泛应用于工业过程控制、机器人控制、自动駕驶等领域。 ...

    模型预估与选择

    这一章主要介绍模型的预估以及选择,介绍了三种预估方法,以及选择模型的标准。

    4-3+阿里妈妈展示广告预估校准演进之路.pdf

    本文主要探讨了阿里妈妈在展示广告预估校准技术的发展历程,以提高广告系统的准确性、稳定性和公平性。预估技术在广告、搜索和推荐系统中至关重要,尤其是在点击率(PCTR)预测方面。然而,模型输出的预估值并不总是...

    计控实验二:smith预估算法仿真

    Smith预估控制算法设计仿真实验 实验目的 在控制算法学习的基础上根据给定对象特性设计smith预估控制器算法并利用Matlab软件进行仿真实验同时与PID控制算法进行比较加深对该控制算法的掌握和理

    子空间预估器_offkgm_PEMFC_子空间辨识_子空间_子空间预估器_

    通过以上分析,我们可以看出,这个资料包提供了一整套使用子空间预估器对PEMFC电特性进行建模和控制的方法。学习者可以先了解子空间辨识的基本原理,然后通过`pemfc_subm.m`中的代码学习如何实现模型构建,接着研究`...

Global site tag (gtag.js) - Google Analytics