在部分一致 CXL 内存上高效共享数据(OSDI 2026)

原题:Megalon: Efficient Data Sharing for Partly Coherent CXL Memory

一句话总结:MEGALON 针对一种尚未商品化、但被论文预计会出现的 CXL 形态——TB 级内存里只有数百 MB 具备硬件缓存一致性——把“大而冷”的对象索引复制到各 host DRAM,只把“小而热”的一致性记录留在小一致区,并用 LNR 共享日志处理索引顺序和记录切换;在三 host 的 NUMA 模拟器上,大数据集实验相对 HCMeta 提高 3.18–15.26 倍,但真实 CXL fabric、故障恢复和更多节点仍未验证。

问题与动机

CXL 3.x 允许多个 host 对同一外部内存直接 load/store。论文采用的硬件前提是:总内存可以达到数 TB,但 snoop filter 和 back-invalidation 难以覆盖全部地址,厂商最终只会给数百 MB 提供硬件缓存一致性。论文把这部分叫小一致区(small coherent region,SCR),把剩余的大非一致区叫 large non-coherent region(LNR)。数据放在 LNR 时,一个 host 写完后,另一个 host 的 CPU cache 可能仍保存旧值。

已有 HCMeta 方法把对象放在 LNR,把每对象一致性记录和 key → object/record location 索引都放在 SCR。Tigon 就这样共享跨分区 tuple。问题是索引含 key 和指针,比锁与 counter 大得多;对象数量增加后,metadata 先挤爆 SCR。系统只能反复取消共享旧对象,再共享新对象,产生 churn。论文复现实验中,Tigon 在 20% cross-host transaction 下把数据集从 2.4M 增到 24M rows,吞吐下降约 10 倍(§2、图 1)。

MEGALON 不试图让整个 LNR 获得透明硬件一致性。它提供的是粗粒度对象共享库:应用把 1–4 KB 的 row、KV、blob 或 file page 作为对象,并通过库的 read/write 边界访问。它要解决的是“SCR 放不下线性增长的 metadata”以及由此产生的 churn,而不是任意指针、任意 cacheline 都透明一致的通用共享内存。

关键观察 / 隐含假设

  • 观察 1:metadata 的两部分有相反特性。 索引包含 object ID 和位置,体积大,但通常只在 create/delete/move 时更新;一致性记录只有 lock、free bit 和 counter,体积小,却在每次写时更新(§3.1–§3.2)。
    • 依赖假设:普通 read/write 远多于索引 mutation。若工作负载频繁 insert、delete 或 relocation,共享日志会进入主路径。
    • 可能失效场景:短命对象流、queue、日志型 KV 或大规模 rebalance 会使“大而冷的索引”变成大而热。
  • 观察 2:只读共享对象不需要 per-object writer 状态。 因此 SCR 容量可以由全数据集对象数,改为约束“近期被写的共享对象数”(§3.4.1、图 3)。
    • 依赖假设:read-shared 与 read-write-shared 的每次转换都能被所有 reader 观察,并触发正确的 cache flush;只看转换前后的当前指针不够。
  • 观察 3:一个有硬件一致性的 log tail 足以排序索引变化。 log entry 可放在 LNR,用 non-temporal access 或显式 flush;host 看到 SCR tail 前进后再 replay(§3.3)。
    • 依赖假设:共享 tail 不成为争用点,慢 replica 能追上日志,LNR 写入在 tail 所定义的顺序中正确发布。
  • 假设 1:每个 host 都能保存完整索引副本,系统规模主要是 8–16 nodes。 论文指出当前 local-memory footprint 会随节点数增长,并把 partial view、索引分片和多日志留作扩展方案(§4)。
    • 证据强度:弱到中。实际评测只有三个模拟 host,没有展示 8–16 nodes 的 tail contention、replay lag 或内存成本。

核心方法

MEGALON 的一致性记录包含 lock bit、free bit 和默认 30-bit counter。writer 先拿锁,把 counter 加一成为奇数,写 LNR 对象并 flush 自己的 cacheline,再把 counter 加一成为偶数并释放锁。reader 在读前后各取一次 counter;若读到奇数、两次不等,或本 host 保存的旧 counter 与当前值不等,就 flush 对象 cacheline 并重试。这类似 sequence lock:锁只串行 writer,reader 用前后检查发现并发写。每个 host 还保存每对象最近成功读取的 counter,以判断自己的 cache 是否可能过期(§3.1)。

split metadata 把索引变成每 host local DRAM 中的 hashmap,entry 指向 LNR 对象和可选的 SCR record;SCR 不再保存 key。以 100 MB SCR、40-byte key、4-byte record 为例,MEGALON 可保存约 25M records,而 HCMeta 每对象至少 52 bytes,只能覆盖约 1.9M 对象。local lookup 也比访问共享 SCR 索引延迟低、争用少,代价是每台机器都保存完整副本(§3.2、图 2)。

索引副本通过修改后的 NUMA Node Replication 共享日志保持一致。update 先以 CAS 预留 tail,再向 LNR circular log 写 entry;各 host 在读本地索引前检查 SCR 中的 head/tail,并 replay 尚未应用且已经写完整的 entry。日志只用于复制,不用于故障恢复;各 replica 都越过某 entry 后才推进 head 回收空间。每 host 的 update 还会 flat-combine,由一个线程追加,减少 tail 争用(§3.3、§4)。

对象创建时默认没有 record。第一次写要从 SCR 找 free record,并通过日志把指针写进所有索引副本;如果两个 host 竞争,日志顺序中的第一个成功,另一个释放自己多分配的 record。SCR 接近水位线时,后台线程随机采样并选择 counter 最低的 record 回收,把对象降为 read-shared。稳定期间,一致性走 record 快路径;allocation、deallocation、create 或 delete 期间则走第二条日志路径:host replay 事件时 flush 对应对象,正在进行的 read 还要检查其开始与结束之间是否发生过事件,否则“无 record→写入→又无 record”的 ABA 式变化会漏掉(§3.4)。

共享日志还支持三个优化。第一,record 可缩短;counter wrap 时写一条日志,令各 host flush,避免新旧 counter 相同。第二,索引可指向某 host 的 local DRAM;连续 n 次由同一 host 访问后把对象移回本地,远程访问再用 RPC 搬回 CXL。第三,read-shared 对象可在多个 host 保留本地副本;写入时通过日志把索引收敛到唯一 CXL copy,逻辑失效其他副本(§3.5)。

实现是约 8 KLoC C++ library,暴露 read_start/read_endwrite_start/write_end、create 和 delete。KV store 提供 linearizable put/get;共享 page cache 把 (inode, block-number) 作为 4 KB 对象,并另在 SCR 保存 dirty bit。对象 slot 大小是编译期固定值。故障模型很弱:任何 host 或 CXL memory 失败都让整个系统失败;KV 不做 checkpoint,只有 page cache 可依靠文件系统和已经 fsync 的数据恢复(§4–§5)。

设计取舍

  • local DRAM 换 SCR 容量:完整索引副本让 SCR 只随活跃写集合增长;代价是每 host 的 hashmap、host-side counter 和 replay 工作,节点越多总体成本越高。
  • 共享日志换同步 RPC:mode switch 不必等待所有 host ACK,churn 更便宜;代价是 read 前 tail check、事件订阅、log reclamation 和慢 replica 管理。
  • 动态 record 换协议复杂度:读多工作负载几乎不占 SCR;create/delete、record 切换和 counter wrap 都必须走 dual-path coherence,正确性状态空间明显大于固定 record。
  • 应用显式边界换粗粒度性能:1–4 KB 对象可少做 cacheline metadata;任何绕过 library 的裸指针访问都不受协议保护,动态大小对象也尚未实现。
  • 可用性换简单实现:log 是复制机制而不是恢复日志,系统没有 host 隔离、leader recovery、replica rejoin 或持久 KV 语义。

实验与结果

  • 因 commercial CXL 3.0 尚不可用,实验在 4-socket Xeon Gold 6418H 上模拟:NUMA node 0 充当 CXL,node 1–3 各作为 24-core、64 GB DRAM 的 host,并降低 node 0 uncore frequency 模拟延迟;默认是 1 KB KV、200 MB SCR。baseline 为 HCMeta、带 local partition 的 HCMeta-local 和不现实的无限 SCR 版本(§6 Setup)。
  • read-only、Zipf 0.99 下,MEGALON 不分配 record。数据集从约 2M 增到 24M objects 时吞吐维持约 24 MOps/s;24M 点相对 HCMeta 提高 15.26 倍,延迟约 1 μs,而 HCMeta/HCMeta-local 因 churn 升到约 26–34 μs,后者还多出数据搬移成本(§6.1–§6.2、图 4、图 5)。
  • 24M objects 的 5% write 和 50% write 下,MEGALON 相对 HCMeta 吞吐分别提高 10.11 倍和 4.22 倍;200 MB 可容纳约 50M 个 4-byte records,是 HCMeta 无 churn 容量的 12 倍。把 18M 数据集的 SCR 继续缩小时,MEGALON 自己也 churn,但整体仍快 2.5–14.9 倍;5% write、高 skew、64 MB SCR 的一个点是 11 倍(§6.3–§6.4、图 6、图 7)。
  • 一次 MEGALON churn 只分 record 并写日志,开销比 HCMeta 的 owner RPC 低 8.19 倍;10–90 byte key 只扩大 local index,不影响 SCR,而 HCMeta throughput 随 key 变大下降。24M objects 时 MEGALON 总内存 27.71 GB,比 HCMeta 的 25.76 GB 高 7.6%,吞吐却是 24.4 对 1.6 MOps/s,单位 GB 吞吐高 14.19 倍(§6.4–§6.6、图 8、图 9)。
  • 最坏的 32 MB SCR、50% write、低 skew 设置中,把 record 从 32 bits 缩到 8 bits,让吞吐提高 6.29 倍;再缩会因 wrap log 变多而下降。把全部 metadata 都经日志复制的 AllLog 在 50% write 时比 split design 慢 4.14 倍,直接支持“热 record 应放 SCR”的判断(§6.7、§6.10、图 10、图 13)。
  • 18M-object YCSB A/B/C/D/F 上,MEGALON 相对 HCMeta 分别快 3.93、9.12、14.18、4.55、3.18 倍;48 GB、4 KB-page 的用户态 page cache 在 write-heavy/read-heavy/read-only 下分别提高 1.88、4.47、5.68 倍。read-only 本地 data copy 还比普通 MEGALON 降低 1.3 倍访问延迟(§6.9、§6.11–§6.12、图 12、图 14、图 15)。

论断—证据表

论断证据评测边界置信度
split metadata 能显著推迟 HCMeta 的容量墙图 5、图 6三个 NUMA 模拟 host、1 KB KV、默认 200 MB SCR
只为 read-write-shared 对象分 record 能减少 churn图 7、图 818M objects,多种 write ratio、Zipf 0.99/0.7 和 SCR size
高频一致性记录不应全部通过日志复制图 10、图 1318M objects;record-size 与 AllLog 消融
机制能覆盖标准 KV workload,而非单一 microbenchmark图 14五种 YCSB、18M objects、NUMA 模拟 CXL
同一抽象可用于共享 page cache图 1548 GB 数据、4 KB pages、三种读写比例

批判性分析

论证链条

论文的核心分解很干净:HCMeta 的容量问题来自“大索引”和“小 record”采用了同一种物理共享方式;把两者拆开后,再用动态 record 把限制从全数据集推到写工作集。key-size 实验验证大索引不再消耗 SCR,AllLog 消融验证频繁 record update 不适合复制,SCR sensitivity 又承认 MEGALON 仍有容量墙而不是声称彻底消除。就“减少 metadata churn”这个窄 claim 而言,设计与实验相互对应。

更大的跳步在硬件前提。论文研究的是未来 partly coherent CXL;实际平台既没有 commercial CXL 3.0,也没有真实 SCR/LNR。实验只说明降低 NUMA node 0 的 uncore frequency 来近似 CXL latency,没有说明关闭普通多 socket 的硬件 cache coherence。因此吞吐能反映执行 flush、日志和 churn 的软件成本,却不能充分复现 fabric switch、LNR 的 stale-cache 行为、SCR snoop 资源、真实带宽或设备故障。

假设压力测试

MEGALON 最适合“大量长寿命对象、索引变化少、写工作集小于总数据集”的 workload。若对象短命、key 热插入删除、读写 mode 高频振荡,日志事件、cache flush 和 record churn 会同时增加。论文用 Zipf 0.99/0.7 和 5%/50% write 压力测试了访问分布,却没有独立扫 insert/delete rate、对象 lifetime、hot-key writer contention、watermark 或后台随机回收策略。

扩展性也依赖每个 host replay 全部索引变化。中心 tail、每副本 reader-writer lock、flat-combining 单 append thread 和完整 hashmap 在三个 host 上不一定显出瓶颈。论文把目标写成 8–16 nodes,但未实测该范围;64 nodes、慢 host、replica 暂停或日志即将绕回时需要 partial view、sharding 或多个日志,这些仍是设想。

实验可信度

HCMeta、HCMeta-local 和 HCMeta-Unlimited 三个 baseline 能分别隔离 SCR 容量、数据搬移和 churn,评价矩阵还覆盖 key size、SCR size、skew、write ratio、AllLog、YCSB 与第二个 page-cache 应用,机制证据完整。内存账也避免了只报吞吐、不报 replication 成本的问题。

不足是所有实验都在同一台四路服务器、三个模拟 host 上完成,且主要报告 throughput 和 average latency;论文没有给重复次数、误差条、P99 或 tail churn。对照实现是作者在自研 KV store 中实现的 HCMeta,不是把完整 MEGALON 放进 Tigon 做交易级对比;因此结果支持共享层,不直接证明 ACID database 的端到端收益。

系统性缺陷

正确性依赖应用严格配对 read_start/read_endwrite_start/write_end,并正确处理 retry。API 跨越实际 data access,异常退出、长读、取消和误用都可能把对象留在危险状态;论文没有展示形式化证明、race model checking 或在真正非一致内存上做故障注入。普通 NUMA coherence 还可能掩盖漏 flush 的实现错误。

系统把任一 host 或 CXL memory failure 定义为全局失败,shared log 又明确不做 recovery。未讨论 tail/head 持久化、writer 在“预留 tail 但未写完 entry”后崩溃、慢 replica 阻止回收、节点加入退出和 index bootstrap。page cache 可以依靠 disk 恢复已 fsync 数据,但这不是 MEGALON 自身的高可用方案。

局限与后续工作

  • 局限 1:真实 partly coherent CXL 尚不可用;NUMA 延迟模拟不能验证 fabric 和非一致 cache 的全部行为。
  • 局限 2:只评测三个 host,低于论文声称的 8–16 node 目标;多节点 tail contention、replay lag 和副本内存尚无数据。
  • 局限 3:固定 slot、编译期 object size 和显式访问 API 限制应用范围;系统没有故障容忍或持久 KV。
  • 后续工作 1:在真实 CXL prototype 或能关闭 host coherence 的 emulator 上,对转换、删除、counter wrap 注入并发 race,并用 linearizability checker 验证结果。
  • 后续工作 2:把 host 数从 3 扩到 16/64,分别扫描 insert/delete rate、slow replica 和 hot key,报告 tail contention、log lag、P99 以及 head 无法回收的时间。
  • 后续工作 3:实现 sharded index、multi-log 与 replica rejoin;对 append 中途 crash、CXL device reset 和 log corruption 给出可恢复协议。

相关