系列文章目录
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 目录:
$ export BUILD_DIR=$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系列文档:
3FS系列(一):存储新纪元的开篇——3FS编译调优与部署的工程实践
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读取性能了。
我们的测试结果如下:
性能指标
文件大小 | 读取耗时 |
---|---|
1G | 1.645s |
4G | 1.844s |
8G | 1.874s |
16G | 3.069s |
32G | 4.243s |
- 通过实测不同容量文件的顺序读取性能,我们发现USRBIO静态库在大文件读取中展现出显著的优化特性。
注:本评估严格基于实测数据,未引入推测性技术指标
End
本次分享到此结束,若文中有细节描述不清晰或纰漏,欢迎随时关注九章云极公众号与我们探讨。我们期待在评论区看到您对USRBIO的实践思考、或在相似场景下的性能优化经验,同时也欢迎您分享在测试USRBIO时遇到的挑战、指出文中测试方法的可优化点、提出最期待验证的下一个性能场景。
|我们是谁
提供本次实操教学的为九章云极研发人员。
九章云极,全称北京九章云极科技有限公司,2013年成立,致力于人工智能基础软件的规模化应用,融合了世界前沿的人工智能技术,以自主创新的“算力包”产品和智算操作系统为载体,为广大用户提供“算力+算法”一体化AI服务。
|文末彩蛋
最后,为大家呈现另一款通用性更高、成本更低的存储系统—— DataCanvas DingoFS分布式存储系统,该系统由北京九章云极科技有限公司开发,于2024年11月20日首次发表,并于2025年1月14日登记。DingoFS 因其高效的数据存储和管理、支持大规模数据的分布式存储、高可用性和可扩展性在业界独树一帜,更加适用于需要处理大量数据和要求高可靠性的应用场景。DingoFS 即将推出的新版将具备更佳的元数据性能。
DingoFS 核心特性如下:
- POSIX兼容性
提供与本地文件系统一致的操作体验,实现无缝系统集成
- AI原生架构
深度优化大语言模型工作流,高效管理海量训练数据集与检查点工作负载
- S3协议兼容
支持标准S3接口协议,实现对文件系统命名空间的便捷访问
- 全分布式架构
元数据服务(MDS)、数据存储层、缓存系统及客户端组件均支持线性扩展
- 卓越性能表现
兼具本地SSD级低延迟响应与对象存储级弹性吞吐能力
- 智能缓存加速体系
构建内存/本地SSD/分布式集群三级缓存拓扑,为AI场景提供高吞吐、低时延的智能I/0加速
|Alaya NeW算力云:让DeepSeek部署更简单!
借助 Alaya NeW算力云服务 提供的强大GPU资源,您可以轻松实现DeepSeek模型在云端的推理服务部署,并根据实际需求灵活使用算力,为技术创新与科研探索提供高效支持!
三步搞定一键部署,快速上手DeepSeek!
不想被复杂的配置流程困扰?别担心!只需三步,您就能轻松完成DeepSeek大语言模型的一键部署。立即行动起来吧!体验地址:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。