Skip to content

Benchmark

dgliu edited this page Feb 14, 2026 · 1 revision

性能基准测试

本页面记录 MCCC 消息总线的完整性能基准数据,涵盖吞吐量、延迟、背压丢弃率和配置矩阵。


测试环境

项目 规格
操作系统 Ubuntu 24.04 LTS
编译器 GCC 13.3.0
编译选项 -O3 -march=native
处理器 Intel Xeon Cascadelake, 64 vCPU
队列深度 131072 (默认 MCCC_QUEUE_DEPTH)
批处理大小 256

性能模式

MCCC 提供三种运行时性能模式:

模式 背压 统计 错误回调 适用场景
FULL_FEATURED 开发调试、生产监控
BARE_METAL 极致性能、裸机嵌入式
NO_STATS 生产环境,需要背压但不需要统计

入队吞吐量 (Enqueue Throughput)

MPSC 模式 (4 生产者 + 1 消费者)

性能模式 吞吐量 单消息延迟
FULL_FEATURED 26.27 M/s 38 ns
BARE_METAL 33.65 M/s 30 ns
NO_STATS 介于两者之间 --

统计开销: 约 8.35 ns/msg (FULL_FEATUREDBARE_METAL 的差值)。

SPSC 模式 (1 生产者 + 1 消费者)

性能模式 吞吐量 单消息延迟
FULL_FEATURED 29.92 M/s 33 ns
BARE_METAL 38.49 M/s 26 ns

SPSC 模式通过 MCCC_SINGLE_PRODUCER=1 启用,消除 CAS 竞争,吞吐量提升约 14%。


端到端延迟 (E2E Latency)

端到端延迟测量从 Publish()ProcessBatch() 回调触发的完整链路耗时。

MPSC E2E 延迟

指标 延迟
Mean 383 ns
P50 372 ns
P95 422 ns
P99 525 ns
Max 49,806 ns

SPSC E2E 延迟

指标 延迟
Mean 325 ns
P50 317 ns
P95 369 ns
P99 392 ns
Max 7,376 ns

SPSC 模式的尾延迟 (P99/Max) 显著优于 MPSC,因为消除了多生产者间的 CAS 重试。


ProcessBatch vs ProcessBatchWith 性能对比

ProcessBatchWith 使用 std::visit 编译期分发,避免 ProcessBatch 的回调表查找和 shared_mutex 读锁开销。

MPSC 模式

方法 单消息处理耗时 相对加速
ProcessBatch 160 ns/msg baseline
ProcessBatchWith 129 ns/msg 快 19%

SPSC 模式

方法 单消息处理耗时 相对加速
ProcessBatch 161 ns/msg baseline
ProcessBatchWith 93 ns/msg 快 42%

SPSC 模式下 ProcessBatchWith 的加速幅度更大,原因是 SPSC 的入队端已无锁竞争,消费端的锁开销在总耗时中占比更高。


背压丢弃率

测试条件: 150,000 条消息突发 (burst) 发送,队列深度 131,072。

优先级 丢弃率 准入阈值
HIGH 0% 99%
MEDIUM 12.6% 80%
LOW 47.6% 60%

高优先级消息在 150K burst 下零丢弃,验证了背压准入机制的有效性。


持续吞吐量 (Sustained Throughput)

5 秒持续发送测试,生产者和消费者并行运行:

模式 持续吞吐量
MPSC (4P + 1C) 7.13 M/s
SPSC (1P + 1C) 8.21 M/s

持续吞吐量低于峰值入队吞吐量,因为包含了消费者处理和回调分发的完整链路开销。


开销分解 (Overhead Breakdown)

FULL_FEATURED 模式 MPSC 为基准的各环节开销:

环节 开销 说明
CAS 入队 (裸操作) ~30 ns BARE_METAL 模式的纯入队延迟
背压水位检查 ~2 ns 原子 load + 阈值比较
统计计数器更新 ~4 ns fetch_add (published/dropped 计数)
时间戳采集 ~2 ns steady_clock::now()
合计 FULL_FEATURED ~38 ns 完整功能入队延迟
shared_mutex 读锁 ~15 ns ProcessBatch 回调查找
std::visit 分发 ~5 ns ProcessBatchWith 编译期分发

配置矩阵

不同编译配置的适用场景和预期性能:

配置 MCCC_SINGLE_PRODUCER MCCC_SINGLE_CORE 缓存行大小 适用场景 预期吞吐量
MPSC 多核 0 0 64 多线程服务器/工控 26~34 M/s
SPSC 多核 1 0 64 单生产者高性能管道 30~39 M/s
MPSC 单核 0 1 0 单核 MCU + ISR 多源 取决于 MCU 主频
SPSC 单核 1 1 0 单核 MCU 最简场景 取决于 MCU 主频

单核模式 (MCCC_SINGLE_CORE=1) 使用 relaxed 内存序 + atomic_signal_fence,消除硬件内存屏障开销。


测试方法说明

  1. 吞吐量测试: 预热 1000 条消息后,连续发送 100 万条消息,取平均耗时
  2. 延迟测试: 每条消息携带发送时间戳,在回调中计算差值,采集 10 万个样本后计算百分位数
  3. 背压测试: 不启动消费者,纯 burst 发送,统计各优先级的实际入队数
  4. 持续测试: 生产者和消费者并行运行 5 秒,统计总处理消息数
  5. 多轮统计: 所有测试运行 5 轮取中位数,排除冷启动和缓存效应