MCCC Lock-free 提供优先级保护和背压控制,同时保持高性能。
结论
数据支撑
MCCC BARE_METAL 极高性能
MPSC 33.65 M/s, 30 ns/msg; SPSC 38.49 M/s, 26 ns/msg
MCCC FULL_FEATURED 生产可用
MPSC 26.27 M/s, 38 ns/msg; SPSC 29.92 M/s, 33 ns/msg
HIGH 消息零丢失
背压测试中 HIGH 优先级丢弃率 0%
功能开销可控
MPSC +8.35 ns/msg, SPSC +7.41 ns/msg
尾部延迟稳定
E2E P99: MPSC 525 ns, SPSC 392 ns
项目
配置
OS
Ubuntu 24.04 LTS
CPU
Intel Xeon Cascadelake 64 vCPU
Compiler
GCC 13.3.0
Optimization
-O3 -march=native -faligned-new
C++ Standard
C++17
MCCC 提供三种运行时性能模式,通过 bus.SetPerformanceMode() 切换(非编译宏,运行时生效):
模式
说明
用途
FULL_FEATURED
完整执行优先级准入检查、背压判断、10项原子统计计数
生产环境默认模式
BARE_METAL
跳过优先级/背压/统计,仅保留核心 CAS 入队操作
测量纯队列性能基线
NO_STATS
保留优先级准入,但跳过统计计数
需要准入控制但不需要统计的场景
模式
吞吐量
入队延迟
说明
FULL_FEATURED
26.27 ± 0.49 M/s
38.08 ± 0.70 ns
优先级+背压+统计
BARE_METAL
33.65 ± 0.81 M/s
29.73 ± 0.72 ns
仅队列操作
功能开销
-
~8.35 ns
全功能额外开销
分类
开销来源
估算
说明
零开销
Envelope 内嵌 Ring Buffer
0 ns
无 shared_ptr 堆分配
零开销
固定数组 + 编译期类型索引
0 ns
无 unordered_map hash 查找
零开销
无原子引用计数
0 ns
无 shared_ptr
保留
优先级检查 + 背压判断
~3-5 ns
FULL_FEATURED 模式
保留
统计计数 (atomic fetch_add)
~2-3 ns
FULL_FEATURED 模式
保留
CAS 竞争
~5-10 ns
多生产者场景
BARE_METAL 总开销
~30 ns
仅 CAS + 序列号同步
FULL 功能开销
~8 ns
优先级 + 背压 + 统计
批量测试 (FULL_FEATURED, 10 轮统计)
场景
消息数
吞吐量
入队延迟
Small
1K
23.49 ± 0.93 M/s
42.64 ± 1.67 ns
Medium
10K
25.79 ± 0.58 M/s
38.79 ± 0.87 ns
Large
100K
25.39 ± 1.09 M/s
39.46 ± 1.85 ns
大批量测试方差更小 (StdDev 0.58 vs 0.93),说明性能在持续负载下更稳定。
测试目的 : 测量消息从发布到回调执行的完整延迟(包含队列等待时间)。
P50 (中位数) : 50% 的消息延迟低于此值,代表典型情况
P95 : 95% 的消息延迟低于此值,只有 5% 的消息比这慢
P99 (尾部延迟) : 99% 的消息延迟低于此值,衡量最坏情况的关键指标
P99 比均值更有意义——安全关键系统关注的是"最坏情况有多差",而非"平均多好"。
P50 与 P99 差距越小,说明延迟分布越集中、越可预测。
MCCC E2E 延迟 - MPSC (10,000 样本)
分位数
延迟
说明
Mean
383 ns
平均延迟
P50
372 ns
中位数:典型延迟
P95
422 ns
95% 消息低于此值
P99
525 ns
尾部延迟:99% 消息低于此值
Max
49,806 ns
最大延迟
MCCC E2E 延迟 - SPSC (10,000 样本)
分位数
延迟
说明
Mean
325 ns
平均延迟
P50
317 ns
中位数:典型延迟
P95
369 ns
95% 消息低于此值
P99
392 ns
尾部延迟:99% 消息低于此值
Max
7,376 ns
最大延迟
分析 :
MPSC: P50 与 P99 仅差 153 ns (372 vs 525),延迟分布集中
SPSC: P50 与 P99 仅差 75 ns (317 vs 392),延迟分布极其集中
Lock-free + 零堆分配消除了锁竞争导致的随机长尾
新增的 ProcessBatchWith<Visitor> 方法绕过回调表和 shared_mutex,使用 std::visit 编译期分发。
ProcessBatchWith vs ProcessBatch 对比 (100K 消息, 单线程)
路径
MPSC
SPSC
说明
ProcessBatchWith (Visitor)
129 ns/msg
93 ns/msg
无锁,无回调表,可内联
ProcessBatch (Callback)
160 ns/msg
161 ns/msg
shared_mutex 读锁 + 回调表遍历
提升
19%
42%
SPSC 受益更大 (CAS 消除 + 无锁)
操作
ProcessBatch
ProcessBatchWith
shared_mutex 读锁
有
无
回调表遍历
有
无
FixedFunction::operator()
有
无
std::visit 跳转表 (可内联)
无
有
测试目的 : 验证系统过载时,高优先级消息(如紧急停止)不会被低优先级消息阻塞。
步骤
操作
1
暂停消费者线程(模拟处理瓶颈)
2
突发发送 150,000 条消息(超过队列容量 131,072)
3
按优先级分布:HIGH 20%, MEDIUM ~26%, LOW ~26%
4
统计各优先级丢弃率
xychart-beta
title "各优先级丢弃率 (%)"
x-axis ["HIGH", "MEDIUM", "LOW"]
y-axis "丢弃率 (%)" 0 --> 50
bar [0.0, 12.6, 47.6]
Loading
优先级
发送
成功
丢弃
丢弃率
状态
HIGH
30,000
30,000
0
0.0%
完全保护
MEDIUM
39,321
33,642
5,679
12.6%
次级保护
LOW
39,320
3,640
35,680
47.6%
优先丢弃
结论 : 优先级准入控制验证通过。HIGH 消息在队列过载时零丢失。
指标
数值
持续时间
5.00 秒
消息发送
35,674,521
消息处理
35,674,521
消息丢弃
8,694,127
吞吐量
7.13 M/s
指标
数值
持续时间
5.00 秒
消息发送
41,072,844
消息处理
41,072,844
消息丢弃
5,325,132
吞吐量
8.21 M/s
持续测试中生产者速度超过消费者处理速度,优先级准入控制正常工作。
丢弃的消息全部为低优先级,高优先级消息零丢失。
场景
推荐
原因
安全关键系统
MCCC
优先级保护 + MISRA 合规
需要背压控制
MCCC
分级丢弃验证通过
尾部延迟敏感
MCCC
MPSC P99 525 ns, SPSC P99 392 ns
零依赖要求
MCCC
纯 C++17 实现
高吞吐低延迟
MCCC
BARE_METAL MPSC 33.65 M/s, SPSC 38.49 M/s
嵌入式/MCU
MCCC
编译宏裁剪,零堆分配
mkdir -p build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release && make -j$( nproc)
# 运行 MCCC 性能测试
./examples/mccc_benchmark