原文首发于 TechNova: 剖析C++撮合引擎性能之核:内存布局与缓存行优化
承接页(解决方案):https://technologynova.org/solution/
alignas(64) + padding 让每个线程写的计数器/统计独占缓存行。
典型症状是:并发上去后平均延迟开始非线性增长,甚至在负载看似平稳时,P99 也会出现不规律的“毛刺”。Profiling 发现撮合逻辑本身并不吃 CPU,
但 perf 一看:stalled cycles 占比很高——CPU 不是在算,而是在等内存。
int,CPU 往往把所在 64B 整块搬进 L1。两个线程各写各的变量,但变量恰好落在同一个缓存行里,就会在一致性协议下互相“踢缓存”, 造成核间通信与无意义的 invalidation——看上去像锁竞争,实际上是缓存行在打架。
工程上的第一反应不是加锁,而是先把数据隔离:
对每线程统计/计数/水位线类字段,使用 alignas(64) 或 C++17 的 hardware_destructive_interference_size,
再用 padding 把结构体尺寸撑到缓存行整数倍。
Order 里塞几十个字段(user_id、timestamp、风控字段……),撮合时却只用 price/qty/side。每次加载都把冷数据带进缓存,污染缓存。perf / PMU 指标显示 cache-miss、stalled cycles、CPI 异常偏高。内存布局与缓存行优化是“把一台机器榨干”的关键步骤,但真正落地到交易系统还要综合考虑: 序列器/网关拓扑、撮合分片策略、行情发布链路、风控/清算一致性与容灾演练。 如果你在规划或重构交易系统,可以先从解决方案页对齐模块边界与演进路径: https://technologynova.org/solution/