跳转到内容

带宽时延积 (BDP)

BDP 是为 Aeron 传输层进行容量规划时最重要的单一数值。算对了,管道就能持续满载;算错了,要么吞吐受限,要么尾延迟膨胀。

请结合调优概览参数参考一起阅读。

BDP 是在任意给定时刻可以”在链路上传输中”的最大数据量。

Bytes in Flight = Bandwidth × Round Trip Latency
带宽RTT在途字节数
10 Gbit/s100 µs (同 AZ)0.125 Mbit
10 Gbit/s1 ms (跨 AZ)1.25 Mbit

BDP 告诉你在任意给定时刻可以”在链路上传输中”的最大数据量。它源自利特尔法则 (Little’s Law,L = λW):

  • L — 系统中的项目数量(在途字节数)
  • λ — 到达率(带宽)
  • W — 在系统中停留的时间(往返时延)

关于 Aeron 的流控和 term buffer 实际如何搬运这些字节,请参阅 The Aeron Files。本页专注于容量规划。

缓冲区应大于 BDP,但不要远超它。

权衡关系一目了然:

  • 过小(低于 BDP)会浪费带宽。发送方必须等待 ACK 才能继续发送,因此吞吐量下降。
  • 过大则有缓冲膨胀 (bufferbloat) 的风险。过深的队列会抬高 p99 并增加尾延迟。
  • 大小适中(接近 BDP 并留有余量)既能让管道保持满载,又能让 p50p99 保持稳定。

这里的每一个决策都由两组关系驱动。

恒定 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 随 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_LENGTHFrameDescriptor.FRAME_ALIGNMENT)。SBE 编码长度 = 8 字节 SBE 消息头 + 你的字段 (定长块 + 变长数据)。

示例——两个集群节点之间的订单录入流:

步骤计算结果
SBE 编码长度8 字节 SBE 头 + 88 字节订单字段96 B
每条消息在线大小align32(32 + 96)128 B
500k TPS 下的带宽128 B × 500,000/s64 MB/s(约 0.5 Gbps)
BDP,同 AZ(RTT 100 µs)64 MB/s × 0.0001 s6.4 KB
BDP,跨 AZ(RTT 1 ms)64 MB/s × 0.001 s64 KB
BDP,跨区域(RTT 50 ms)64 MB/s × 0.05 s3.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 字节帧头会摊薄到 整批上,因此上面按未攒批计算的结果偏保守——用于容量规划是安全的。若消息携带较大的变长字段, 请用 实测 的平均编码长度,而不是定长块长度。

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