目录

CXL-RPC

基于 CXL 共享内存的高性能 RPC 系统原型(2026 开放原子开源大赛参赛作品)。

核心设计

  • 零序列化:通过在共享内存中直接传递数据指针,绕过序列化/反序列化开销
  • 请求/完成队列:基于无锁 SPSC 环形队列的通信机制
  • 多路径支持:CXL 共享内存主路径 + Unix Socket / TCP 降级路径,基于 vtable 策略模式自动切换
  • 安全隔离:保护页越界检测 + msg_id 请求验证 + 超时异常恢复

项目架构

                    CXL-RPC Architecture & Paper Map
                    =================================

┌─────────────────────────────────────────────────────────────────────┐
│                       RPC Runtime Layer                              │
│  ┌─────────────────┐  ┌─────────────────┐  ┌────────────────────┐  │
│  │  Client Runtime  │  │  Server Runtime  │  │  Multi-Path         │  │
│  │  pending map     │  │  dispatch table  │  │  Dispatcher         │  │
│  │  msg_id 匹配     │  │  service route   │  │  (Phase 2)         │  │
│  └────────┬─────────┘  └────────┬─────────┘  └─────────┬──────────┘  │
│           │                     │                      │             │
│           └──────────┬──────────┴──────────┬───────────┘             │
│                      │                     │                         │
│                      ▼                     ▼                         │
│           ┌─────────────────────────────────────┐                    │
│           │          RpcChannel                  │  ← HydraRPC       │
│           │  tx_rb / rx_rb / arena / dispatch   │  ← Telepathic DC  │
│           └─────────────────────────────────────┘                    │
├─────────────────────────────────────────────────────────────────────┤
│                    Zero-Copy Serializer Layer                         │
│                                                                      │
│  ┌─────────────────────────┐  ┌────────────────────────────────┐    │
│  │  rpc_serializer.c       │  │  shm_allocator.c               │    │
│  │  ─ field_desc 描述结构体 │  │  ─ 线性分配 + 代际回收       │    │
│  │  ─ 递归序列化到共享内存  │  │  ─ CAS 无锁并发分配          │    │
│  │  ─ 输出 shm_chunk_t[]   │  │  ─ shm_reset 整批回收         │    │
│  │  ─ 只传 offset, 不拷贝  │  │                                │    │
│  └──────────┬───────────────┘  └──────────────┬─────────────────┘    │
│             │  zBuffer                         │  Cxlalloc            │
│             ▼                                  ▼                      │
├─────────────────────────────────────────────────────────────────────┤
│                    SPSC Ring Buffer Layer                             │
│                                                                      │
│  ring_buffer.c                                                       │
│  ─ 单一生产者/消费者, 无锁                                           │
│  ─ ring_buffer_write_iov / read_iov (iovec 散射-聚集)               │
│  ─ __ATOMIC_RELEASE / __ATOMIC_ACQUIRE 内存序                       │
│  ─ spin_and_wait 两级等待 (pause + sched_yield)                     │
│                                                                      │
├─────────────────────────────────────────────────────────────────────┤
│                    CXL 共享内存层 (硬件)                               │
│                                                                      │
│  ─ CXL.mem 协议: 远端内存映射到本地地址空间                          │
│  ─ 硬件层透明处理缓存一致性 (CXL.coh)                                │
│  ─ 对应用层: 和 mmap MAP_SHARED 语义一致                            │
│  ─ QEMU + CXLMemSim 模拟 / 真实 CXL 硬件                             │
│                                                                      │
└─────────────────────────────────────────────────────────────────────┘
论文与模块对应关系
==================

zBuffer (PPoPP 2026) —— 零拷贝散射-聚集反射
────────────────────────────────────────────
  → rpc_serializer.c
     └─ struct_desc / field_desc: 用描述符描述结构体布局
     └─ rpc_serializer_object(): 将结构体反射到共享内存
     └─ shm_chunk_t: 输出 n 个 (offset, len) 段描述
     └─ 接收端通过 base + chunk.offset 直接读取, 无需反序列化

Cxlalloc (ASPLOS 2026) —— 共享内存生命周期管理
───────────────────────────────────────────────
  → shm_allocator.c
     └─ shm_arena_t: 线性分配器 (bump allocator)
     └─ shm_alloc(): CAS 无锁分配, 支持对齐
     └─ shm_reset(): 代际回收, 一次性重置 offset
     └─ 避免传统 free list 开销, 适合 RPC 请求级生命周期

HydraRPC (USENIX ATC 2024) —— CXL 时代 RPC 架构
─────────────────────────────────────────────────
  → RpcChannel
     └─ tx_rb / rx_rb: 请求/完成队列 (对应 HydraRPC 的 SQ/CQ)
     └─ 无锁消息传递, 避免 CPU 缓存污染
     └─ 多路径调度器 (Phase 2):
        └─ 路径 A: CXL 共享内存 (默认, ring buffer)
        └─ 路径 B: Unix Socket (同机降级/调试)
        └─ 路径 C: TCP socket (跨机兜底)
        └─ 基于 vtable 策略模式, 路径切换对上层透明
        └─ 自动选择: 滑动窗口延迟探测 + 阈值触发

Telepathic Datacenters (arXiv 2024) —— CXL 数据中心设计哲学
────────────────────────────────────────────────────────────
  → 整体架构理念
     └─ 传递指针而非数据 → 零序列化
     └─ 控制面 (Server handler) 与 数据面 (Client 直接读) 分离
     └─ 安全: 保护页越界检测 + msg_id 请求验证 + 超时恢复
     └─ 降级路径: Unix Socket / TCP (无 CXL 硬件时)
架构分层 (自底向上)
==================

  Layer 4: RPC Runtime         ← HydraRPC + Telepathic Datacenters
    RpcChannel, msg_id 匹配, 多路径调度, 服务注册/分发

  Layer 3: 零拷贝序列化        ← zBuffer
    结构体描述 → 反射到共享内存 → 只传 offset 数组

  Layer 2: 共享内存管理        ← Cxlalloc
    arena 线性分配, 代际回收, CAS 无锁

  Layer 1: 无锁消息通道        ← SPSC Ring Buffer
    单生产者/消费者, iovec 传输, Release/Acquire 内存序

  Layer 0: CXL 硬件层
    CXL.mem 提供缓存一致性共享内存抽象

环境要求

  • openEuler 24.03 LTS(或其他 Linux 发行版)
  • GCC 11+ / Clang 15+
  • CMake 3.15+
  • QEMU 8.0+(带 CXL 模拟支持)

快速开始

# 克隆仓库
git clone git@github.com:LiuHongsGitHub/cxl-rpc.git
cd cxl-rpc

# 编译
mkdir -p build && cd build
cmake ..
make

# 运行测试
./test_rpc_loopback

参考论文

  1. HydraRPC: RPC in the CXL Era (USENIX ATC 2024)
    核心思想:利用 CXL HDM 传输数据,绕过 CPU 缓存,使用 MONITOR/MWAIT 高效通知。

  2. Telepathic Datacenters: Fast RPCs using Shared CXL Memory (arXiv 2024)
    核心思想:传递指针避免序列化,通过内存权限管理恢复安全性,支持 RDMA 降级。

  3. zBuffer: Zero-Copy and Metadata-Free Serialization (PPoPP 2026)
    核心思想:零拷贝、无元数据序列化,利用 Scatter-Gather 反射机制。

  4. Cxlalloc: Safe and Efficient Memory Allocation for a CXL Pod (ASPLOS 2026)
    核心思想:为 CXL Pod 设计的安全高效内存分配器。

@inproceedings{HydraRPC2024,
  author    = {Teng Ma and Zheng Liu and Chengkun Wei and Jialiang Huang and
               Youwei Zhuo and Haoyu Li and Ning Zhang and Yijin Guan and
               Dimin Niu and Mingxing Zhang and Tao Ma},
  title     = {HydraRPC: {RPC} in the {CXL} Era},
  booktitle = {2024 USENIX Annual Technical Conference (USENIX ATC '24)},
  pages     = {387--395},
  year      = {2024}
}

@misc{RPCool2024,
  title         = {Telepathic Datacenters: Fast RPCs using Shared CXL Memory},
  author        = {Suyash Mahar and Ehsan Hajyjasini and Seungjin Lee and 
                   Zifeng Zhang and Mingyao Shen and Steven Swanson},
  year          = {2024},
  eprint        = {2408.11325},
  archiveprefix = {arXiv},
  primaryclass  = {cs.DC}
}

@inproceedings{zBuffer2026,
  author    = {Xiangyu Liu and Huiba Li and Shun Gai and Youmin Chen and Yiming Zhang},
  title     = {zBuffer: Zero-Copy and Metadata-Free Serialization for Fast {RPC} with Scatter-Gather Reflection},
  booktitle = {Proceedings of the 31st ACM SIGPLAN Annual Symposium on Principles and 
               Practice of Parallel Programming (PPoPP '26)},
  publisher = {ACM},
  year      = {2026}
}

@inproceedings{Cxlalloc2026,
  author    = {Newton Ni and Yan Sun and Zhiting Zhu and Emmett Witchel},
  title     = {Cxlalloc: Safe and Efficient Memory Allocation for a {CXL} Pod},
  booktitle = {Proceedings of the 31st ACM International Conference on Architectural 
               Support for Programming Languages and Operating Systems, Volume 2 (ASPLOS '26)},
  pages     = {528--545},
  publisher = {ACM},
  year      = {2026}
}
关于
25.5 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号