SCENARIO METHOD REQ(B) RESP(B) ACTUAL_PATH DECISION_REASON STATUS REQUEST_ID RECLAIMED
small profile PUT 91 12 SHM_INLINE SMALL_MESSAGE OK 1 YES
small profile GET 26 77 SHM_INLINE SMALL_MESSAGE OK 2 YES
large profile PUT 81997 12 SHM_BUFFER SHM_BUFFER_AVAILABLE OK 3 YES
large profile GET 26 81983 SHM_BUFFER SMALL_MESSAGE OK 4 YES
SHM marked down PUT 94 12 TCP SHM_DOWN OK 5 YES
SHM recovered GET 29 77 SHM_INLINE SMALL_MESSAGE OK 6 YES
final upload_chunks=0
final download_chunks=0
kv_rpc_demo: PASS paths=inline,buffer,tcp,auto,stripe shm_tcp_equal=1 release_acks=4 chunks=0
GET 的请求本身很小,因此 AUTO 的请求准入原因仍可能是 SMALL_MESSAGE;
当返回的 UserProfile 超过 192 B 时,服务端实际响应路径会自动变为
SHM Buffer。
AUTO 确定性自适应选路
AUTO 不做性能训练,也不承诺预测实时“绝对最优路径”。规则按固定顺序
结合请求特征、路径健康和资源压力执行:
面向共享内存的多路径 RPC 系统(CXL-RPC)
基于跨机共享内存的统一 RPC 运行时原型,使用 C++17 实现。项目在两台 QEMU/KVM Guest 之间通过
ivshmem验证共享内存协议,同时提供 TCP Transport。同一套 RPC 接口支持SHM_ONLY、TCP_ONLY、AUTO和STRIPE四种调用模式,实际数据由 SHM Inline、SHM Buffer 或 TCP 三种路径承载。项目当前重点不是宣称在普通设备上取得物理 CXL 的极限性能,而是验证:
快速验收
验收时建议首先运行
kv_rpc_demo。它会逐项展示方法名、请求/返回大小、 实际路径、选路原因、状态、request_id和回收结果,并在结束时确认 Upload/Download Chunk 均归零。核心能力
/dev/mem物理映射后端总体架构
客户端只面对统一的同步/异步 RPC API。SHM 和 TCP 的完成结果最终进入 同一套 request ID 匹配、超时和 Future 处理流程。服务端 Worker 不直接 写共享 Completion Ring,而是经有界 Completion Outbox 交给唯一 Publisher。
传输路径与选路模式
SHM_INLINESHM_BUFFERBufferHandle,数据位于 Chunk PoolTCPAUTOSTRIPEAUTO 与 STRIPE 的 fallback 只发生在物理发布之前。请求一旦进入 SHM Ring 或写入 TCP,就不会因为超时而在另一条路径重新执行,从而避免 PUT、 DELETE 等非幂等操作执行两次。
多级优先调度
服务端为 High、Normal、Low 配置独立 Submit Ring,并使用确定性加权调度:
3:2:1;request_id精确匹配。确定性专项验证得到默认
3:2:1 -> 30:20:10、自定义1:1:2 -> 10:10:20;Low 权重为 0 时仍可通过 Aging 得到服务。快速构建与测试
依赖 Linux、CMake、支持 C++17 的 GCC/G++ 和 pthread:
当前完整测试集为 31 项,覆盖共享内存、跨进程原子、SPSC Ring、Inline、 Worker Pool、优先调度、Chunk Allocator、TCP、AUTO、STRIPE、KV Wire、 超时、Session restart 和资源回收。
复杂类型 KV RPC Demo
数据模型
内存 KV 提供:
PUT(key, UserProfile)GET(key) -> UserProfileDELETE(key)LIST(prefix) -> vector<Entry>KV Wire v1 使用固定宽度整数和大端字节序;字符串、数组采用
length + data;Envelope、UserProfile和Metadata均带版本。 解码器拒绝超长、截断、伪造长度、计数溢出、尾随数据和未知版本,线上 不会传递进程内指针、size_t或 STL 对象布局。一条命令演示
关键输出:
GET 的请求本身很小,因此 AUTO 的请求准入原因仍可能是
SMALL_MESSAGE; 当返回的UserProfile超过 192 B 时,服务端实际响应路径会自动变为 SHM Buffer。AUTO 确定性自适应选路
AUTO 不做性能训练,也不承诺预测实时“绝对最优路径”。规则按固定顺序 结合请求特征、路径健康和资源压力执行:
决策回放不依赖机器性能,可用虚拟资源快照复现同一结果:
故障注入 Demo
该命令运行真实集成测试并汇总以下异常链路:
ALREADY_RELEASED通过条件为:
专项测试
复杂类型测试覆盖空字符串、中文、嵌入
\0、空/普通/大数组、嵌套结构、 191/192/193 B、64 KiB Chunk、精确 1 MiB、截断 Payload、伪造长度、 整数溢出、未知版本,以及 SHM/TCP 字节一致性和超时后的最终回收。openEuler 双 Guest 验证
当前功能源码已在两台 openEuler 24.03 LTS SP3 Guest 上分别执行 Release 构建和全量测试:
errors=0upload_chunks=0、download_chunks=0KV Demo 是 VM 内自包含业务演示;跨 Guest 复验覆盖同一份源码的原子可见性 和 SHM Buffer/RELEASE 主链。目前不声称 KV 的独立 Client/Server 业务已经 跨两台 Guest 运行,也不把 QEMU/ivshmem 或 loopback TCP 数据描述为物理 CXL 硬件性能。
完整环境与关键输出见
docs/results/。底层验证工具
这些工具用于验证共享内存基础,不是推荐的答辩入口。
布局检查
POSIX SHM 原子可见性
先启动负责创建并初始化 POSIX SHM 对象的 Producer:
再在另一个终端启动 Consumer:
ADD Inline RPC
Client 负责初始化共享区,Server 使用相同映射接入:
在双 Guest 环境中将
--backend posix替换为 ivshmem/dev/mem映射参数, 并在运行前确认 PCI BAR 的物理地址和大小。代码结构
技术文档