-
Notifications
You must be signed in to change notification settings - Fork 0
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 |
有 | 无 | 有 | 生产环境,需要背压但不需要统计 |
| 性能模式 | 吞吐量 | 单消息延迟 |
|---|---|---|
FULL_FEATURED |
26.27 M/s | 38 ns |
BARE_METAL |
33.65 M/s | 30 ns |
NO_STATS |
介于两者之间 | -- |
统计开销: 约 8.35 ns/msg (FULL_FEATURED 与 BARE_METAL 的差值)。
| 性能模式 | 吞吐量 | 单消息延迟 |
|---|---|---|
FULL_FEATURED |
29.92 M/s | 33 ns |
BARE_METAL |
38.49 M/s | 26 ns |
SPSC 模式通过 MCCC_SINGLE_PRODUCER=1 启用,消除 CAS 竞争,吞吐量提升约 14%。
端到端延迟测量从 Publish() 到 ProcessBatch() 回调触发的完整链路耗时。
| 指标 | 延迟 |
|---|---|
| Mean | 383 ns |
| P50 | 372 ns |
| P95 | 422 ns |
| P99 | 525 ns |
| Max | 49,806 ns |
| 指标 | 延迟 |
|---|---|
| Mean | 325 ns |
| P50 | 317 ns |
| P95 | 369 ns |
| P99 | 392 ns |
| Max | 7,376 ns |
SPSC 模式的尾延迟 (P99/Max) 显著优于 MPSC,因为消除了多生产者间的 CAS 重试。
ProcessBatchWith 使用 std::visit 编译期分发,避免 ProcessBatch 的回调表查找和 shared_mutex 读锁开销。
| 方法 | 单消息处理耗时 | 相对加速 |
|---|---|---|
ProcessBatch |
160 ns/msg | baseline |
ProcessBatchWith |
129 ns/msg | 快 19% |
| 方法 | 单消息处理耗时 | 相对加速 |
|---|---|---|
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 下零丢弃,验证了背压准入机制的有效性。
5 秒持续发送测试,生产者和消费者并行运行:
| 模式 | 持续吞吐量 |
|---|---|
| MPSC (4P + 1C) | 7.13 M/s |
| SPSC (1P + 1C) | 8.21 M/s |
持续吞吐量低于峰值入队吞吐量,因为包含了消费者处理和回调分发的完整链路开销。
以 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,消除硬件内存屏障开销。
- 吞吐量测试: 预热 1000 条消息后,连续发送 100 万条消息,取平均耗时
- 延迟测试: 每条消息携带发送时间戳,在回调中计算差值,采集 10 万个样本后计算百分位数
- 背压测试: 不启动消费者,纯 burst 发送,统计各优先级的实际入队数
- 持续测试: 生产者和消费者并行运行 5 秒,统计总处理消息数
- 多轮统计: 所有测试运行 5 轮取中位数,排除冷启动和缓存效应