带宽时延积 (BDP)
BDP 是为 Aeron 传输层进行容量规划时最重要的单一数值。算对了,管道就能持续满载;算错了,要么吞吐受限,要么尾延迟膨胀。
BDP 是在任意给定时刻可以”在链路上传输中”的最大数据量。
Bytes in Flight = Bandwidth × Round Trip Latency| 带宽 | RTT | 在途字节数 |
|---|---|---|
| 10 Gbit/s | 100 µs (同 AZ) | 0.125 Mbit |
| 10 Gbit/s | 1 ms (跨 AZ) | 1.25 Mbit |
为什么这对 Aeron 至关重要
Section titled “为什么这对 Aeron 至关重要”BDP 告诉你在任意给定时刻可以”在链路上传输中”的最大数据量。它源自利特尔法则 (Little’s Law,L = λW):
- L — 系统中的项目数量(在途字节数)
- λ — 到达率(带宽)
- W — 在系统中停留的时间(往返时延)
关于 Aeron 的流控和 term buffer 实际如何搬运这些字节,请参阅 The Aeron Files。本页专注于容量规划。
缓冲区容量规划经验法则
Section titled “缓冲区容量规划经验法则”缓冲区应大于 BDP,但不要远超它。
权衡关系一目了然:
- 过小(低于 BDP)会浪费带宽。发送方必须等待 ACK 才能继续发送,因此吞吐量下降。
- 过大则有缓冲膨胀 (bufferbloat) 的风险。过深的队列会抬高 p99 并增加尾延迟。
- 大小适中(接近 BDP 并留有余量)既能让管道保持满载,又能让 p50 和 p99 保持稳定。
BDP 的影响
Section titled “BDP 的影响”这里的每一个决策都由两组关系驱动。
恒定 TPS 下缓冲区大小与 RTT 的关系
Section titled “恒定 TPS 下缓冲区大小与 RTT 的关系”Buffer Size ↑ │ ╱ Cross Region │ ╱ │ ╱ Cross AZ │ ╱ │ ╱ Same AZ │ ╱ │╱ CPG (Cluster Placement Group) └──────────────────→ RTT随着 RTT 增大(CPG → 同 AZ → 跨 AZ → 跨区域),为维持相同吞吐量所需的最小缓冲区大小随 RTT 线性增长。
恒定缓冲区大小下的 TPS
Section titled “恒定缓冲区大小下的 TPS”在缓冲区大小固定的情况下,TPS 随 RTT 增大而下降 — 因为管道无法保持满载。
算例:由 SBE 消息大小、TPS 与 RTT 计算 BDP
Section titled “算例:由 SBE 消息大小、TPS 与 RTT 计算 BDP”下文的表格按 链路 带宽取值——那是上界。但你通常掌握的是 业务负载:SBE 编码后的消息大小 和目标 TPS。先把它们换算成带宽,再套 BDP 公式:
每条消息在线字节数 = align32( 32 字节 Aeron 数据帧头 + SBE 编码长度 )带宽 λ = TPS × 每条消息在线字节数BDP = λ × RTT窗口 = 2–4 × BDP (且永远不低于 128KB 默认值)32 字节帧头与 32 字节帧对齐来自 Aeron 协议(DataHeaderFlyweight.HEADER_LENGTH、
FrameDescriptor.FRAME_ALIGNMENT)。SBE 编码长度 = 8 字节 SBE 消息头 + 你的字段
(定长块 + 变长数据)。
示例——两个集群节点之间的订单录入流:
| 步骤 | 计算 | 结果 |
|---|---|---|
| SBE 编码长度 | 8 字节 SBE 头 + 88 字节订单字段 | 96 B |
| 每条消息在线大小 | align32(32 + 96) | 128 B |
| 500k TPS 下的带宽 | 128 B × 500,000/s | 64 MB/s(约 0.5 Gbps) |
| BDP,同 AZ(RTT 100 µs) | 64 MB/s × 0.0001 s | 6.4 KB |
| BDP,跨 AZ(RTT 1 ms) | 64 MB/s × 0.001 s | 64 KB |
| BDP,跨区域(RTT 50 ms) | 64 MB/s × 0.05 s | 3.2 MB |
然后套用 2–4× 法则与接收路径约束:
- 同/跨 AZ: 2–4× BDP 即 128–256 KB——128KB 的默认窗口已覆盖同 AZ,跨 AZ 至多上调一档。 默认值就够用;这正是同 AZ 测试从不出问题的原因。
- 跨区域: 2–4× BDP 即 6.4–12.8 MB。这时整条链开始联动:窗口 12.8 MB ⇒ term buffer
≥ 2 × 窗口 = 25.6 MB ⇒ 向上取整为 32 MB(2 的幂)——16MB 的默认 term 不够用了。
SO_RCVBUF(以及rmem_max)也要 ≥ 窗口。
RTT 的测量:应用层数值用 Aeron 自带的样例(io.aeron.samples.Ping / Pong);
网络层下限用节点之间的 ping。
对逐条消息计算的两点修正:若你把消息攒批成 MTU 大小的帧 (smart batching),32 字节帧头会摊薄到 整批上,因此上面按未攒批计算的结果偏保守——用于容量规划是安全的。若消息携带较大的变长字段, 请用 实测 的平均编码长度,而不是定长块长度。
按部署方式所需的缓冲区
Section titled “按部署方式所需的缓冲区”BDP 定义了在给定 RTT 下实现恒定 TPS 所需的最小缓冲区大小。下表中的数值假设链路为 10 Gbps。
| 部署方式 | RTT | 所需缓冲区 (10Gbps) |
|---|---|---|
| CPG | ~5 µs | ~6 KB |
| 同 AZ | ~100 µs | ~125 KB |
| 跨 AZ | ~1 ms | ~1.25 MB |
| 跨区域 | ~50 ms | ~62.5 MB |