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


这里是Z哥的个人公众号

每周五11:45 按时送达

当然了,也会时不时加个餐~

我的第「85」篇原创敬上



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


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


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


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



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


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


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


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


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



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


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



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


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


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


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


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


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


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


640?wx_fmt=png


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


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


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


  • 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 * (当前预估业务流量 / 某时段业务流量) * 当前业务接口比例



最后,得到了一个这样的每个接口的性能指标。640?wx_fmt=png接下来要做的第四步,就是确定到底要部署多少服务器,多少程序才能满足这些标准


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


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


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


640?wx_fmt=png


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



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


该“弹”多少合适呢?


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


640?wx_fmt=png


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


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


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


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


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



好了,我们来总结一下。


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


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


  1. 得到业务的流量指标

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

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

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

  5. 预留一些弹性空间


希望对你有所帮助。




推荐阅读:

  • 分布式系统关注点——360°的全方位监控

  • 分布式系统关注点——深入浅出「异步」



原创不易,如果你觉得这篇文章还不错,就「在看」或者「分享」一下吧。鼓励我的创作 :)


如果有希望我写一下什么主题的话,欢迎在后台给我留言哦~


640?wx_fmt=jpeg

可以试试点击「阅读原文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314485.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P3396 哈希冲突 根号分治

传送门 文章目录题意:思路:题意: 给你一个长度为nnn的数组aaa,每次操作有两种: (1)(1)(1) 给出x,yx,yx,y,问aaa中下表在模xxx的时候,模数等于yyy的位置aia_iai​之和。 (2)(2)(2) 给出x,yx,yx,…

miller_rabin 模板

miller_rabin 模板 ll quick_mult(ll a, ll b, ll mod) {ll ans 0;while(b) {if(b & 1) ans (ans a) % mod;a (a a) % mod;b >> 1;}return ans; }ll quick_pow(ll a, ll n, ll mod) {ll ans 1;while(n) {if(n & 1) ans quick_mult(ans, a, mod);a quick…

你不得不了解的10款服务器监控工具

监控Web服务器或Web主机的运行状况和正常运行非常重要。如果希望确保您的网站可用性在您的控制之中,那你就需要收集服务器各种性能数据以供分析和调整。以下是收集的常用大多数服务器监控组件解决方案。01Performance Co-PilotPerformance Co-Pilot,简称…

Codeforces Round #507 (Div. 1) D. You Are Given a Tree 根号分治 + dp

传送门 题意: 有一颗nnn个节点的树,其中一个简单路径集合被称为kkk合法当且仅当: 树的每个节点至多属于一条路径,且每条路径恰好包含kkk个点。 对于k∈[1,n]k\in [1,n]k∈[1,n],求kkk合法路径集合最多路径个数&…

acwing199.余数之和(除法分块)

思路 要计算∑i1nk(modi)\sum _{i 1} ^ {n}k\pmod {i}∑i1n​k(modi),可化简原式n∗k−∑i1nk/i∗i原式 n * k - \sum _{i 1} ^ {n} k / i * i原式n∗k−∑i1n​k/i∗i,显然k/ik / ik/i是一个具有块状性质的区间,我们给定了这个块状区间的…

2020EC-final

传送门 文章目录B - Rectangle Flip 2题意:思路:A - Namomo Subsequence题意:思路:D - City Brain题意:思路:B - Rectangle Flip 2 题意: 给你一个n∗mn*mn∗m的矩阵,接下来n∗mn*mn∗m秒每秒都会消失一个…

统一流控服务开源:基于.Net Core的流控服务

先前有一篇博文,梳理了流控服务的场景、业界做法和常用算法统一流控服务开源-1:场景&业界做法&算法篇最近完成了流控服务的开发,并在生产系统进行了大半年的验证,稳定可靠。今天整理一下核心设计和实现思路,开…

小A的柱状图

小A的柱状图 思路 经典的单调栈题目,对于每一个位置,我们维护他以当前高度可以到达的最左方,以及他当前高度可以到达的最有方,显然就有以他的高度的矩形块的面积就出来了,所以我们只需要统计n个矩形的最大值就行。 …

建筑师 第一类斯特林数

文章目录目录题意:思路:目录 题意: 给你一个nnn的排列,排列中的数代表他的高度,问你有多少个排列能使得从左边能看到aaa个建筑,从右边能看到bbb个建筑。 如果建筑iii左边没有任何比他高的,那么他就能看到。 1≤n≤5…

poj 3233 Matrix Power Series

Matrix Power Series 思路 题意比较简单,就是要求S(n)∑i1nAiS(n) \sum _{i 1} ^{n} A^ {i}S(n)∑i1n​Ai,显然有S(n)S(n−1)∗AAS(n) S(n - 1) * A AS(n)S(n−1)∗AA,看到这里,那就简单了,递推式,加…

.NET Core 编写 Azure Function 并连接 GitHub 持续部署

点击上方蓝字关注“汪宇杰博客”导语Azure Function 是一个事件驱动型无服务器计算平台,可以解决复杂的业务流程问题,更加高效地进行开发。在本地构建和调试,而无需额外的设置,在云中大规模部署和操作,并使用触发器和绑…

Codeforces Round #766 (Div. 2) D. Not Adding 数学gcd

传送门 文章目录目录题意:思路:目录 题意: 给你一个长度为nnn的数组,你每次可以选择其中的两个数,如果他们的gcdgcdgcd在数组中没有出现那么就可以加在数组后面构成一个新的数组,问数组最长是多少。 2≤n…

「数据ETL」从数据民工到数据白领蜕变之旅(五)-使用dotNET脚本实现SSIS无限扩展...

在前面一文中,正式引出了SSIS专业数据ETL工具,笔者仅能作引路作用,未能使用文章的方式给大家写出更多的入门级的文章,希望读者们可以自行根据分享的学习资源自行完成入门及进阶的学习。同时也想给大家分享到SSIS的能力边界性&…

P3067 [USACO12OPEN]Balanced Cow Subsets G 折半搜索

传送门 文章目录目录题意:思路:目录 题意: 给你nnn个数,从中任意选出一组数,使这些数能分成和相等的两组,问有多少种选数方案。 2≤n≤20,1≤ai≤1e92\le n\le 20,1\le a_i\le 1e92≤n≤20,1≤ai​≤1e9 …

poj 2191 Mersenne Composite Numbers

思路 用pollard_rho miller_rabin来拆分数字&#xff0c;如果得到的质因子大于等于2的话就按照格式输出&#xff0c;否则就不是我们想要的梅森素数。 代码 /*Author : lifehappy */ // #pragma GCC optimize(2) // #pragma GCC optimize(3) // #include <bits/stdc.h>…

数据结构为什么那么难?

来源 | 异步 | 文末赠书2017年8月&#xff0c;本着让更多的人轻松学习算法的初心&#xff0c;我写作了第一本书《趣学算法》&#xff0c;该书在出版后受到广大读者一致好评&#xff0c;在一年内重印了10次&#xff0c;并输出了繁体版的版权。一位读者对我说&#xff0c;读这本书…

书籍推荐:《C#7.0本质论》

在dotNet平台中有多种开发语言可以使用&#xff0c;C#无疑是其中应用得最为广泛的。学习一门编程语言最好的方式就是找一本好书系统地学习&#xff0c;我读过的关于C#的书籍中&#xff0c;我认为下面三本最为经典&#xff1a;《C#本质论》&#xff1a;入门类&#xff0c;目前最…

乌龟棋(dp)

乌龟棋 思路 最优值问题&#xff0c;显然可以通过dpdpdp解决&#xff0c;我们定义dp[i][j][k][l]dp[i][j][k][l]dp[i][j][k][l]表示到达1i∗2∗j3∗k4∗l1 i * 2 * j 3 * k 4 * l1i∗2∗j3∗k4∗l这个点之前已经走过的价值最大的值(i,j,k,li, j, k, li,j,k,l分别是走一步&…

CF 1631 D. Range and Partition 尺取 + 前缀和

传送门 文章目录目录&#xff1a;题意&#xff1a;思路&#xff1a;目录&#xff1a; 题意&#xff1a; 给你一个长度为nnn的数组aaa以及kkk&#xff0c;让你选择一个值域[x,y][x,y][x,y]&#xff0c;满足能将该数组分成连续的kkk段并且每段中值域在[x,y][x,y][x,y]内的个数严…

gRPC的简单使用

前言八月初的时候&#xff0c;在公司内部做了一个主题为《gRPC的简单使用》的分享&#xff0c;其实就是和小伙伴们扯扯淡&#xff0c;现在抽空回忆一下&#xff0c;也算是一个小小的总结吧。现在市面上耳熟能详的RPC框架也很多&#xff0c;下面列举几个遇到比较多的。谷歌的gRP…