分步调优方法论
不要一次性把所有参数都调一遍。要让 Aeron Transport 达到良好调优状态,最快的路径是增量式的:从合理的默认值出发,逐步加压,观察哪个指标最先劣化,然后只拧动那一个能对症的旋钮。
本页讲的是工作流。至于每个旋钮背后的 原理 —— 窗口、term、NAK 的内部机制 —— 请参阅 The Aeron Files。
五个步骤一览
Section titled “五个步骤一览”- 从合理的默认值开始。
- 验证你的消息大小。
- 增量式负载测试。
- 基于症状调优。
- 应用 L3 缓存大小法则。
第 1 步:从合理的默认值开始
Section titled “第 1 步:从合理的默认值开始”从原厂设置出发。克制提前优化的冲动。
- 128K 初始窗口大小。
- 默认 term buffer 大小。
- 确保操作系统 / ENA driver 的发送与接收缓冲区相匹配。
Aeron 缓冲区与底层操作系统或 ENA driver 缓冲区不匹配,是吞吐悄无声息流失的常见根源。在改动其他任何东西之前,先把它们对齐。
第 2 步:验证消息大小
Section titled “第 2 步:验证消息大小”让每条消息都 小于 MTU(通常为 1500 字节)。
你不需要应用层批处理。Aeron Transport 已经替你做了智能批处理(smart batching)—— 在其之上再加一层自己的批处理,通常弊大于利。
第 3 步:增量式负载测试
Section titled “第 3 步:增量式负载测试”从 小负载 起步,持续往上加压。
边加压边监控,直到出现第一个压力信号:
- 端到端延迟攀升。
- p99 延迟攀升。
- 出现 NAK(negative acknowledgment,否定确认)。
最先 劣化的那个指标,会告诉你下一步该去拧哪个旋钮。这正是缓慢加压的全部意义所在 —— 它能隔离出瓶颈。
第 4 步:基于症状调优
Section titled “第 4 步:基于症状调优”把症状对应到行动。每次只改一处,然后重新测试。
| 症状 | 行动 |
|---|---|
| p50 延迟上升 | 调整初始窗口大小与 send/recv 缓冲区 |
| p99 延迟上升 | 调整 NAK 延迟与 term buffer 大小 |
把这张表当作诊断手册来读。p50 上升指向稳态流控 —— 窗口与操作系统缓冲区。p99 上升指向尾部事件 —— 恢复行为(NAK 延迟)以及 term buffer 能容纳多少在途数据。吞吐随之而来:一旦 p50 与 p99 在负载下保持稳定,就把负载再往上推,然后重复。
第 5 步:L3 缓存大小法则
Section titled “第 5 步:L3 缓存大小法则”这是关键的护栏。
这样能确保活跃的 term 加上其余工作集数据全都装进 L3,避免在热路径上溢出到 DRAM。而 DRAM 溢出正是摧毁 p99 的元凶。
举个实例:如果你的 L3 是 36 MB,就把 term buffer 控制在 ≤ 12 MB。剩下的缓存为其他热点数据 —— 连接状态、应用对象 —— 留出常驻空间。
这套方法论刻意采用增量式。从默认值起步,加压,观察哪个指标最先劣化,然后调整对应的参数 —— 并且在整个过程中绝不违反 1/3 L3 法则。
如需深入了解任一旋钮的机制,请参阅 The Aeron Files。