低延迟撮合引擎(C++)

低延迟撮合引擎(C++)

C++Matching EngineLow LatencyLinuxLock-FreePerf

低延迟撮合引擎(C++20)

本项目为用 C++20 从零实现的交易所撮合引擎核心组件,聚焦于无锁流水线设计热路径零堆分配,以数据驱动的方式逐步将吞吐量提升至 Mutex 基线的 2.65×,P99 延迟改善 5.1×


核心特性

  • 无锁 SPSC 双队列流水线:以自实现的 SPSCRingBuffer 替代 std::mutex + condition_variable,生产者/消费者完全在用户态通信,彻底消除 futex 系统调用开销。
  • 热路径零堆分配OrderMemoryPool(free-list + placement new)提供 O(1) 分配/回收;TradeRingBuffer<4096> 预分配 Trade 缓冲,两者合力消除高频路径上的 malloc 尾刺。
  • perf 驱动的数据结构优化:通过 perf record + FlameGraph 定位 std::unordered_map 为 ~32% CPU 热点,迁移至 absl::flat_hash_map(Swiss Table),热点降至 ~12%。
  • Cache Line 纪律Order 结构 alignas(64)sizeof == 64static_assert 强制),整体恰好一条 cache line;SPSC head_/tail_ 各自对齐,消除生产者/消费者间 false sharing。
  • 并发正确性验证:33 个 GTest 单元测试,全程开启 AddressSanitizer + ThreadSanitizer,覆盖完全成交、部分成交、撤单与并发场景。

架构图

多线程撮合引擎完整流程架构请参考以下或顶部大图。

生产者线程                                    消费者线程
─────────────────────────                  ──────────────────────────
FeedSimulator::generate_random()
  │ 生成订单(随机游走价格)

OrderMemoryPool::allocate()                ┌── try_pop() [acquire] ◄──────┐
  │ O(1),无 malloc                         │                              │
  ▼                                         ▼                              │
*slot = raw_order(填充字段)          OrderBook::add_order_noalloc()       │
  │                                         │ 价格-时间优先撮合             │
  ▼                                         ▼                              │
slot->timestamp_ns = RDTSC()          TradeRingBuffer<4096>                │
  │ 延迟测量起点                             │ 纯数组写,无堆分配            │
  ▼  [order_queue_]                         ▼                              │
try_push() [release] ──────────►    latency = RDTSC() - timestamp_ns       │
                                            │ → LatencyRecorder            │
                                            ▼  [return_queue_]             │
pool.deallocate(ptr) ◄── try_pop() ◄── try_push(Order*)  ─────────────────┘
  生产者独占 deallocate,无需任何 mutex

两条 SPSC 队列的 release/acquire 内存序是唯一的同步手段,无任何额外锁或系统调用。


性能结果

测试环境:腾讯云 VM,2 vCPU @ 2.494 GHz,Release(-O2),taskset -c 0,1,100K orders

流水线对比(Mutex vs SPSC,100K 订单)

指标Mutex 基线SPSC 优化版改善
吞吐量1.19 M orders/s3.15 M orders/s2.65×
P50 延迟~4.77 ms~1.26 ms3.8×
P99 延迟~12.59 ms~2.49 ms5.1×

OrderBook 数据结构优化(单线程微基准)

Benchmarkv1 基线v3 优化改善
BM_AddOrder_NoMatch83.5 ns46.4 ns+44%
BM_CancelOrder60,456 ns26,659 ns+56%
BM_MixedWorkload 吞吐3.87 M ops/s6.19 M ops/s+60%
add_order_noalloc(零堆分配)6.19 M ops/s8.04 M ops/s+30%

源码及完整 benchmark 结果请见 GitHub →