做「容量预估」可没有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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

数据结构为什么那么难?

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

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

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

gRPC的简单使用

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

生命周期结束,Spring Boot 1.x退役

一年前 Spring 官方宣布 Spring Boot 1.x 生命周期将于今年 8 月 1 日结束,如今时间已到,在发布 Spring Boot 1.5.22 的同时,Spring 确认将不再为 1.x 系列发布维护版本。官方希望用户尽快迁移到 Spring Boot 2.x 上,为此还制作了…

Apollo 配置中心:分布式部署

Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。服务端…

使用Redis实现最近N条数据的决策

前言很多时候,我们会根据用户最近一段时间的行为,做出一些相应的策略,从而改变系统的运动轨迹。举个简单的例子来说明一下:假设A公司现在有两个合作伙伴(B和C),B和C都是提供天气数据的,现在A公司做了一个聚…

为什么我不喜欢数据库三范式

插曲最近,一个远房亲戚的小表弟准备选修专业找到我问:"哥,现在学数据库有没有前途阿?""当然有啊,前途大大的呢""那我现在开始学数据库,需要先从什么开始呢?""学课程的话&#xf…

硬货 - 技术人也能轻松玩转公众号?正确姿势竟然是...

最近在知乎上看到关于「公众号是否有“前”途」的相关问题... 问题下面有些精华回答~微信公众号还有“前”途吗? - 知乎https://www.zhihu.com/question/324575670很好的问题!作为一个技术人,我决定将此问题和自身情况结合起来,于…

你必须知道的Dockerfile

本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。本文预计阅读时间为5分钟。01—关于Dockerfile在Docker中创建镜像最常用的方式,就是使用Dockerfile。Dockerfile是一个Docker镜像的描述文件,我…

RabbitMQ 死信/死信队列

一、RabbitMQ 死信/死信队列1、DLXDead Letter Exchange 的缩写DLX(Dead Letter Exchanges)死信交换,死信队列本身也是一个普通的消息队列,在创建队列的时候,通过设置一些关键参数,可以将一个普通的消息队列…

centos7 rabbitmq安装/配置

一、RabbitMQ简单介绍RabbitMQ就是当前最主流的消息中间件之一。RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支…

Hyper-V + CentOS7 安装视频教程

一、前言本文使用图文视频的方式展示安装Centos7,【喜欢看视频学习的童靴请拖至文尾观看视频】二、虚拟机配置指定虚拟机名称&安装位置选择虚拟机代数 第一代虚拟机(例如Server 2008等平台技术,支持Vista、Win7) 第二代虚拟机…

程序员修神之路--用NOSql给高并发系统加速

领取福利记得长按,领取技术书籍哦随着互联网大潮的到来,越来越多网站,应用系统需要海量数据的支撑,高并发、低延迟、高可用、高扩展等要求在传统的关系型数据库中已经得不到满足,或者说关系型数据库应对这些需求已经显…

限时团购,6.5折:《C# 7.0 核心技术指南》

大家好,经过近两年的翻译,《C# 7.0 核心技术指南》终于和大家见面了。全书由 ThoughtWorks 高级咨询师,资深 .NET 专家刘夏翻译。作为一本第七次再版的图书,此次翻译对书中的字句进行了重新整理。期间和图书的原作者 Joe Albahari…

Azure 命令行工具大混战,都是什么,该选哪个?

点击上方蓝字关注“汪宇杰博客”导语最近在学习 Azure 的命令行玩法,发现官方有不止一种命令行工具,容易对新手产生混淆,本文将介绍各种工具都是干啥的,以及如何选择。目前,微软官方有3个Azure命令行工具,分…

揭秘鸿蒙生态背后的DevOps实践

(图片来源于网络)8月9日,华为发布了鸿蒙操作系统,在发布会上我们看到了鸿蒙系统的研发历程:2017年,鸿蒙内核1.0完成技术验证;2018年,鸿蒙内核2.0用于终端TEE;2019年&…