一、3FS 概述
1.1 系统定位
DeepSeek 3FS(Fire-Flyer File System)是一款面向 AI 训练与推理场景设计的高性能并行文件系统,通过融合现代 SSD 存储与 RDMA 网络技术,实现高达 6.6TiB/s 的吞吐量,支撑数据预处理、检查点保存、KVCache 查询等关键场景23。
1.2 核心优势
特性 | 描述 |
---|---|
高性能 | 180节点集群测试中实现 6.6TiB/s 读取吞吐量,单客户端峰值 40+GiB/s2 |
强一致性 | 基于 CRAQ(链式复制)协议实现 write-all-read-any 语义4 |
兼容性 | 支持 POSIX 文件接口与 FUSE 客户端,无缝对接现有应用5 |
扩展性 | 存储与网络带宽线性扩展,支持动态节点管理4 |
二、架构原理
2.1 系统组成
3FS 采用四层架构设计:
Cluster Manager(集群管理)
├─ Meta Service(元数据服务,FoundationDB 驱动)
├─ Storage Service(存储服务,CRAQ 协议)
└─ Client(FUSE/USRBIO 客户端)
所有组件通过 RDMA/InfiniBand 网络 互联4。
2.2 关键技术
-
元数据管理
采用存算分离设计,元数据持久化至 FoundationDB,支持事务操作与目录树语义翻译4。 -
存储服务
-
数据分块存储于多节点 SSD,3副本链式复制(CRAQ)
-
通过 Write-All-Read-Any 策略优化读性能4
-
-
客户端优化
-
FUSE 客户端:兼容 POSIX,但存在上下文切换瓶颈
-
USRBIO 原生客户端:用户态零拷贝设计,性能提升 3-5 倍4
-
三、环境安装
3.1 硬件要求
组件 | 规格要求 |
---|---|
网络 | RDMA(建议 InfiniBand) |
存储节点 | NVMe SSD,推荐 XFS/Ext4 文件系统 |
管理节点 | 多节点热备配置 |
3.2 软件依赖
# 基础依赖
sudo apt install libfuse3-dev rdma-core foundationdb
# 编译工具链
git clone https://github.com/deepseek-ai/3FS
cd 3FS && mkdir build && cd build
cmake .. -DUSE_RDMA=ON
make -j$(nproc)
3.3 集群配置
-
FoundationDB 部署
配置集群事务日志与元数据存储4 -
节点注册
通过mgmtd
服务管理节点心跳与租约(默认 60s 超时)4 -
客户端挂载
# FUSE 客户端 ./hf3fs_fuse /mnt/3fs -o allow_other # USRBIO 客户端(需代码集成) #include <3fs/usrbio.h>
四、核心代码分析
4.1 元数据服务(Meta Service)
// 元数据事务处理(foundationdb_transaction.cpp)
Status MetaService::createFile(const std::string& path) {
FDBTransaction* tr = db_->createTransaction();
fdb_transaction_set_option(tr, FDB_TR_OPTION_CAUSAL_READ_RISKY, 0);
// 目录树操作映射为 FoundationDB 事务
auto key = encodePathKey(path);
fdb_transaction_set(tr, key.data(), key.size(), "", 0);
return commitTransaction(tr);
}
设计亮点:
-
利用 FoundationDB 事务特性实现原子性操作4
-
元数据节点无状态设计支持横向扩展
4.2 USRBIO 高性能客户端
// 零拷贝 IO 路径(usrbio_io.cpp)
void UsrbioClient::submitIO(IoRequest* req) {
// 通过共享内存 RingBuffer 提交请求
io_ring_->submit_queue[head_ % capacity_] = *req;
__atomic_add_fetch(&head_, 1, __ATOMIC_RELEASE);
// RDMA 信号量通知
sem_post(&submit_sem_);
}
优化特性:
-
绕过内核态实现用户态零拷贝4
-
使用 RDMA 直接访问存储节点内存
-
异步 IO 模型提升并发处理能力
4.3 CRAQ 复制协议
// 链式复制处理(storage_craq.cpp)
void StorageNode::handleWrite(const Chunk& chunk) {
if (isChainHead()) {
// 向后续节点传播写操作
forwardToNextNode(chunk);
}
persistToDisk(chunk);
if (isChainTail()) {
// 反向发送确认信号
sendAckUpstream();
}
}
协议特性:
-
写操作沿节点链顺序传播
-
读操作可由任意副本响应
-
故障时自动重建复制链4
五、性能调优建议
-
小文件优化
使用 FFRecord 格式 合并小文件,头部记录偏移量与 CRC 校验值4 -
客户端选择
关键路径优先采用 USRBIO,非关键操作使用 FUSE -
网络配置
启用 RoCEv2 优化 RDMA 吞吐,调整 MTU 至 4096 字节
六、扩展阅读
-
火山引擎存储团队《3FS 架构分析与思考》45
通过 3FS 的开源,DeepSeek 展示了其在分布式存储领域的技术实力。该系统特别适合需要高吞吐、低延迟的 AI 训练场景,其设计思路对存储系统开发者具有重要参考价值。建议结合官方文档与性能白皮书进行深度调优24。