首页 > 其他分享 >系统设计中的快速估算技巧

系统设计中的快速估算技巧

时间:2024-02-26 10:13:56浏览次数:46  
标签:200 估算 60 吞吐量 000 400 快速 技巧

  拿到一堆数据,去做架构也好,设计也好,可行性分析也好,工程上需要的是严谨。但是也有很多场景,比如即时的问题争辩和讨论,我们往往需要的是快速、直接的估算,这样的数据显然不需要非常精确,甚至可以说它一定会非常粗略,我们的目标往往只停留在 “量级” 的级别,但是我们依然可以对方案有一个具体的、量化的认知,这比像 “海量”、“高吞吐”、“低延迟” 这类感性的、描述性的表述还是要清晰和有力得多。

举个经典的例子,已知 Twitter 2020 年大约有 2000 亿(200 billion)的推文(tweets)发推服务的吞吐量(TPS, transaction per second)是多少,网络带宽要占用,要存储它们需要多大的磁盘容量?

听起来是不是挺难的?其实并不是。我们可以用一点快速估算的技巧,它在有些场景下很有价值,且其实并不难,需要经过简单的练习。

估算的例子

回到 Twitter 那个问题,我们来实际操作一遍。

吞吐量

首先,每个推文可以认为只写一遍,那么,200,000,000,000 / 365 days / 24 hours / 60 min / 60 sec 就可以得到大致的一个写的吞吐量了。

一般需要估算的时候,是来不及去拿计算器的,我们可以简算:

  • 365 days 算多一点,近似于 400 days,这样 200 billion / 400 = 500 million
  • 24 hours 算多一点,近似于 25 hours,这样 500 million / 25 = 20 million
  • 60 min 算少一点,近似于 50 min,这样 20 million / 50 = 400 thousand
  • 60 sec 算少一点,近似于 50 sec,这样 400 thousand / 50 = 8000

你看,这样这几个除数,有的多算一点, 有的少算一点,这就是让除法尽量简便的技巧。它得到的结果是,用于发推的写请求是每秒钟 8000 个。熟练了以后半分钟就可以得到结果了。

另外一个技巧是,尽量习惯用英文的 thousand、million、billion,数字的话每 3 位点一个逗号,比如 1,000,000,000。我以前习惯用中文的万、亿、兆,当然也可以,但是由于多数阅读材料和技术讨论的时候用的都是前一种方式,就很容易搞乱了。

此外,一天 24 小时有 60*60*24=86400 秒,这个数值得记住,因为总是被反复用到,上面的估算也可以直接应用这个数来简化过程。

如果你用计算器算上面的算式,可以得到大概是 6000 多个,也就是说,估算得到的结果和实际严格计算的结果是接近的。实际上,它们只要不差到一个量级,往往并不会影响我们在工程方面大的架构、评估和设计。

带宽

好,下面计算带宽,还是非常粗略的方式。我们假设平均每条推文 200 个字符,每个字符占用 2 个字节(byte),这样每条推文就占用了 200 * 2 = 400 byte,因此带宽就是 400 byte * 8000 = 3,200,000 bytes/second,也就大约 3MB / sec。

这里还是用了估算,尤其是软件的世界里面,从 B(byte,或者 B,注意它是大写的 B,表示字节,不是小写的 b,bit 是位,1 byte == 8 bits)到 KB 是 1024 倍,但是我们可以近似为 1000 倍,从 KB 到 MB 同理。

存储

存储的算法也是类似的,一年 200 billion 个推文 * 400 bytes = 80,000 GB = 80 TB。

你看,这些数据就 “形象” 得多了,在做进一步权衡和设计的时候,对于容量和性能上的需要,心里就有谱了。

当然,我们可以对上述数据做一些调整和延伸,例如,我们在设计系统容量,那么我们希望系统能够处理峰值,并且保留一定的 overhead 和 buffer,那么我们可以简单地给算得的值乘以 5 来得到一个范围上限;再比如,我们算了写操作的吞吐量,如果要考虑读操作的吞吐量,我们可以简单地给写操作的结果乘以一个倍率(比如 10)。

重要的数值

在上面的过程中,可以看到,对于软件系统来说,工程上面有一些数值是需要了解的,或者说,它们是 “常识”,或者 “基础”,从而方便地帮助我们做出合理的估算。

数据类型的空间占用

在很多系统中,Boolean 占用 1 个字节,字符占用 2 个字节,Integer/Float 是 4 个字节,Long/Double 则是 8 个字节。

时间数量级

Jeff Dean 十年前有一个著名的分享,介绍了他认为重要的系统的数值。我觉在讨论多数系统来说,有这样几个关于时间的数值(参考数量级)比较常见(注意时间单位的关系:1 秒 = 1000 毫秒 (millisecond) = 1,000,000 微秒 (microsecond) = 1,000,000,000(nanosecond)):

  • CPU 访问(包括 CPU 缓存):10 纳秒
  • 内存访问:100 纳秒
  • HDD 磁盘访问:10 毫秒,如果是 SSD 大约快 100 倍
  • HDD 磁盘吞吐量:100 MB/s,如果是 SSD 则高几倍
  • 同机房网络时延:1 毫秒
  • 异地网络时延:10 毫秒
  • 国际网络时延:100 毫秒

单机吞吐量上限

  • Web 服务器的 QPS:1000
  • RDB 单机 QPS:1000
  • NoSQL DB 磁盘单机 QPS:10K
  • 内存访问单机 QPS:1M

如果你觉得还有别的重要和常用的数值,也欢迎告诉我。

掌握这样的技巧以后,可以练习一下。比如经典的短网址应用设计,如果每年有 1 billion 的新网址被添加进来,短网址读写服务各自的吞吐量是多少?需要消耗多少存储空间?需要多少台应用服务器?

标签:200,估算,60,吞吐量,000,400,快速,技巧
From: https://www.cnblogs.com/jasonbourne3/p/18033722

相关文章

  • Accurately computing running variance —— 已知两个数列各自的均值和方差,如何快速
    原内容来自:https://www.johndcook.com/blog/standard_deviation/计算公式:该种计算方式可以只保存历史数据的平方和,与历史数据的和。相关前文:已知两个数列各自的均值和方差,如何快速求出两个数列拼合后的均值和方差......
  • 10个可优化的C#代码技巧
    在编写C#代码时,优化代码不仅可以提高程序的性能,还可以使代码更加清晰、易于维护和扩展。下面将介绍10个可优化的C#代码技巧,帮助你编写出更高效、更优雅的代码。1.使用值类型而非引用类型当定义一个变量时,如果可能的话,尽量使用值类型(如int、double、struct等)而非引用类型(如class......
  • 已知两个数列各自的均值和方差,如何快速求出两个数列拼合后的均值和方差
    问题:数列A为[1,2,3,4,5,6,7,8,9],已知数列A的均值和方差和个数为mean_x,var_x,size_x数列B为[20,21,22,23,24,25,26,27,28,29],已知数列B的均值和方差和个数为mean_y,var_y,size_y现在将数列A与数列B拼合为数列Z,则数列Z为[1,2,3,4,5,6,7,8,9,20,......
  • 20个改善编码的Python异常处理技巧,让你的代码更高效
    异常处理是写好代码的一个重要的方面,虽然许多开发人员都熟悉基本的try-except块,但是有很多更深入的知识可以使异常处理更高效、更可读和更python化。所以本文将介绍关于Python异常的20个可以显著改善编码的Python异常处理技巧,这些技巧可以让你熟练的掌握Python的异常处理。Python......
  • ts快速了解
    基础类型数字类型letnum1:number=100;letnum2:number=0b100;//2进制letnum3:number=0o100;//8进制letnum4:number=0x100;//16进制letnum5:number=100.88;//小数也是数字类型//类型定义好以后,不可以错误赋值//num5='abc'console.......
  • 排序算法汇总:希尔、快速、堆、归并
    排序思想分类比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。(大部分排序算法)非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序(计数......
  • 探索数据宝藏:填写《全国数据资源调查》的乐趣与技巧
    2月19日,国家数据局等四部门发布关于开展全国数据资源调查的通知。通知提出,为贯彻落实《数字中国建设整体布局规划》工作部署,摸清数据资源底数,加快数据资源开发利用,更好发挥数据要素价值,国家数据局、中央网信办、工业和信息化部、公安部联合开展全国数据资源情况调查,调研各单位数据......
  • Python数据结构与算法05——快速排序
    快速排序:递归defquick_sort(aimlist,first,last):#打印当前排序状态print(aimlist)#如果子列表只有一个元素或没有元素,直接返回iffirst>=last:return#初始化低位、高位和中间值low=firstheigh=lastmid=aimli......
  • 小狗XGO的快速移动之旅
    故事名称:小狗XGO的快速移动之旅故事背景:在一个遥远的星球上,有一个叫XGO的四足仿生狗机器人,它具有聪明的大脑和灵活的四肢。XGO的主人,一个叫小明的男孩,希望XGO能跑得更快,所以他决定学习如何设置XGO舵机的速度。故事分页PPT:1.封面页标题:小狗XGO的快速移动之旅图片:XGO机器狗的插图2.......
  • Scopus-快速下载学者全部文献至Endnote
    scopus网址(中文):https://www.scopus.com/search/form.uri?display=authorLookup#authorscopus网址(英文):https://blog.scopus.com/进入作者主页,下拉找到【全部导出】.ris格式导入Endnote即可特别感谢:快速下载一个学者所有文章-淼淼兮予怀 -博客园 https://www.cnbl......