跳至主要內容

2. 粗略估算


2. 粗略估算

在系统设计面试中,有时会被要求估算性能要求或系统容量,这些通常是通过思维实验和常见的性能数据进行估算的。(by Jeff Dean - Google 资深工程师)

要有效地进行这种估算,有一些机制是我们需要了解的。

二的幂

数据量可能非常庞大,但计算归结为基础的数学。

为了进行精确计算,您需要了解二的幂,它与给定的数据单位对应:

  • 2^10 == ~1000 == 1kb
  • 2^20 == ~1 百万 == 1mb
  • 2^30 == ~10 亿 == 1gb
  • 2^40 == ~1 万亿 == 1tb
  • 2^50 == ~1 千万亿 == 1pb

每个程序员应了解的延迟数值

有一个广为人知的表格,列出了典型计算机操作的持续时间,由 Jeff Dean 创建。

由于硬件的改进,这些数值可能略显过时,但它们仍然提供了操作之间的相对度量:

  • L1 缓存访问 == 0.5ns
  • 分支预测错误 == 5ns
  • L2 缓存访问 == 7ns
  • 互斥锁的锁定/解锁 == 100ns
  • 主内存访问 == 100ns
  • 压缩 1kb == 10,000ns == 10 微秒
  • 通过 1gbps 网络发送 2kb == 20,000ns == 20 微秒
  • 从内存中顺序读取 1mb == 250 微秒
  • 同一数据中心的往返 == 500 微秒
  • 硬盘寻址 == 10 毫秒
  • 从网络顺序读取 1mb == 10 毫秒
  • 从硬盘顺序读取 1mb == 30 毫秒
  • 从加利福尼亚发送数据包到荷兰再返回加利福尼亚 == 150 毫秒

一个很好的可视化图:

latency-numbers-visu
latency-numbers-visu

从上述数值中可以得出一些结论:

  • 内存很快,硬盘很慢
  • 如果可能,避免硬盘寻址
  • 压缩通常很快
  • 如果可能,发送数据前先压缩
  • 数据中心的往返延迟较贵

可用性数值

高可用性 == 系统持续可操作的能力。换句话说,就是最小化停机时间。

通常,服务的可用性目标在 99%到 100%之间。

SLA(服务水平协议)是服务提供商和客户之间的正式协议。它正式定义了您的服务需要支持的正常运行时间水平。

云服务提供商通常将其正常运行时间定为 99.9%或更高。例如,AWS EC2 的 SLA 为 99.99%。

以下是不同 SLA 下允许的停机时间总结:

sla-chart
sla-chart

示例 - 估算 Twitter 的 QPS 和存储需求

假设:

  • 3 亿月活跃用户(MAU)
  • 50%的用户每天使用 Twitter
  • 用户平均每天发布 2 条推文
  • 10%的推文包含媒体
  • 数据存储 5 年

估算:

  • 写入请求每秒(RPS)估算:
    • (150 百万 * 2) / (24 小时 * 60 分钟 * 60 秒) = 每秒 3400-3600 条推文
    • 峰值=7000TPS
  • 媒体存储量估算:
    • 每天媒体文件存储量 300 百万 * 10% == 30 百万
    • 如果假设每个媒体文件为 1MB -> 30 百万 * 1MB = 每天 30TB
    • 5 年后 -> 30TB * 365 * 5 == 55PB
  • 推文存储估算:
    • 1 条推文:64 字节 ID + 140 字节文本 + 1000 字节元数据 == 1MB
    • 每天写入推文:3500 * 60 * 60 * 24 = 302MB
    • 5 年后 -> 302MB * 365 * 5 == 551GB

提示

粗略估算关注的是过程,而非结果。面试官可能会测试你的问题解决能力。

一些提示供您参考:

  • 四舍五入和近似——不要试图计算 99987/9.1,而是四舍五入为 100000/10,这样更容易计算。
  • 在进行估算之前,先写下您的假设
  • 明确标记单位,写作 5MB,而不是仅写 5。
  • 常见的估算问题——QPS(每秒查询次数)、峰值 QPS、存储、缓存、服务器数量。