动机
从关键路径移除虚拟缓冲区
GPU 直接存储(GDS)通过点对点 DMA(P2P-DMA)实现 GPU 内存和 NVMe 设备之间的直接数据传输,绕过传统的主机反弹缓冲区。然而,当前的 GDS 实现在主机内存中使用"虚拟缓冲区"与 Linux 内核交互——这是一个与 GPU 缓冲区同样大小的主机内存区域,在内核操作期间代表 GPU 缓冲区。
这个虚拟缓冲区造成了重大问题:
- 次优性能:虚拟缓冲区管理和 DMA 地址替换的复杂逻辑为关键 I/O 路径增加了开销
- 过度的资源消耗:虚拟缓冲区需要同样大小的主机内存分配,浪费 RAM 和 CPU 周期
- 兼容性差:需要定制的设备驱动程序和非 POSIX 接口,使部署和编程变得复杂
Phoenix 通过利用 Linux ZONE_DEVICE 将 GPU 内存直接映射到内核的页表中,完全消除了虚拟缓冲区。这允许 Linux 文件系统栈使用标准 POSIX 接口直接与 GPU 内存交互,消除了代理层及其相关开销。
关键设计思想
ZONE_DEVICE 内存映射
Phoenix 使用 Linux ZONE_DEVICE(内核 4.3+)在系统启动时将 GPU 内存直接映射到内核的页表中,使 GPU 内存可通过标准虚拟内存操作寻址。
- • GPU 内存参与内核页模型
- • 不需要代理缓冲区
- • 标准 struct page 表示
- • 实现 POSIX 接口兼容性
标准 Linux I/O 接口
Phoenix 与未修改的 Linux 文件系统、块层和原生 NVMe 驱动程序一起工作——核心 I/O 路径不需要自定义内核修改。
- • 标准 POSIX read/write/pread/pwrite
- • 原生 VFS 和页缓存集成
- • 未修改的块层
- • 标准 NVMe 驱动程序
使用 io_uring 的异步 I/O
Phoenix 与 Linux io_uring 集成,提供高性能异步 I/O,实现 I/O 操作与 GPU 计算的高效批处理和重叠。
- • 零拷贝异步 I/O
- • 批量提交提高效率
- • 轮询和中断模式
- • 流有序操作
应用集成适配器
Phoenix 提供适配器和绑定,可无缝集成 AI 框架和存储系统,最大限度地减少应用程序代码更改。
- • libphoenix C/C++ 库
- • Python 绑定
- • LMCache 集成(phxfile 适配器)
- • vLLM 集成支持
架构
证据
论文结果
来源:"Phoenix: A Refactored I/O Stack for GPU Direct Storage without Phony Buffers"(SC'25,2025年11月)
关键性能特征
- 消除虚拟缓冲区分配和管理开销
- 减少 CPU 参与和主机内存消耗
- POSIX 接口兼容性支持标准编程模式
- 在受控评估中与最先进的 GDS I/O 栈比较
当前支持边界
核心系统
- • 基于 ZONE_DEVICE 的 GPU 内存映射
- • POSIX 接口支持(read/write/pread/pwrite)
- • io_uring 异步 I/O 集成
- • 未修改的 Linux I/O 栈兼容性
- • P2P DMA 实现 NVMe-GPU 直接传输
集成
- • libphoenix 库(C/C++)
- • Python 绑定
- • LMCache 适配器(phxfile)
- • 查看仓库了解 vLLM/框架状态
- • 自定义集成的适配器 API
平台支持
Phoenix 针对最近发布的 GPU 和 NPU 型号实现。请查看 GitHub 仓库 README 以获取当前经过测试的硬件平台列表和部署要求。
- →需要 Linux 内核 4.3+ 以支持 ZONE_DEVICE
- →需要 PCIe P2P DMA 能力(验证 GPU/系统支持)
- →建议使用支持 P2P 的 NVMe 存储以获得最佳性能
研究
Phoenix: A Refactored I/O Stack for GPU Direct Storage without Phony Buffers
会议: SC'25 - 国际高性能计算、网络、存储和分析大会
日期: 2025年11月16-21日,美国密苏里州圣路易斯
DOI: 10.1145/3712285.3759862
作者: Jianqin Yan, Shi Qiu, Yina Lv, Yifan Hu, Hao Chen, Zhirong Shen, Xin Yao, Renhai Chen, Jiwu Shu, Gong Zhang, Yiming Zhang