延迟 vs 吞吐量
相关源文件
本页解释了延迟与吞吐量之间的根本区别——这是系统设计中两个关键的性能指标。理解这些概念对于构建可扩展、高效且能够在高负载下保持响应能力的系统至关重要。
有关一般性能和可伸缩性概念的信息,请参阅性能与可伸缩性。
核心概念
延迟是指执行一个动作或产生一个结果所需的时间。它衡量了一个操作从开始到结束所需完成的时间。
吞吐量是指单位时间内可以处理的此类动作或结果的数量。它衡量了系统的处理能力。
来源:README.md426-436
理解延迟
延迟表示发起请求到接收响应之间的时间。它通常以毫秒(ms)或微秒(μs)等时间单位衡量。
延迟可视化
来源:README.md426-429
常见的延迟类型
- 网络延迟:数据包从源到目的地所需的时间
- 磁盘延迟:读取或写入数据到存储设备所需的时间
- 内存延迟:从内存读取或写入内存所需的时间
- 进程延迟:计算或处理所需的时间
影响延迟的关键因素
- 组件之间的物理距离
- 网络拥塞
- 服务器负载
- 资源争用
- 硬件限制
- 低效算法
- I/O 操作
- 排队时间
来源:README.md426-429 README.md1552-1575
理解吞吐量
吞吐量衡量了系统在给定时间范围内可以执行多少工作。它通常表示为每秒操作数、每秒请求数(RPS)或数据传输速率(例如,MB/s)。
吞吐量可视化
来源:README.md430-432
影响吞吐量的关键因素
- 可用处理能力(CPU)
- 内存带宽
- 网络带宽
- I/O 容量
- 并行性和并发性
- 系统架构
- 资源分配
- 负载均衡效率
延迟与吞吐量的关系
延迟和吞吐量是相关但又不同的概念。一个系统可能具有
- 低延迟但低吞吐量(快速处理请求但无法处理大量请求)
- 高吞吐量但高延迟(处理大量请求但每个请求耗时较长)
- 低延迟和高吞吐量(理想情况)
- 高延迟和低吞吐量(最差情况)
关系可视化
来源:README.md432-436
优化策略
正如系统设计入门中所述:“通常,您应该以最大吞吐量和可接受的延迟为目标。”
权衡取舍
- 缓存:减少延迟,但可能在缓存未命中时略微影响吞吐量
- 负载均衡:通过分配工作提高吞吐量,可能会增加轻微的延迟开销
- 异步处理:可以提高吞吐量,但会增加单个操作的延迟
- 连接池:减少连接建立延迟,同时提高吞吐量
- 批处理:增加吞吐量,但可能会增加批处理中单个项目的延迟
延迟参考值
了解典型的延迟值对于系统设计至关重要。下表列出了每个程序员都应该知道的关键延迟数据
| 操作 | 延迟 | 相对比较 |
|---|
| L1 缓存引用 | 0.5 ns | - |
| 分支预测错误 | 5 ns | - |
| L2 缓存引用 | 7 ns | L1 缓存的 14 倍 |
| 互斥锁/解锁 | 25 ns | - |
| 主内存引用 | 100 ns | L2 缓存的 20 倍,L1 缓存的 200 倍 |
| 使用 Zippy 压缩 1K 字节 | 10,000 ns (10 μs) | - |
| 通过 1 Gbps 网络发送 1 KB | 10,000 ns (10 μs) | - |
| 从 SSD 随机读取 4 KB | 150,000 ns (150 μs) | ~1GB/秒 SSD |
| 从内存顺序读取 1 MB | 250,000 ns (250 μs) | - |
| 同一数据中心内往返 | 500,000 ns (500 μs) | - |
| 从 SSD 顺序读取 1 MB | 1,000,000 ns (1 ms) | ~1GB/秒 SSD,内存的 4 倍 |
| 磁盘寻道 | 10,000,000 ns (10 ms) | 数据中心往返的 20 倍 |
| 从磁盘顺序读取 1 MB | 30,000,000 ns (30 ms) | 内存的 120 倍,SSD 的 30 倍 |
| 发送数据包 CA->荷兰->CA | 150,000,000 ns (150 ms) | - |
备注
- 1 ns = 10^-9 秒
- 1 μs = 10^-6 秒 = 1,000 ns
- 1 ms = 10^-3 秒 = 1,000 μs = 1,000,000 ns
来源:README.md1552-1575
测量与监控
延迟指标
- 平均延迟:所有延迟的总和除以操作数量
- 中位数 (p50):延迟分布中的中间值
- 百分位数 (p95, p99, p99.9):低于此值的延迟涵盖了特定百分比的请求
- 最大延迟:观察到的最差情况延迟
吞吐量指标
- 每秒请求数 (RPS):每秒处理的请求数量
- 每秒查询数 (QPS):每秒执行的查询数量
- 每秒事务数 (TPS):每秒完成的事务数量
- 带宽:每秒传输的数据量(例如,MB/s)
实际应用
Web 服务示例
优化示例
- 数据库查询优化:提高查询性能可减少延迟
- 连接池:重用数据库连接可提高吞吐量
- 缓存:存储常用数据可减少延迟并提高吞吐量
- 负载均衡:将负载分配到多台服务器可提高吞吐量
- 内容分发网络 (CDNs):将内容放置在离用户更近的位置可减少延迟
最佳实践
- 设定明确的 SLA:定义可接受的延迟阈值和吞吐量要求
- 测量这两个指标:在生产环境中同时监控延迟和吞吐量
- 关注百分位数:关注尾部延迟(p95, p99),而不仅仅是平均值
- 进行负载测试:执行负载测试以了解系统在大规模情况下的行为
- 考虑成本效益:针对提供最大业务价值的指标进行优化
- 理解瓶颈:识别并解决限制性能的组件
结论
延迟和吞吐量是系统设计中影响用户体验和系统容量的基础指标。虽然它们相互关联,但一个指标的改进不一定会导致另一个指标的改进。最佳方法是在特定用例中,以最大吞吐量为目标,同时保持可接受的延迟水平。
理解这些指标及其权衡取舍使工程师能够设计出更高效、更可扩展的系统,从而满足性能和容量要求。
来源:README.md426-436 README.md1552-1575