跳转至

Lustre 并行文件系统

背景知识
  • POSIX 文件系统语义:标准的 open/read/write/close 接口,应用无需感知底层存储拓扑
  • RDMA:远程直接内存访问,绕过 CPU 直接在网卡间传输数据,微秒级延迟 → 详见
  • InfiniBand / RoCE:HPC 集群主流高速互联协议 → 详见
  • NVMe-oF:将 NVMe 存储协议扩展到网络的框架 → 详见
  • GPUDirect Storage:存储设备直接访问 GPU 显存,绕过 CPU bounce buffer → 详见

Lustre 是 Top500 超算中使用最广泛的并行文件系统1,诞生于 Carnegie Mellon University,现由 OpenSFS / EOFS 社区维护。它的核心设计目标是:在数千节点的 HPC/AI 集群上,提供单一 POSIX 命名空间,同时达到 TB/s 级聚合 IO 带宽


1. 核心设计决策:元数据与数据分离

传统文件系统(ext4、XFS)将元数据和数据放在同一设备上,单机 IO 能力就是上限。Lustre 的第一个关键决策是把"文件叫什么、在哪里"和"文件内容是什么"拆到不同的服务器角色

┌─────────────┐   命名空间操作    ┌─────────────────────────┐
│  Client      │ ◄──────────────► │  MDS(Metadata Server)  │
│  (POSIX 挂载) │                  │  管理 MDT(Metadata Target)│
│              │   批量数据 IO     ├─────────────────────────┤
│              │ ◄──────────────► │  OSS(Object Storage Server)│
│              │                  │  管理 OST(Object Storage Target)│
└─────────────┘                  └─────────────────────────┘
                                 ┌────────┴────────┐
                                 │ MGS(Management  │
                                 │  Server)         │
                                 │ 管理 MGT:全局配置 │
                                 └─────────────────┘

设计权衡

收益 代价
元数据和数据可独立扩展——加 OSS 提吞吐,加 MDS 提元数据 IOPS 系统复杂度高:三种服务角色 + 网络协议 + 分布式锁
单次大文件读写只需联系 OSS,不经过 MDS(open 后直接 IO) 小文件场景 MDS 成为瓶颈(每个 create 都要走 MDS)
数据路径可利用所有 OSS 的聚合带宽 不做跨 OST 数据复制——可靠性依赖底层 RAID

关键数字2:单文件系统可扩展至数百台 OSS、数千个 OST,聚合容量数百 PB,聚合吞吐 TB/s 级。


2. 条带化(Striping):并行 IO 的核心机制

Lustre 的第二个关键决策是将文件数据切片分布到多个 OST,而非整文件存放在单一设备上。

工作原理

一个文件的字节流按固定大小(stripe_size,默认 1-4 MB)切分为条带,轮转分配到 stripe_count 个 OST:

文件逻辑视图:  [Chunk 0][Chunk 1][Chunk 2][Chunk 3][Chunk 4][Chunk 5]
                    │         │         │         │         │         │
物理分布:       OST-0     OST-1     OST-2     OST-0     OST-1     OST-2
                (stripe_count = 3, stripe_size = 4MB)

用户可控的条带参数

条带布局在文件创建时确定,后续修改需显式迁移(lfs migrate)。用户通过 lfs setstripe 逐文件或逐目录设置:

参数 含义 默认值
stripe_count 跨多少个 OST 条带化 1(由文件系统管理员设置)
stripe_size 每个条带的字节数 1-4 MB
stripe_index 起始 OST 索引 -1(MDS 自动均衡分配)

设计权衡

条带策略 适用场景 风险
高 stripe_count(如 32-128) 大文件并行 IO、MPI-IO 网络开销大,OST 故障影响面广
低 stripe_count(如 1-2) 小文件、元数据密集型 单 OST 带宽上限

关键约束:Lustre 默认不跨 OST 复制数据——条带化提升的是带宽,不是冗余。数据可靠性完全依赖 OST 底层的 RAID 或 ZFS 冗余。


3. LNet:自建网络协议层

Lustre 没有直接使用 TCP/IP 或 InfiniBand verbs,而是自建了 LNet(Lustre Networking)——一个内核态网络抽象层,解决两个问题:

  1. 多 fabric 抽象:同一套文件系统代码运行在 Ethernet、InfiniBand、OPA 等不同网络上,通过可插拔的 LND(Lustre Network Driver)适配
  2. RPC + RDMA 优化:所有 IO 走 Portal RPC(PTL-RPC),批量数据传输利用 RDMA 零拷贝

架构分层

Lustre 文件系统层(LLITE / LOV / MDC / OSC)
    PTL-RPC(Portal RPC:请求/响应 + 批量数据描述符)
      LNet(网络抽象:路由、Multi-Rail、负载均衡)
      LND(驱动层:socklnd = TCP,o2iblnd = InfiniBand/RoCE/OPA)

关键能力

  • 异构路由:LNet 路由器桥接不同网络(如 InfiniBand 集群 ↔ Ethernet 管理网),客户端无需直连所有服务器
  • Multi-Rail:同一节点的多块网卡聚合带宽 + 故障容错,对上层透明
  • 零拷贝:RDMA 场景下,OSS 直接 GET/PUT 客户端内存中的数据缓冲区,无需内核 bounce buffer

设计权衡:自建协议栈增加了维护成本和内核依赖(Lustre 必须以内核模块运行),但换来了极致的 IO 路径控制——从文件系统语义到网卡 DMA,全链路由 Lustre 管理。


4. LDLM:分布式锁保障 POSIX 一致性

数千客户端并发访问同一命名空间,POSIX 语义要求强一致性(如 read 必须看到最新 write)。Lustre 通过 LDLM(Lustre Distributed Lock Manager)实现:

锁类型 用途 粒度
Extent Lock 文件数据区间锁 字节范围(基于区间树)
Inode Bits Lock 元数据属性锁 按属性位(权限、大小、时间戳等)
Flock POSIX 文件锁 BSD / POSIX advisory

冲突处理流程

Client A 持有文件 F 的写锁(extent [0, 4MB])
Client B 请求 F 的 [2MB, 6MB] 区间的读锁
    → MDS/OSS 检测冲突
    → 向 Client A 发送 Blocking AST(回调)
    → Client A 刷新脏数据、释放锁(或降级为读锁)
    → Client B 获得锁,执行读取

设计权衡:强一致性保障了 POSIX 语义正确性,但锁冲突是性能杀手——大量客户端并发写同一文件时,Blocking AST 风暴会显著降低吞吐。实践中通过条带化(不同客户端写不同 OST 区间)和 lockahead hint 缓解。


5. 存储后端:ldiskfs vs ZFS

每个 Target(MDT/OST/MGT)是一个格式化的块设备,Lustre 支持两种后端:

维度 ldiskfs ZFS
本质 ext4 的 Lustre 定制分支 OpenZFS on Linux
内核补丁 需要(服务端) 不需要
最大单文件 31.25 PB 512 PB(理论值)
最大文件系统 512 PB 8 EB(理论值)
每 MDT 最大文件数 40 亿 256 万亿
数据校验 无端到端校验 端到端校验和
修复工具 e2fsck(离线) 无需 fsck(copy-on-write)
性能 低延迟,适合元数据密集 吞吐优,适合大容量 OST
部署复杂度 较高(需内核补丁) 较低(标准内核 + ZFS 模块)

选型权衡:ldiskfs 是历史默认选择,元数据操作延迟更低;ZFS 不需要内核补丁,提供数据完整性保障(对科学计算的长周期数据尤为重要),且扩展上限高一个数量级。


6. HA 设计:配对服务器 + 共享存储

Lustre 不做跨服务器数据复制,而是用共享存储 + 主备切换实现高可用:

┌──────────┐    共享存储柜    ┌──────────┐
│  OSS-A   │◄──────────────►│  OSS-B   │
│ (主:OST1,2) │  多端口 SAS/FC  │ (备:空闲)  │
└──────────┘                └──────────┘
       │                          │
       │  OSS-A 故障               │
       │  ──────────►              │
       │                    OSS-B 挂载 OST1,2
       │                    继续服务 IO

HA 构建单元:两台服务器 + 共享存储柜组成最小 HA 对。整个文件系统由多个 HA 对组成——每个 HA 对有确定的容量和吞吐,可线性扩展。

设计权衡

收益 代价
无复制开销——全部带宽用于应用 IO 需要多端口共享存储硬件
故障切换后数据零丢失(同一块设备) 切换期间服务短暂中断(秒级)
线性扩展——加 HA 对即可 单个 HA 对内无负载均衡(主备模式)

7. 与 AI 训练工作负载的关联

Lustre 在 AI 基础设施中的位置是存储网络层的并行文件系统3

AI 训练阶段 Lustre 的角色 关键需求
数据加载 数千 GPU 节点并发读训练数据 聚合读带宽(条带化 + 多 OSS)
Checkpoint 写入 周期性保存模型状态到共享存储 突发写带宽(大文件条带化)
数据预处理 批量读写中间结果 元数据 IOPS(大量小文件 create)

GPUDirect Storage 集成:Lustre 支持 NVIDIA GPUDirect Storage(GDS),数据从 OST 通过 RDMA 直达 GPU 显存,绕过 CPU bounce buffer,在大规模数据加载场景下显著降低延迟和 CPU 开销。


参考资料


  1. Lustre 为全球大量 Top500 超算提供存储服务,包括 ORNL(Oak Ridge)、LLNL(Lawrence Livermore)、Sandia 等美国能源部国家实验室。https://www.lustre.org/about/ 

  2. Lustre Wiki. Introduction to Lustre — Lustre Scalability. https://wiki.lustre.org/Introduction_to_Lustre 

  3. 本库 AI 基础设施文档中的存储网络层。详见 AI 基础设施 §1