基本用法
安装Fio工具:sudo apt-get install fio
常用命令:
#连续读
fio -filename=/mnt/beegfs/testio -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=20G -numjobs=30 -runtime=120 -group_reporting -name=mytest
#随机读
fio -filename=/mnt/beegfs/testio -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=16k -size=20G -numjobs=30 -runtime=120 -group_reporting -name=mytest
#顺序写
fio -filename=/mnt/beegfs/testio -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=20G -numjobs=30 -runtime=60 -group_reporting -name=mytest
#随机写
fio -filename=/mnt/beegfs/testio -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=20G -numjobs=10 -runtime=60 -group_reporting -name=mytest
#混合读
fio -filename=/mnt/beegfs/testio -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=16k -size=20G -numjobs=30 -runtime=100 -group_reporting -name=mytest -ioscheduler=noop
压力测试
对beeGFS进行测试
通过sudo beegfs health capacity查看所有储存节点的状态如下:
5个盘都是健康的。
执行命令:sudo beegfs entry info /mnt/beegfs/testfio,得到结果如下:
我们要测试的文件/testfio分布在4个盘上,条带化策略是RAID0。
执行命令测试随机读取IO性能:fio -filename=/mnt/beegfs/testfio -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=4k -size=2G -numjobs=300 -runtime=120 -group_reporting -name=mytest
bs=4k代表4k的读取。 -numjobs代表线程数。测试结果如下:
对本地单盘进行测试
执行命令:fio -filename=/data1/zxl_data/testfio -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=4k -size=2G -numjobs=300 -runtime=120 -group_reporting -name=mytest
测试结果如下:
对通过NFS挂载的nasv3进行测试
执行命令:fio -filename=/mnt/nasv3/testfio -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=4k -size=2G -numjobs=300 -runtime=120 -group_reporting -name=mytest
测试结果如下:
进入nasv3,对本地RAID进行测试
执行命令:fio -filename=/data/activemembers/testfio -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs= 4k -size=2G -numjobs=300 -runtime=120 -group_reporting -name=mytest
测试结果如下:
注意:测试文件(2GB)相对于 RAID 卡缓存(通常为 1GB-4GB)来说尺寸较小,导致测试结果严重偏向于缓存性能,而不是 24 块物理 HDD 的真实随机读性能。这使得测试结果无法客观反映当工作集(Working Set)超出缓存大小时,系统的实际表现。
增加测试文件的大小到10G,执行命令:fio -filename=/data/activemembers/testfio -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs= 4k -size=10G -numjobs=300 -runtime=120 -group_reporting -name=mytest
测试结果如下:
横向对比结果分析
参数说明:
| 配置项 | 取值 | 配置说明 |
|---|---|---|
| 测试类型 | randread | 4K 随机读,对 IOPS 敏感,考验分布式系统的元数据管理与数据分片能力 |
| 块大小 | 4k | 小 IO 场景,是衡量存储系统随机性能的典型指标 |
| 队列深度 | iodepth=1 | 同步 IO 模式(psync 引擎),每次仅处理一个 IO 请求 |
| 并发线程数 | numjobs=300 | 超高并发,远超 HDD 和大多数 NAS 的物理处理能力,但可被 BeeGFS 的多盘并行特性分摊压力 |
| IO 引擎 | psync | 同步阻塞式 IO,每个线程都在等待磁盘响应 |
| 直接 IO | direct=1 | 绕过客户端文件系统缓存,直接测试后端存储性能 |
| 测试文件大小 | 2G | 大小适中,避免因文件过小导致数据被 NAS 缓存 |
| 测试时长 | 120s | 测试周期足够长,结果具有统计意义 |
实验结果横向对比
| 受测试设备 | IOPS | 平均延迟 | 优势场景 | 劣势场景 |
|---|---|---|---|---|
| /mnt/beegfs | 1619 | 184ms | 高并发随机读写、大规模数据并行处理 | 超高并发下存在长尾延迟,条带化配置需优化 |
| /data1/zxl_data | 680 | 439ms | 低并发顺序读写 | 随机读写性能差,无扩展性 |
| /mnt/nasv3 | 609 | 490ms | 多客户端共享存储 | 网络开销大,随机读写性能低 |
性能瓶颈定位
条带化配置未优化 (核心瓶颈)
- BeeGFS 的性能高度依赖条带大小和条带宽度配置:
- 条带宽度:需设置为等于磁盘数(4),确保数据均匀分布到所有磁盘;
- 条带大小:4K 随机读场景下,建议条带大小设置为
64K~256K(过小会增加元数据开销,过大则无法充分利用并行 IO)。 - 当前 2.38 倍的性能提升,低于 4 盘的理论上限,大概率是条带化配置未匹配 4K 随机读场景。
超高并发线程数 (次要瓶颈)
- 300 线程远超 BeeGFS 的最优并发数(通常分布式文件系统的最优并发线程数为
磁盘数 × 8~16,即 4 盘对应 32~64 线程)。 - 过多线程导致上下文切换开销增加和元数据服务器竞争加剧,是长尾延迟的主要原因。
- 300 线程远超 BeeGFS 的最优并发数(通常分布式文件系统的最优并发线程数为
元数据服务器性能 (潜在瓶颈)
- 随机读场景下,BeeGFS 需要频繁查询元数据服务器(MDS)获取数据块的物理位置。
- 如果 MDS 为单节点部署,且未使用 SSD 缓存元数据,会成为高并发下的性能瓶颈,导致尾部延迟升高。
对nas本身的阵列性能分析
IOPS结果分析:
| 指标 | 10G 文件 | 2G 文件 | 性能下降比例 |
|---|---|---|---|
| IOPS | 11.5k | 29.6k | 61.2% |
| 吞吐量 | 45.0 MiB/s | 116 MiB/s | 61.2% |
指标分析:
- 平均延迟显著升高:平均延迟从 10ms 飙升至 24ms,这直接反映了物理磁盘寻道和旋转延迟的影响。
- 中位数延迟是关键:中位数延迟从 0.109ms(典型缓存命中)猛增至 12.39ms,这是本次测试最核心的变化。这个数值大致等于物理硬盘的平均寻道时间(~8ms)加上旋转延迟(~4ms),完美印证了测试负载已经从 “缓存主导” 转变为 “物理磁盘主导”。
- 长尾延迟依然存在:99% 分位延迟为 156ms,说明在高并发下,仍然存在部分 IO 请求需要等待较长时间才能被处理,但整体分布相比上次更加平滑,没有出现上次那种因缓存未命中而导致的极端尖峰。
指标分析:
- 性能大幅回落:IOPS 和吞吐量均下降了约 60%。这是一个非常明确的信号,表明测试文件大小从 2G 增加到 10G,已经超出了 RAID 卡缓存的覆盖范围。系统不再能依赖高速缓存来响应大部分请求,必须频繁地访问物理硬盘,从而导致性能显著下降。
- 10G性能更真实:11.5k IOPS 的成绩,是这个 24 盘 RAID5 阵列在 4K 随机读场景下,更接近其物理极限的真实性能表现。
平均延迟分析:
| 指标 | 10G 文件 | 2G 文件 | 性能下降比例 |
|---|---|---|---|
| 平均延迟 | 24.14 ms | 10.04 ms | 增加 140% |
| 50% 分位延迟 | 12.39 ms | 0.109 ms | 增加约 113 倍 |
结论
文件系统在高并发下的比较:
- 4 盘 BeeGFS 系统在相同超高并发配置下,性能显著优于本地单 HDD 和 NFS NAS,充分验证了分布式并行存储的优势;
- 当前性能未达理论上限,后续可通过调整优化条带化配置,可有 30%~50% 的 IOPS提升空间;
- BeeGFS 适合高并发、大规模的高性能计算(HPC)和 AI 训练场景,是本地单盘和 NAS 的理想升级方案。
Nasv3的RAID5阵列的性能:
- RAID5阵列本身的IOPS即使没有命中缓存,也依旧表现优异,理论上不应该出现卡顿。
- 说明NFS文件系统严重限制了NasV3的并发性能。
前言
随着集群的扩大,原本的nas面临严重的IO压力,尤其是在多个用户的程序在大量从Nas上读数据集的时候,会发生严重卡顿。然而,在大模型时代,数据集已经不像以往几十G就能存下了,动辄上百G,甚至几个T的数据,全都存在本地磁盘又存不下。
于是矛盾出现了:nas能共享,容量够,但IO承载力不够;本地磁盘IO够,但没法共享,而且容量不够。而不同机器上的本地磁盘有不同程度的冗余,能不能把不同机器上的本地硬盘通过光纤互联组成一个大号的逻辑盘呢?
为了解决这个矛盾,zxl经过一番科学上网,发现了beeGFS这个开源的并行文件系统。搭建流程按照官网教程走下来的,中间遇到不少系统层面的问题,借助AI的力量解决。这里记录一下搭建过程。
集群的网络环境
以下信息需要记录在各个机器的/etc/hosts里。同时需要配置ssh免密登录,确保各个机器之前能够ssh免密互通。
192.168.128.80 GPC-08-IB
192.168.128.90 GPC-09-IB
192.168.128.10 GPC-10-IB
192.168.32.16 GPC-06-FIBRE
192.168.32.17 GPC-07-FIBRE
192.168.32.178 GPC-08-FIBRE
192.168.32.47 GPC-09-FIBRE
192.168.32.147 GPC-10-FIBRE
解释:GPC-09代表9号机,-IB后缀代表的是该IP走的是IB网卡,-FIBRE代表该IP走的是光纤。
目前所有机器都有光纤,但只有8,9,10号机器是有IB网卡的。
系统版本
| 节点名称 | 系统版本 | 光纤IP和hostname | IB网卡IP |
|---|---|---|---|
| GPC-06 | Ubuntu20.04 | 192.168.32.16 GPC-06-FIBRE | - |
| GPC-07 | Ubuntu20.04 | 192.168.32.17 GPC-07-FIBRE | - |
| GPC-08 | Ubuntu22.04 | 192.168.32.178 GPC-08-FIBRE | 192.168.128.80 GPC-08-IB |
| GPC-09 | Ubuntu22.04 | 192.168.32.47 GPC-09-FIBRE | 192.168.128.90 GPC-09-IB |
| GPC-10 | Ubuntu22.04 | 192.168.32.147 GPC-10-FIBRE | 192.168.128.10 GPC-10-IB |
方法
第一步:安装需要的依赖(需要在所有机器上上配置)
添加官方的源:wget https://www.beegfs.io/release/beegfs_8.2/gpg/GPG-KEY-beegfs -O /etc/apt/trusted.gpg.d/beegfs.asc
更新apt源(Ubuntu22.04):wget https://www.beegfs.io/release/beegfs_8.2/dists/beegfs-jammy.list -O /etc/apt/sources.list.d/beegfs.list;apt install apt-transport-https;apt update
如果是Ubuntu20.04:wget https://www.beegfs.io/release/beegfs_8.2/dists/beegfs-focal.list -O /etc/apt/sources.list.d/beegfs.list;sudo apt install apt-transport-https;sudo apt update
下载需要的依赖:
sudo apt install beegfs-mgmtd libbeegfs-license # management service; libbeegfs-license is only required to use enterprise features
sudo apt install beegfs-meta libbeegfs-ib # metadata service; libbeegfs-ib is only required for RDMA
sudo apt install beegfs-storage libbeegfs-ib # storage service; libbeegfs-ib is only required for RDMA
sudo apt install beegfs-client beegfs-tools beegfs-utils # client and command-line tools and utilities
如果网络不好,去官方网页版下载好之后上传deb本地安装即可。Ubuntu22.04对应的库,Ubuntu20.04对应的库
第二步:配置管理节点
这里选用8号机作为管理节点
在GPC-08上执行:sudo /opt/beegfs/sbin/beegfs-mgmtd --init
终端会输出日志,说明创建成功:Created new database version 3 at "/var/lib/beegfs/mgmtd.sqlite".
第三部:配置元数据节点
选择9号机作为元数据管理节点。
在GPC-09上执行:sudo /opt/beegfs/sbin/beegfs-setup-meta -p /data/beegfs_meta -s 09 -m GPC-08-FIBRE
解释一下:执行该命令之后,会在/data/目录下创建一个beegfs_meta的文件夹,该文件夹被作为储存元信息的文件夹使用。-s 09是我们给该节点取的名字。 -m后面跟的是hostname,告诉该机器的master是8号机。
输出如下日志,说明创建成功:
Preparing storage directory: /data/beegfs_meta
* Creating format.conf file...
* Creating server numeric ID file: /data/beegfs_meta/nodeNumID
Updating config file: /etc/beegfs/beegfs-meta.conf
* Setting management host: GPC-08-FIBRE
* Setting storage directory in config file...
* Disabling usage of uninitialized storage directory in config file...
* Fetching the underlying device...
Underlying device detected: /dev/sdb1
Fetching UUID of the file system on that device...
Found UUID 3bc520a2-9301-4789-9c3f-356d41ae28a1
Writing UUID to config file...
* Setting usage of extended attributes to: true
All done.
第四步:配置存储节点
这一步需要在每台机器上分别执行。以10号机为例
在GPC-10上执行:sudo /opt/beegfs/sbin/beegfs-setup-storage -p /data/beefgs_sotrage -s 10 -i 101 -m GPC-08-FIBRE
解释一下:执行之后会10号机/data/目录下创建一个beefgs_sotrage的文件夹 ,101表示该节点的第一个储存位置。同理,如果有多个盘,我们可以在其他盘上也创建一个文件夹, -i后面的数字改成102即可。这些符号的本质上是文本,不是数字,只是为了方便命名。
输出以下日志说明创建成功:
Preparing storage target directory: /data/beefgs_sotrage
* Creating format.conf file...
* Creating chunks directory...
* Creating buddymir directory...
* Creating target numeric ID file: /data/beefgs_sotrage/targetNumID
* Creating server numeric ID file: /data/beefgs_sotrage/nodeNumID
Updating config file: /etc/beegfs/beegfs-storage.conf
* Setting management host: GPC-08-FIBRE
* Appending to target directory list in config file...
* WARNING: Skipping append. Target directory seems to be included in current targets list already. ('-f' disables this check.)
* Disabling usage of uninitialized storage targets in config file...
All done.
第五步:配置客户端
这一步需要在每个机器上执行。
注意,默认的beeGFS在8.2版本中自动启用了RDMA,然而6,7号并没有IB网卡,这里先禁用一下客户端的RDMA功能,否则会启动失败。
第六步:创建连接认证
在管理节点上创建一个文件即可,执行如下步骤:
sudo dd if=/dev/random of=/etc/beegfs/conn.auth bs=128 count=1
sudo chown root:root /etc/beegfs/conn.auth
sudo chmod 400 /etc/beegfs/conn.auth
然后把该文件/etc/beegfs/conn.auth复制到每一个节点的/etc/beegfs/conn.auth上。
同时,在目录/etc/beegfs下用openssl自签名一个cert.pem和key.pem,并复制到每一台机器上。
自签名执行:sudo openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 3650 -nodes -subj "/CN=beegfs-mgmt" -addext "subjectAltName = DNS:beegfs-mgmt,IP:192.168.32.178"
注意:DNS:beegfs-mgmt,IP:192.168.32.178是必须的,这是8号机的IP,之后在使用管理节点增加/删除节点的时候会用到,否则会报TSL认证的错误。
第七步:启动
sudo systemctl start beegfs-mgmtd # 在管理节点执行
sudo systemctl start beegfs-meta # 在元节点执行
sudo systemctl start beegfs-storage # 在存储节点执行
sudo systemctl start beegfs-client # 在每个机器上执行
通缩systemctl status beegfs-storage命令可以看到储存节点的状态。
执行过命令sudo systemctl start beegfs-client 之后,可以看到/mnt/下多了一个beegfs nodev,一共52T,可用的24T。可以正常使用了。
最后一步:测一下大文件拷贝速度
右侧是9号机的负载,左侧是8号机的网络负载,可以看到大文件拷贝速度在234M/s差不多能吃满万兆,单个节点的网络在33M/s,说明beeGFS自动均衡了网络负载。
总结
本文基于现有集群的硬件、网络资源,在不花钱的情况下,搭建了一个并行文件系统。在使用方式上和以往的nas共享路径没差别,完美兼容现有工作流。
后记:PlanA是买一个阵列卡,买固态作为Raid缓存,加到nasv3上面,但价格感人。该方案是PlanB。










