跳转到内容

微突发基准测试

大多数 Aeron 基准测试衡量的是稳态吞吐量:在持续周期内以恒定 N 条消息/秒的速率发送。这种模型对容量规划有用,但它完全忽略了生产环境中真正触发告警的故障模式——微突发(micro-burst)

微突发是一段短暂的流量尖峰,速率远高于平均值,通常持续 1–5 ms。在撮合引擎场景中,这是常态而非例外:

  • 一个行情 tick 在 < 1 ms 内触发 50K 条订单更新
  • 一次成交级联同时在多个 ME shard 中传播
  • 故障恢复回放以线速倾倒缓冲事件

系统能应对平均速率。让缓冲区溢出并制造延迟尖峰的,是瞬时峰值速率——衡量单位是每毫秒消息数(msg/ms)

指标稳态基准生产实际
速率400K msg/s(均匀)0 → 50K / 1 ms,然后空闲
缓冲压力平滑,从不尖峰8.5 MB 在 < 1 ms 内到达
p99看起来很好每秒一次 20 ms 尖峰
UDP 丢包数十万次

稳态 400K msg/s 基准将数据包均匀分布——约 400 条/ms。但生产突发在 1 ms 内投递 50K 条——瞬时速率高出 125 倍。这就是致命差距。

微突发基准测试的首要指标:

Peak msg/ms = 任意 1 ms 窗口内投递的最大消息数

它决定了缓冲链条各层的最低深度——低于此值就会丢包。

给定 peak msg/ms = P,消息大小 = S 字节:

缓冲层最低大小
ENA RX ringP × 需要扛过的毫秒数 条
SO_RCVBUF(内核 socket 缓冲)P × S × burst_duration_ms
Aeron flow-control window≥ P × S × RTT_ms
Term buffer≥ 2 × P × S × max_stall_ms

如果这条链中任何一层对峰值速率欠配,数据包就会丢失,NAK 恢复会在尾延迟中增加 10–20 ms。

不要使用恒定速率发送器。模拟生产突发模式:

// 微突发模型:以线速发送 BURST_SIZE 条消息,
// 然后休眠 INTERVAL_MS 再进行下一轮突发。
final int BURST_SIZE = 50_000; // 每次突发的消息数
final int INTERVAL_MS = 1_000; // 每秒一次突发(最坏情况)
final int MESSAGE_LENGTH = 170; // 字节
while (running) {
// 突发阶段:以线速发送(无节流)
for (int i = 0; i < BURST_SIZE; i++) {
BUFFER.putLong(0, sequence++);
BUFFER.putLong(8, getNowUs());
while (publication.offer(BUFFER, 0, MESSAGE_LENGTH) < 0) {
idleStrategy.idle();
}
}
// 空闲阶段:模拟突发间隔
LockSupport.parkNanos(INTERVAL_MS * 1_000_000L);
}

在接收端测量:

  • 突发吸收时间 —— 突发中第一条到最后一条消息的耗时
  • 最大瞬时速率 —— 滑动 1 ms 窗口内的消息计数
  • UDP 缓冲错误 —— netstat -su | grep "receive buffer errors" 必须不增长
  • 延迟分布 —— 记录每条消息的 nowUs - sendTimeUs
Terminal window
# 运行期间监控(必须保持不变):
watch -n1 "netstat -su | grep 'receive buffer errors'"
参数范围目的
突发大小10K – 200K找到溢出阈值
消息大小88 – 1400 字节更大消息更快溢出
发送方数量1 – 8同时突发叠加
ENA RX ring1024 – 16384找到安全最小值
SO_RCVBUF / rmem_max208KB – 256MB验证内核封顶效应
aeron.rcv.initial.window.length128KB – 32MB流控窗口

突发配置通过条件:

  • 整个运行期间 UDP 缓冲错误为零
  • p99 延迟 < 1 ms(无 NAK 驱动的尖峰)
  • 无 Aeron loss-gap-fill 或 flow-control back-pressure 事件

突发配置失败条件:

  • UDP 缓冲错误持续增长(缓冲溢出)
  • 出现周期性延迟尖峰(NAK 恢复)
  • ethtool -S 显示 rx_queue_N_rx_drops > 0

来自生产撮合引擎工作负载:

  • 8 发送方 × 50K msg/s(平均总计 400K)
  • 突发模式:每个发送方在 ~1 ms 内投递其 50K 条消息,然后空闲
  • 瞬时峰值:每个发送方 50K msg/ms
  • 消息大小:170 字节

默认 rmem_max(208KB)下:50K × 170B = 8.5 MB 在 1 ms 内到达。208KB socket 缓冲瞬间溢出 → 每秒一次 20 ms NAK 恢复尖峰。

设置 rmem_max = 128MB 后:内核缓冲吸收全部突发,零丢包,p99 < 200 µs。

缓冲容量计算器 针对最坏突发场景计算缓冲大小。将你的峰值突发速率作为 TPS 输入(不是平均值),停顿余量设为突发持续时间。计算器将输出零丢包运行所需的最小缓冲链配置。

稳态基准微突发基准
首要指标持续 msg/s峰值 msg/ms
测试的故障模式吞吐饱和缓冲溢出
生产相关性容量规划延迟尾部
关键参数Term buffer、windowSO_RCVBUF、rmem_max、ENA ring