> For the complete documentation index, see [llms.txt](https://learning-guide.gitbook.io/system-design-interview/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://learning-guide.gitbook.io/system-design-interview/xi-tong-she-ji-mian-shi-nei-mu-zhi-nan-di-yi-juan/chapter-02-back-of-the-envelope-estimation.md).

# 第02章：粗略估算

在系统设计面试中，有时会要求你使用粗略估算来估计系统的容量或性能需求。根据谷歌高级研究员杰夫·迪恩（Jeff Dean）的说法，“粗略估算是使用一系列思维实验和常见性能数据的组合进行估算，以便对哪种设计能够满足你的要求有一个良好的了解” \[1]。

要有效地进行粗略估算，你需要对可扩展性基础知识有很好的了解。以下概念应该被深入理解：二的幂 \[2]、每个程序员都应该知道的延迟数字和可用性数字。

### 2的幂次方

尽管在处理分布式系统时数据量可能变得非常庞大，但所有计算归结为基础知识。为了获得正确的计算结果，了解使用二的幂的数据量单位至关重要。一个字节是8个位的序列。一个 ASCII 字符使用一个字节的内存（8位）。下面是解释数据量单位的表格（表2-1）。

![](/files/GZNkOFvrOB3X3zFJiOP6)

### 每个程序员都应该了解的延迟数据

Google 的 Dean 博士在2010年透露了典型计算机操作的时间\[1]。 随着计算机变得更快更强大，一些数字已经过时。然而，这些数字仍然应该能够让我们了解不同计算机操作的速度和慢速。

![](/files/uedgryZ5R2SHAeNA3JEi)

### 注意事项

ns = 纳秒, μs = 微秒, ms = 毫秒

$$1 \space ns = 10^{-9} \space 秒$$

$$1 \space \mu s= 10^{-6} \space 秒 = 1,000 \space ns$$

$$1 \space ms = 10^{-3} \space 秒 = 1,000 \space \mu s = 1,000,000 \space ns$$

一位谷歌软件工程师构建了一个工具来可视化 Dean 博士的数据。该工具还考虑了时间因素。 图2-1显示了截至2020年的可视化延迟数字（图源：参考资料\[3]）。

![figure2-1.png](/files/rVQ84YyYlkgOXNkL8bsQ)

通过分析图2-1中的数字，我们得出以下结论：

* 内存速度快，但磁盘速度慢。
* 如果可能的话，应避免磁盘寻道。
* 简单的压缩算法速度快。
* 在发送数据到互联网之前，尽可能对数据进行压缩。
* 数据中心通常位于不同的区域，发送数据之间需要一定的时间。

### 可用性数据

高可用性是系统持续运行的能力，期望能够长时间保持操作。 高可用性通常以百分比表示，100%意味着服务没有任何停机时间。大多数服务的可用性介于99%到100%之间。

服务水平协议（SLA）是服务提供商常用的术语。这是你（服务提供商）与你的客户之间的协议，该协议正式定义了你的服务将提供的运行时间水平。 云服务提供商 Amazon、Google 和 Microsoft 将它们的 SLA 设置在99.9%或更高。系统的运行时间传统上以数字的形式进行测量。 数字越多，表示系统的运行时间越长。 如表2-3所示，数字数量与预期系统停机时间相关。

![img.png](/files/bxvtFvMXqqZhAG3PvDUf)

### 示例：估算 Twitter 的查询量和存储需求

请注意，以下数字仅用于本练习，不是 Twitter 的真实数据。

假设：

* 每月活跃用户为3亿。
* 50%的用户每天使用 Twitter。
* 用户平均每天发布2条推文。
* 10%的推文包含媒体。
* 数据存储时间为5年。

估算： 查询每秒次数（QPS）估计：

* 每日活跃用户（DAU）= 3亿 \* 50% = 1.5亿
* 推文 QPS = 1.5亿 \* 2推文 / 24小时 / 3600秒 = 约 3500
* 峰值 QPS = 2 \* QPS = 约 7000

(译者注：这里更准确地说应该估算的 TPS，而不是 QPS。仅个人观点，原文翻译还是保持原作者意思为 QPS。)

我们这里只会估算媒体存储。

* 平均推文大小：
  * 推文 ID 64 bytes（字节）
  * 文本 140 bytes（字节）
  * 媒体 1MB
* 媒体存储：1.5亿 \* 2 \* 10% \* 1MB = 每天 30TB
* 5年媒体存储：30TB \* 365 \* 5 = 约 55PB

### 小贴士

粗略估计更注重过程而非结果。 解决问题比得到准确结果更为重要。 面试官可能会测试你的解决问题的能力。 以下是一些建议：

* 四舍五入和近似值。在面试中进行复杂的数学运算是困难的。例如，“99987 / 9.1”的结果是多少？没有必要花费宝贵的时间来解决复杂的数学问题。精确度并不是必需的。使用整数和近似值来简化问题。例如，“100,000 / 10”。
* 记下你的假设。写下你的假设是个好主意，以便以后参考。
* 标记你的单位。当你写下“5”时，它是指5 KB 还是5 MB？这可能会让你感到困惑。写下单位，因为“5 MB”有助于消除歧义。
* 常见的粗略估计问题包括：QPS、峰值 QPS、存储、缓存、服务器数量等。在准备面试时，你可以练习这些计算。熟能生巧。

祝贺你已经走到这一步！现在，给自己一个鼓励。干得漂亮！

#### 参考资料

\[1] J. Dean. Google 专业提示：使用粗略估计来选择最佳设计： <http://highscalability.com/blog/2011/1/26/google-pro-tip-use-back-of-the-envelope-calculations-to-choo.html>

\[2] 系统设计入门指南：<https://github.com/donnemartin/system-design-primer>

\[3] 每个程序员都应该知道的延迟数据：<https://colin-scott.github.io/personal_website/research/interactive_latency.html>

\[4] 亚马逊计算服务等级协议：<https://aws.amazon.com/compute/sla/>

\[5] 计算引擎服务等级协议（SLA）：<https://cloud.google.com/compute/sla>

\[6] Azure 服务的 SLA 摘要：<https://azure.microsoft.com/en-us/support/legal/sla/summary/>
