跳转到内容

分步调优方法论

不要一次性把所有参数都调一遍。要让 Aeron Transport 达到良好调优状态,最快的路径是增量式的:从合理的默认值出发,逐步加压,观察哪个指标最先劣化,然后只拧动那一个能对症的旋钮。

本页讲的是工作流。至于每个旋钮背后的 原理 —— 窗口、term、NAK 的内部机制 —— 请参阅 The Aeron Files

  1. 从合理的默认值开始。
  2. 验证你的消息大小。
  3. 增量式负载测试。
  4. 基于症状调优。
  5. 应用 L3 缓存大小法则。

从原厂设置出发。克制提前优化的冲动。

  • 128K 初始窗口大小。
  • 默认 term buffer 大小。
  • 确保操作系统 / ENA driver 的发送与接收缓冲区相匹配。

Aeron 缓冲区与底层操作系统或 ENA driver 缓冲区不匹配,是吞吐悄无声息流失的常见根源。在改动其他任何东西之前,先把它们对齐。

让每条消息都 小于 MTU(通常为 1500 字节)。

你不需要应用层批处理。Aeron Transport 已经替你做了智能批处理(smart batching)—— 在其之上再加一层自己的批处理,通常弊大于利。

小负载 起步,持续往上加压。

边加压边监控,直到出现第一个压力信号:

  • 端到端延迟攀升。
  • p99 延迟攀升。
  • 出现 NAK(negative acknowledgment,否定确认)。

最先 劣化的那个指标,会告诉你下一步该去拧哪个旋钮。这正是缓慢加压的全部意义所在 —— 它能隔离出瓶颈。

把症状对应到行动。每次只改一处,然后重新测试。

症状行动
p50 延迟上升调整初始窗口大小与 send/recv 缓冲区
p99 延迟上升调整 NAK 延迟与 term buffer 大小

把这张表当作诊断手册来读。p50 上升指向稳态流控 —— 窗口与操作系统缓冲区。p99 上升指向尾部事件 —— 恢复行为(NAK 延迟)以及 term buffer 能容纳多少在途数据。吞吐随之而来:一旦 p50 与 p99 在负载下保持稳定,就把负载再往上推,然后重复。

这是关键的护栏。

这样能确保活跃的 term 加上其余工作集数据全都装进 L3,避免在热路径上溢出到 DRAM。而 DRAM 溢出正是摧毁 p99 的元凶。

举个实例:如果你的 L3 是 36 MB,就把 term buffer 控制在 ≤ 12 MB。剩下的缓存为其他热点数据 —— 连接状态、应用对象 —— 留出常驻空间。

这套方法论刻意采用增量式。从默认值起步,加压,观察哪个指标最先劣化,然后调整对应的参数 —— 并且在整个过程中绝不违反 1/3 L3 法则。

如需深入了解任一旋钮的机制,请参阅 The Aeron Files