微突发基准测试
大多数 Aeron 基准测试衡量的是稳态吞吐量:在持续周期内以恒定 N 条消息/秒的速率发送。这种模型对容量规划有用,但它完全忽略了生产环境中真正触发告警的故障模式——微突发(micro-burst)。
什么是微突发?
Section titled “什么是微突发?”微突发是一段短暂的流量尖峰,速率远高于平均值,通常持续 1–5 ms。在撮合引擎场景中,这是常态而非例外:
- 一个行情 tick 在 < 1 ms 内触发 50K 条订单更新
- 一次成交级联同时在多个 ME shard 中传播
- 故障恢复回放以线速倾倒缓冲事件
系统能应对平均速率。让缓冲区溢出并制造延迟尖峰的,是瞬时峰值速率——衡量单位是每毫秒消息数(msg/ms)。
为什么稳态基准会骗人
Section titled “为什么稳态基准会骗人”| 指标 | 稳态基准 | 生产实际 |
|---|---|---|
| 速率 | 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 倍。这就是致命差距。
核心指标:每毫秒峰值消息数
Section titled “核心指标:每毫秒峰值消息数”微突发基准测试的首要指标:
Peak msg/ms = 任意 1 ms 窗口内投递的最大消息数
它决定了缓冲链条各层的最低深度——低于此值就会丢包。
给定 peak msg/ms = P,消息大小 = S 字节:
| 缓冲层 | 最低大小 |
|---|---|
| ENA RX ring | P × 需要扛过的毫秒数 条 |
| 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。
设计微突发基准
Section titled “设计微突发基准”1. 发送模型
Section titled “1. 发送模型”不要使用恒定速率发送器。模拟生产突发模式:
// 微突发模型:以线速发送 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);}2. 接收端测量
Section titled “2. 接收端测量”在接收端测量:
- 突发吸收时间 —— 突发中第一条到最后一条消息的耗时
- 最大瞬时速率 —— 滑动 1 ms 窗口内的消息计数
- UDP 缓冲错误 ——
netstat -su | grep "receive buffer errors"必须不增长 - 延迟分布 —— 记录每条消息的
nowUs - sendTimeUs
# 运行期间监控(必须保持不变):watch -n1 "netstat -su | grep 'receive buffer errors'"3. 变量矩阵
Section titled “3. 变量矩阵”| 参数 | 范围 | 目的 |
|---|---|---|
| 突发大小 | 10K – 200K | 找到溢出阈值 |
| 消息大小 | 88 – 1400 字节 | 更大消息更快溢出 |
| 发送方数量 | 1 – 8 | 同时突发叠加 |
| ENA RX ring | 1024 – 16384 | 找到安全最小值 |
| SO_RCVBUF / rmem_max | 208KB – 256MB | 验证内核封顶效应 |
| aeron.rcv.initial.window.length | 128KB – 32MB | 流控窗口 |
4. 通过/失败判定
Section titled “4. 通过/失败判定”突发配置通过条件:
- 整个运行期间 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。
与缓冲计算器的关系
Section titled “与缓冲计算器的关系”缓冲容量计算器 针对最坏突发场景计算缓冲大小。将你的峰值突发速率作为 TPS 输入(不是平均值),停顿余量设为突发持续时间。计算器将输出零丢包运行所需的最小缓冲链配置。
| 稳态基准 | 微突发基准 | |
|---|---|---|
| 首要指标 | 持续 msg/s | 峰值 msg/ms |
| 测试的故障模式 | 吞吐饱和 | 缓冲溢出 |
| 生产相关性 | 容量规划 | 延迟尾部 |
| 关键参数 | Term buffer、window | SO_RCVBUF、rmem_max、ENA ring |
本站与 Adaptive Financial Consulting Limited 或 Aeron 项目无任何关联,未获其背书或赞助。 Aeron 是 Adaptive Financial Consulting Limited 的注册商标。
Aeron 是 Adaptive Financial Consulting Limited 在英国及其他国家/地区的商标。