GGFS技术分享

什么是GGFS?

GGFS 是一款专为大规模 GPU 集群设计的下一代分布式并行文件系统,以 “让 GPU 不再等待数据” 为核心目标,面向 AI 大模型训练、AIGC、自动驾驶、科学计算、超算等场景,提供高吞吐、低延迟、强一致、全局统一命名空间的存储服务,彻底解决传统存储在多 GPU 并行访问下的 IO 瓶颈、GPU 利用率低、数据拷贝冗余等问题。

主要代码组成

主要有以下模块:

ggfs-commercial(商用核心能力)
   ↓
ggfs(文件系统核心逻辑 + BAM 块管理)
   ↓
gpu / gpu_data_structures / gpu_initiated(GPU 原生 I/O 体系)
   ↓
gpu_nvme(GPU 直连 NVMe 高速通道)
   ↓
storage(通用块存储管理层)

ggfs-commercial

  • 持续更新中

ggfs

  • 持续更新中

gpu

gpu_cache_manager

主要是给 GPU 用的高速缓存管理器,专门用来加速 GPU 读写数据,用的是最经典的 LRU 淘汰策略(当下不算流行),属于高性能计算 / 深度学习框架里非常核心的底层组件。

提供整个缓存系统的大脑,包含:

  • 哈希表:快速查数据在不在
  • LRU 链:决定谁该被踢出去
  • 空闲链表:快速拿空块
  • 统计命中 / 未命中

提供底层API:

  • 初始化缓存
  • 销毁缓存
  • 查找数据(核心!)
  • 插入数据
  • 移除数据
  • 刷新脏数据
  • 预存数据
  • 统计信息
  • 清空缓存

基于 C 语言 + CUDA 写的、基于 LRU 策略的 GPU 显存缓存管理器,可大幅加速 GPU 数据访问,减少重复从内存 / 磁盘读取,提升系统速度。

gpu_crc

给 GPU 用的CRC 数据校验工具,这次在显卡上快速计算数据的校验码,用来检查数据有没有损坏、传输出错、被篡改。

主要提供四个核心能力:

  • 计算 CRC32:给一段 GPU 上的数据,算一个 32 位校验码。
  • 计算 CRC64:也是提供校验码但生成更长、更安全的 64 位校验码。
  • 批量计算 CRC32:一次给100 个、1000 个数据块全部计算 CRC。
  • 验证数据是否正确:拿数据和期望的指纹对比,若两者一致,则说明数据是完好的。

gpu_direct_dma

提供 GPU Direct DMA 高速数据搬运引擎,让 GPU 能超快、直接、异步地搬数据,不用麻烦 CPU 插手。

定义多种传输类型:

  • 内存 → GPU
  • GPU → 内存
  • GPU → GPU
  • 内存 → 内存

定义多种传输状态和传输请求参数,并且支持多路同时传输。

DMA 传输带来的好处是:
✅ CPU 完全不参与
✅ GPU 直接访问内存
✅ 多流并行传输
✅ 异步非阻塞
✅ 速度接近物理极限
这就是GPU Direct的核心!

gpu_filesystem

提供GGFS的能力,让 GPU 像电脑读写本地一样,直接读写文件,满足超级高带宽的需求。

核心功能:

  • 初始化文件系统(格式化)
  • 打开文件
  • 关闭文件
  • 读取文件
  • 写入文件
  • 创建目录
  • 删除文件
  • 查看文件信息

GGFS 文件系统:
✅ 数据直接在 GPU 里读写
✅ 自带高速缓存(你前面看的代码)
✅ 自带 DMA 高速搬运
✅ 自带 CRC 数据校验
✅ 速度比普通文件快 10~100 倍

gpu_io_completion

gpu_io_scheduler

gpu_metadata_io

gpu_metadata_manager

gpu_nvme_bam

gpu_prefetcher

gpu_rdma_network

gpu_data_structures / gpu_initiated

这部分内容提供了丰富的数据类型接口:

  • 在 GPU 上运行的 B 树索引接口,用于GGFS 文件系统生产版本,让 GPU 能高速做 key-value 查找、插入、删除。
  • 在 GPU 上运行的高性能哈希表(HashMap)索引接口,用于GPU 端高速 key-value 查找、插入、删除,专门为高并发、低延迟场景优化。
  • 在 GPU 上运行的双向链表接口,专门用来做 LRU 缓存淘汰管理,是你整套 GPU 存储系统的缓存调度层。

B树引擎接口

  • gpu_btree_init:初始化 GPU B 树(绑定节点池)
  • gpu_btree_lookup:查找 key → 返回 value
  • gpu_btree_insert:插入 key-value
  • gpu_btree_split_node:节点分裂(v3.0 GPU kernel 专用)
  • gpu_btree_delete:删除 key
  • gpu_btree_update:更新 key 对应的 value
  • gpu_btree_contains:判断 key 是否存在

哈希表索引接口

  • gpu_hashmap_init:初始化 GPU 哈希表
  • gpu_hashmap_lookup:查找 key → 返回 value
  • gpu_hashmap_insert:插入 key-value
  • gpu_hashmap_delete:删除 key
  • gpu_hashmap_stats:获取占用数、负载因子
  • gpu_hashmap_launch_params:自动计算 CUDA 启动参数(grid/block),v3.0 动态优化

双向链接口

  1. gpu_list_node_t(链表节点)
  • key:键(用来索引)
  • data:数据指针(指向 GPU 内存 / NVMe 地址)
  • prev / next:双向链表指针
  1. gpu_list_t(链表总控)
  • head:链表头(最常访问)
  • tail:链表尾(最久未访问,LRU 淘汰)
  • node_pool:GPU 上预分配的节点内存池
  • max_nodes:最大节点数(缓存上限)

gpu_nvme

这是一个 GPU 直接访问 NVMe 固态硬盘的统一读写引擎,其核心作用是让 GPU 不经过 CPU、不经过系统内存,直接对 NVMe 硬盘进行异步读写

核心能力包括:

  • 初始化一套 GPU 直连 SSD 的底层环境
  • 管理多种读写模式(CUDA 文件 / 专用 NVMe 驱动 / GPU 内核)
  • 提供 异步读、写、刷新、批量提交 接口
  • 内部维护请求队列、完成队列、命令缓冲区
  • 支持请求合并、轮询完成、等待、取消、统计

从功能模块来说,主要是有以下能力:

  1. 辅助函数
  • 把工作模式转成字符串(AUTO/CUFILE/SNVME/GPU_KERNEL/HYBRID)
    把状态转成字符串(空闲 / 初始化中 / 就绪 / 错误 / 不可用)
  1. 初始化与销毁
  • 申请 GPU 内存:命令缓冲区、完成队列、PRP 地址列表、门铃缓冲区
  • 申请 pinned 内存用于请求池
  • 创建 CUDA 流(IO 流 + 轮询流)和事件
  • 自动选择最优 IO 模式
  • 销毁时统一释放所有 GPU/CPU 资源
  1. 模式管理
  • 获取当前工作模式
  • 动态切换模式(GDS / SNVME / GPU Kernel)
  • 检查模式是否可用
  1. 命名空间(NS)管理
  • 管理 NVMe 命名空间(类似硬盘分区)
  • 查询空间大小、扇区大小
  1. 请求提交(核心功能)
  • 提交 读请求:从 NVMe 读到 GPU 内存
  • 提交 写请求:从 GPU 内存写到 NVMe
  • 提交 Flush:数据落盘
  • 提交 批量请求
  • 每个请求生成唯一 request_id,内部构建 NVMe 原生命令
  1. GPU Kernel 实现
  • 设备端轮询完成队列
  • 设备端查询请求状态
  • 完全在 GPU 内部执行,不占 CPU
  1. 请求管理
  • 取消请求
  • 等待单个请求完成
  • 同步等待所有请求完成
  • 查询请求状态(pending/completed/failed/cancelled)
  1. 批量优化
  • 合并相邻读请求(按 LBA 排序 + 连续块合并)
  • 合并相邻写请求
  • 减少 IO 次数,提升吞吐量
  1. 统计
  • 总读写次数、总流量
  • 平均延迟
  • 模式切换次数、批量合并次数
  • 打印统计信息

本阶段提供一个一个工业级、支持多模式、GPU 直接访问 NVMe SSD 的零拷贝异步 I/O 引擎接口,面向超高吞吐 AI 训练、GPU 直存场景设计。

storage

这是 GGFS 实现 “GPU 优先、零拷贝、分布式高速 I/O” 的核心引擎代码。
核心架构为:

┌─────────────────────────────────────────────────────┐
│              zero_copy_dma引擎核心                │
├─────────────┬─────────────┬─────────────────────────┤
│  初始化模块  │  内存管理层  │      传输调度层         │
├─────────────┼─────────────┼─────────────────────────┤
│ • 绑定GPU    │ • 内存注册   │ • 异步传输队列          │
│ • P2P 检测   │ • 内存池管理 │ • 5 种传输类型封装      │
│ • RDMA 检测  │ • 分配/释放  │ • 完成事件 + 超时等待   │
│ • CUDA 流创建│ • 碎片合并   │ • 状态查询              │
└─────────────┴─────────────┴─────────────────────────┘
            │                  │
            ▼                  ▼
┌────────────────────┐ ┌─────────────────────┐
│    多GPU P2P 模块   │ │    RDMA 分布式模块   │
│ • 设备间互访检测    │ │ • 内存注册(lkey/rkey)│
│ • 启用/禁用P2P      │ │ • RDMA Read/Write   │
└────────────────────┘ └─────────────────────┘
                             │
                             ▼
┌─────────────────────────────────────────────────────┐
│                      统计监控层                      │
│ • 传输次数 / 总流量 / 带宽计算                      │
│ • P2P / RDMA / 零拷贝 分类统计                      │
│ • 状态打印 + 统计重置                               │
└────────────────────────

提供一个完整、成熟、可直接集成的 GPU 异步零拷贝数据传输库,实现了:

  • GPU / 主机内存高效管理(内存池)
  • 异步 H2D/D2H/D2D/P2P/RDMA 传输
  • 多 GPU P2P 支持
  • RDMA 分布式传输框架
  • 完整统计与状态查询

同时提供了一个完整、正式、可直接对外使用的 GPU 零拷贝异步传输库接口,实现:
GPU 内存管理 + 多 GPU P2P + RDMA 分布式传输 + 异步 DMA + 带宽统计

可作为高性能计算 / AI 分布式系统 / GPU 存储加速的底层核心组件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容