系列文章目录
3FS系列(一):存储新纪元的开篇——3FS编译调优与部署的工程实践
3FS系列(二):3FS元数据性能深度拆解:那些在技术文档中找不到的实现细节
3FS系列(三):从源码到实测:3FS USRBIO静态库的编译与性能体验
引言
3FS 近期仍在持续被热议,在完成前篇所述的 3FS 元数据性能详测后,我们决定对 3FS 的另一项技术创新:FUSE 与 USRBIO 并行使用开展编译与性能体验。我们发现,3FS 兼顾了 FUSE 的易用性与原生接口 USRBIO 的高速优势,在大部分场景中直接使用 FUSE 挂载,几乎「零改动」就能把 AI 任务迁移到 3FS,而对极限性能需求,则使用 USRBIO 的零拷贝、批量异步提交机制,大幅减少系统调用与网络交互开销,这对于大规模深度学习集群而言是一个值得参考与借鉴的设计。它通过形式化验证确保系统在面临各种故障时仍然能够保持数据一致性与高可用,而 USRBIO 接口因其提供零拷贝 + 异步提交的批量 IO,对大规模并行、低延迟需求场景尤其有利。
本篇文章是九章云极 3FS 系列文章的第三篇,我们将通过一次操作实例为大家讲述 3FS USRBIO 静态库的编译与性能体验。
实例步骤如下:
前置说明
安装依赖环境
编译 3fs usrbio 静态库
下载 3FS 并应用补丁
预处理
编译
体验 usrbio 静态库
编写测试程序
链接 usrbio 静态库
验证测试程序
性能指标
前置说明
编译环境为 Ubuntu 22.04,这是 3FS 官方支持的版本
我们可以通过如下命令查询当前系统版本:
$ cat /etc/issue
Ubuntu 22.04.5 LTS \n \l
复制代码
默认的编译路径为当前用户的 Home 目录:
安装依赖环境
usrbio 的静态编译需要 gcc-12、g++12、clang-14 等编译环境及其他三方库依赖库,我们需要安装一下:
$ sudo apt update
$ sudo apt -y install cmake libuv1-dev liblz4-dev liblzma-dev libdouble-conversion-dev libdwarf-dev libunwind-dev libaio-dev libgflags-dev libgoogle-glog-dev libgtest-dev libgmock-dev libgoogle-perftools-dev google-perftools libssl-dev gcc-12 g++-12 libboost-all-dev build-essential git
复制代码
Ubuntu 下默认的 sh 指向为 dash,我们需要切换为 bash,否则编译可能会失败。
sudo ln -sf /usr/bin/bash /usr/bin/sh
复制代码
编译 3fs usrbio 静态库
1. 下载 3FS 并应用补丁
从 github 下载 3fs,并应用补丁:
$ cd ${BUILD_DIR}
$ git clone https://github.com/deepseek-ai/3fs
$ cd 3fs
$ git submodule update --init --recursive
$ ./patches/apply.sh
复制代码
2. 预处理
由于我们仅仅需要编译静态 3fs usrbio,不需要编译整个工程,我们可以预先处理一下项目根目录下的 CMakeLists.txt,减少一些不必要依赖和编译,下面的这几行可以注释掉:
#include(cmake/CodeCoverage.cmake)
#include(cmake/CLangFormat.cmake)
#include(cmake/CLangTidy.cmake)
#include(cmake/DumpConfig.cmake)
#include(cmake/ApacheArrow.cmake)
#add_subdirectory(tests)
#add_subdirectory(benchmarks)
复制代码
此外我们还需要预处理 src/lib/api/CMakeLists.txt 的文件,增加如下几行:
add_library(usrbio STATIC
$<TARGET_OBJECTS:hf3fs_api>
$<TARGET_OBJECTS:client-lib-common>
$<TARGET_OBJECTS:core-user-fbs>
$<TARGET_OBJECTS:common>)
复制代码
这样我们生成的 libusrbio.a 库会把依赖的 3FS 基础库 libcommon.a、 libcore-user-fbs.a 、libclient-lib-common.a 集成到 usrbio 中,方便后续集成。
3. 编译
$ cmake -S . -B build -DCMAKE_CXX_COMPILER=clang++-14 -DCMAKE_C_COMPILER=clang-14 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY=${BUILD_DIR}/3fs/build/lib
$ cmake --build build --target usrbio -j
复制代码
一切顺利的话,最后你应该会看到如下输出:
[100%] Linking CXX static library libhf3fs_api.a
[100%] Built target hf3fs_api
[100%] Linking CXX static library libusrbio.a
[100%] Built target usrbio
复制代码
在 ${BUILD_DIR}/3fs/build/lib 目录下会生成我们需要的.a 文件:
$ ls -ltr ${BUILD_DIR}/3fs/build/libs/
total 443180
-rw-rw-r--. 1 dingofs dingofs 48798 Apr 16 04:30 libcityhash-lib.a
-rw-rw-r--. 1 dingofs dingofs 171914 Apr 16 04:30 libabsl-lib.a
-rw-rw-r--. 1 dingofs dingofs 175306 Apr 16 04:30 lib3fs_liburing.a
-rw-rw-r--. 1 dingofs dingofs 27776 Apr 16 04:30 libversion-info.a
-rw-rw-r--. 1 dingofs dingofs 1204216 Apr 16 04:31 libfmt.a
-rw-rw-r--. 1 dingofs dingofs 688614 Apr 16 04:31 liblz4-lib.a
-rw-rw-r--. 1 dingofs dingofs 5429158 Apr 16 04:31 libzstd.a
-rw-rw-r--. 1 dingofs dingofs 9366042 Apr 16 04:31 libclickhouse-cpp-lib-static.a
-rw-rw-r--. 1 dingofs dingofs 5510568 Apr 16 04:31 libscn.a
-rw-rw-r--. 1 dingofs dingofs 112968332 Apr 16 04:31 libfolly.a
-rw-rw-r--. 1 dingofs dingofs 1385464 Apr 16 04:31 libmemory-common.a
-rw-rw-r--. 1 dingofs dingofs 8 Apr 16 04:31 libMonitorCollectorService-fbs.a
-rw-rw-r--. 1 dingofs dingofs 104703994 Apr 16 04:32 libcommon.a
-rw-rw-r--. 1 dingofs dingofs 8 Apr 16 04:32 libcore-service-fbs.a
-rw-rw-r--. 1 dingofs dingofs 550646 Apr 16 04:32 libcore-user-fbs.a
-rw-rw-r--. 1 dingofs dingofs 3075252 Apr 16 04:32 libmgmtd-fbs.a
-rw-rw-r--. 1 dingofs dingofs 1393496 Apr 16 04:33 libclient-lib-common.a
-rw-rw-r--. 1 dingofs dingofs 16181962 Apr 16 04:33 libmgmtd-stub.a
-rw-rw-r--. 1 dingofs dingofs 8 Apr 16 04:33 libstubs-common.a
-rw-rw-r--. 1 dingofs dingofs 49175366 Apr 16 04:35 libstorage-client.a
-rw-rw-r--. 1 dingofs dingofs 14345214 Apr 16 04:36 libmgmtd-client.a
-rw-rw-r--. 1 dingofs dingofs 417556 Apr 16 04:36 libstorage-fbs.a
-rw-rw-r--. 1 dingofs dingofs 9779966 Apr 16 04:37 libmeta-fbs.a
-rw-rw-r--. 1 dingofs dingofs 1902524 Apr 16 04:37 libhf3fs_api.a
-rw-rw-r--. 1 dingofs dingofs 115265020 Apr 16 04:37 libusrbio.a
复制代码
3fs usrbio 依赖第三方库 fmt、scn、folly,这些库已经编译好了,我们把三方库和 libusrbio.a 一并复制过去。
$ sudo mkdir -p /opt/usrbio
$ sudo cp libfmt.a libscn.a libfolly.a libusrbio.a /opt/usrbio
复制代码
另外把 usrbio 的头文件/hf3fs_usrbio.h 也复制过去:
sudo cp ${BUILD_DIR}/3fs/src/lib/api/hf3fs_usrbio.h /opt/usrbio/
复制代码
体验 usrbio 静态库
使用 usrbio 之前,你需要提前安装部署 3FS 文件系统,并且完成挂载。
安装部署过程可以参考我们此前发布的 3FS 系列文档:
https://xie.infoq.cn/article/de68f5e58c0c65e69961db07c
1. 编写测试程序
$ cat main.cc
#include <hf3fs_usrbio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
constexpr uint64_t NUM_IOS = 1024;
constexpr uint64_t BLOCK_SIZE = (32 << 20);
int main(int argc, char **argv) {
char* mountpoint = argv[1];
char* filename = argv[2];
struct hf3fs_ior ior;
hf3fs_iorcreate4(&ior,mountpoint, NUM_IOS, true, 0, 0, -1, 0);
struct hf3fs_iov iov;
hf3fs_iovcreate(&iov, mountpoint, NUM_IOS * BLOCK_SIZE, 0, -1);
int fd = open(filename, O_RDONLY);
hf3fs_reg_fd(fd, 0);
for (int i = 0; i < NUM_IOS; i++) {
hf3fs_prep_io(&ior, &iov, true, iov.base + i * BLOCK_SIZE, fd, i * BLOCK_SIZE, BLOCK_SIZE, nullptr);
}
hf3fs_submit_ios(&ior);
hf3fs_cqe cqes[NUM_IOS];
hf3fs_wait_for_ios(&ior, cqes, NUM_IOS, NUM_IOS, nullptr);
hf3fs_dereg_fd(fd);
close(fd);
hf3fs_iovdestroy(&iov);
hf3fs_iordestroy(&ior);
printf("read file :%s over!\n",filename);
return 0;
}
复制代码
2. 链接 usrbio 静态库
$ g++ main.cc -o main -I /opt/usrbio/ -L /opt/usrbio -lusrbio -lfolly -lfmt -lscn -l:libnuma.a -l:libdouble-conversion.a -l:libevent.a -l:libboost_filesystem.a -l:libboost_context.a -l:libglog.a -l:libgflags.a
复制代码
注意:前面已经通过包管理器安装了 usrbio 依赖的 libnuma、libdouble-conversion、libevent、boost 三方库,因此此处可以直接使用,并优先链接静态库。
$ ldd main
linux-vdso.so.1 (0x00007ffda67ef000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f1cf882b000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1cf8744000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f1cf8724000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1cf84fb000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1cf8ccb000)
复制代码
此处显示我们的 main 程序不再依赖任何第三方库了。
3. 验证测试程序
我们复制 main 程序到另外一台安装了 3FS 集群的环境来测试。
$ scp main dingofs@10.220.32.17:/home/dingofs/
复制代码
目前我们本地 3FS 的挂载点为/mnt/3fs,并且在挂载点创建了一个测试文件:example.bin
$ df /mnt/3fs
Filesystem 1K-blocks Used Available Use% Mounted on
hf3fs.zetyun 35145961472 530313216 34615648256 2% /mnt/3fs
$ ls -ltr /mnt/3fs
total 1150977
dr-xr-xr-x 1 root root 0 Jun 1 2023 3fs-virt
drwxr-xr-x 1 root root 0 Apr 9 10:43 10ef7f0d-86d5-4261-8e95-baed52056878
-rw-r--r-- 1 root root 1073741824 Apr 14 18:30 example.bin
复制代码
运行程序:
$ sudo ./main /mnt/3fs/ /mnt/3fs/example.bin
read file :/mnt/3fs/example.bin over!
复制代码
接下来就可以慢慢体验 usrbio 强大的 I/O 读取性能了。我们的测试结果如下:
性能指标
注:本评估严格基于实测数据,未引入推测性技术指标
End
本次分享到此结束,若文中有细节描述不清晰或纰漏,欢迎随时关注九章云极公众号与我们探讨。我们期待在评论区看到您对 USRBIO 的实践思考、或在相似场景下的性能优化经验,同时也欢迎您分享在测试 USRBIO 时遇到的挑战、指出文中测试方法的可优化点、提出最期待验证的下一个性能场景。
|我们是谁
提供本次实操教学的为九章云极研发人员。
九章云极,全称北京九章云极科技有限公司,2013 年成立,致力于人工智能基础软件的规模化应用,融合了世界前沿的人工智能技术,以自主创新的“算力包”产品和智算操作系统为载体,为广大用户提供“算力+算法”一体化 AI 服务。
|文末彩蛋
最后,为大家呈现另一款通用性更高、成本更低的存储系统—— DataCanvas DingoFS 分布式存储系统,该系统由北京九章云极科技有限公司开发,于 2024 年 11 月 20 日首次发表,并于 2025 年 1 月 14 日登记。DingoFS 因其高效的数据存储和管理、支持大规模数据的分布式存储、高可用性和可扩展性在业界独树一帜,更加适用于需要处理大量数据和要求高可靠性的应用场景。DingoFS 即将推出的新版将具备更佳的元数据性能。
DingoFS 核心特性如下:
提供与本地文件系统一致的操作体验,实现无缝系统集成
深度优化大语言模型工作流,高效管理海量训练数据集与检查点工作负载
支持标准 S3 接口协议,实现对文件系统命名空间的便捷访问
元数据服务(MDS)、数据存储层、缓存系统及客户端组件均支持线性扩展
兼具本地 SSD 级低延迟响应与对象存储级弹性吞吐能力
构建内存/本地 SSD/分布式集群三级缓存拓扑,为 AI 场景提供高吞吐、低时延的智能 I/0 加速
|Alaya NeW 算力云:让 DeepSeek 部署更简单!
借助 Alaya NeW 算力云服务 提供的强大 GPU 资源,您可以轻松实现 DeepSeek 模型在云端的推理服务部署,并根据实际需求灵活使用算力,为技术创新与科研探索提供高效支持!
三步搞定一键部署,快速上手 DeepSeek!
不想被复杂的配置流程困扰?别担心!只需三步,您就能轻松完成 DeepSeek 大语言模型的一键部署。立即行动起来吧!体验地址:
免费体验25度算力包,一键部署DeepSeek!
评论