参数参考
一份参考:为何 每个传输参数会影响吞吐、p50 与 p99 —— 以及如何取值。 请配合调优概览一起阅读。
缓冲区与窗口大小
Section titled “缓冲区与窗口大小”| 参数 | 吞吐 | p50(中位数) | p99(尾部) | 如何取值 |
|---|---|---|---|---|
| 初始窗口大小 | 更大的窗口让更多数据在途 → 在高 BDP 链路上更好 | 过大略有负面(排队/抖动增加);大小合适时影响极小 | 窗口过大在拥塞时恶化尾部;接近 BDP 最佳 | 在 BDP 附近取值;既不要饿死管道(过小),也不要造成深队列(过大) |
| Term Buffer 大小 | 更大的 term 每轮容纳更多数据 → 更适合突发流量 | 过大的 term 因缓存未命中损害 p50 | 放不进缓存的超大 term 增加方差 | 选择能覆盖最大消息 + 预期突发、且能放进缓存的最小 term |
操作系统 Socket 缓冲区(SO_SNDBUF/SO_RCVBUF) | 几 MB 即可匹配 BDP 并防止丢包 | 缓冲区过大增加排队;2–4 MB 可保持 p50 可接受 | 过大 = 深队列;过小 = 丢包 + 重传 | 从 2–4 MB 起步,根据观测到的丢包/排队调整 |
| 网卡环形缓冲(如 AWS ENA) | 环大小匹配带宽即可实现高吞吐 | 设置正确可保持 p50 低;过深则增加 µs–ms 级排队 | 大队列在突发时放大尾部;过小则丢包 | 与操作系统 socket 缓冲区一起调,避免双重缓冲的队列膨胀 |
| 参数 | 吞吐 | p50(中位数) | p99(尾部) | 如何取值 |
|---|---|---|---|---|
| NAK 延迟 | 延迟越长越能减少重传流量,在丢包网络上略有帮助 | 除非常见丢包,否则影响很小 | 直接影响尾部:延迟越大间隙存在越久;越短恢复越快但重复更多 | 在带宽开销与间隙恢复速度之间权衡 |
这些对尾部的影响最大 —— 它们从源头上消除抖动。
| 参数 | 吞吐 | p50(中位数) | p99(尾部) | 如何取值 |
|---|---|---|---|---|
| NUMA 局部性(CPU 靠近网卡) | 消除跨 socket 流量 → 提升可达吞吐 | 减少内存访问与 PCIe 穿越成本数微秒 | 避免远端 NUMA 流量 → 显著稳定尾部 | 让 IRQ、driver 线程与应用线程都运行在网卡所在 NUMA 节点的本地核上 |
| Term Buffer 放进 L3 缓存 | 工作集驻留缓存可减少停顿 | 降低平均访问延迟 | 显著减少来自缓存未命中与 DRAM 争用的方差 | 评估活跃 term 占用 vs 有效 L3;调整 term 长度或对 stream 分片 |
| 内核旁路 | 消除系统调用开销 + 内核排队 | 消除上下文切换 → 中位数压到低个位数微秒 | 抖动减少使延迟更确定 | 最适合专用、隔离的核;需要更多运维投入 |
| 线程绑定 / 核隔离 | 防止 run-queue 争用 → 提升最大可持续吞吐 | 减少上下文切换 + 缓存抖动 | 最强杠杆之一 —— 避免邻噪效应与调度器抖动 | 隔离核并绑定 Aeron 的 agent 线程——操作指南 |
| JVM 预热(JIT Warmup) | 稳态影响极小,只有冷启动爬坡更慢 | 中等 —— 预热后的 JIT 让中位数走在已编译的快路径上 | 最强尾部杠杆之一 —— 冷代码 + 首次触碰分配会造成严重尖峰 | 上线前用代表性流量跑遍所有热路径 |