做存储性能诊断这么多年,我手里最离不开的三把刀就是 fio、vdbench 和 ior。这三兄弟各有各的脾气,也各有各的绝活。今天我就把它们的安装、配置和典型用法掰开了揉碎了讲给你听。
一句话总结三者的定位:
- fio:Linux 环境下的全能型选手,块设备、文件系统都能测,参数极其灵活
- vdbench:Oracle 出品的存储验证工具,擅长模拟数据库、文件服务器等复杂负载
- ior:HPC 领域的标杆工具,专门用来测并行文件系统的带宽和 IOPS
3.1 fio:存储性能测试的瑞士军刀
3.1.1 安装
fio 的安装非常简单。我个人习惯用源码编译,因为能拿到最新特性。不过大多数场景下,包管理器就够了。
# CentOS/RHEL yum install fio -y # Ubuntu/Debian apt-get install fio -y # 源码编译(推荐,可以获取最新版本) wget https://github.com/axboe/fio/archive/refs/tags/fio-3.36.tar.gz tar -xzf fio-3.36.tar.gz cd fio-3.36 ./configure make -j$(nproc) make install我的经验:生产环境我建议用源码编译。有一次我在 CentOS 7 上用 yum 安装的 fio 版本是 2.x,结果不支持 io_uring 引擎,白白浪费了半天排查时间。源码编译虽然多花两分钟,但能避免很多坑。
3.1.2 典型场景配置
fio 的配置有两种方式:命令行参数和 job 文件。我个人更推荐 job 文件,尤其是做复杂测试时,可读性和可重复性都好很多。
场景一:4K 随机写,测 SSD 的极限 IOPS
[global] ioengine=libaio direct=1 bs=4k size=10G numjobs=4 time_based runtime=60 [randwrite-4k] rw=randwrite filename=/dev/sdb跑这个测试时,我一般会盯着 iostat 看。如果 IOPS 曲线平稳,说明 SSD 性能发挥正常。如果出现剧烈抖动,嗯,那就要检查一下是不是有垃圾回收或者过热降频了。
场景二:混合读写,模拟数据库负载
[global] ioengine=libaio direct=1 bs=8k size=50G runtime=120 time_based [oltp-mix] rw=randrw rwmixread=70 filename=/dev/sdc numjobs=870% 读、30% 写,这是典型的 OLTP 负载比例。我在项目中遇到过好几次,客户说数据库慢,结果一测发现混合读写场景下延迟飙升到 20ms 以上——最后定位到是存储控制器上的写缓存策略没开。
注意:fio 测试时,direct=1一定要加上。它绕过操作系统页缓存,直接压到存储设备上。如果不加,你测出来的可能是内存的速度,而不是磁盘的真实性能。
3.2 vdbench:Oracle 出品的存储验证利器
3.2.1 安装
vdbench 是 Java 写的,所以依赖 JDK。安装过程其实就是解压,但要注意版本匹配。
# 下载 vdbench(需要 Oracle 账号,或者从镜像站获取) wget https://.../vdbench50407.zip # 解压 unzip vdbench50407.zip -d /opt/vdbench # 验证安装 cd /opt/vdbench ./vdbench -t # 如果看到 "VDbench 5.04.07 - started" 就说明成功了避坑指南:我曾经在 RHEL 8 上跑 vdbench 5.04,结果报 Java 版本不兼容。后来发现 vdbench 5.04 需要 Java 8,而系统默认装的是 Java 11。解决办法是安装 Java 8 并设置JAVA_HOME环境变量。
3.2.2 典型场景配置
vdbench 的配置文件是文本格式的,核心概念是sd(存储定义)、wd(工作负载定义)和rd(运行定义)。
场景一:模拟文件服务器负载
compratio=2.5 sd=default,size=10g,openflags=o_direct sd=sd1,lun=/data/testfile1 sd=sd2,lun=/data/testfile2 sd=sd3,lun=/data/testfile3 sd=sd4,lun=/data/testfile4 wd=wd1,sd=sd*,xfersize=64k,rdpct=80,seekpct=50 wd=wd2,sd=sd*,xfersize=8k,rdpct=50,seekpct=80 rd=run1,wd=wd1,iorate=max,elapsed=300,interval=5 rd=run2,wd=wd2,iorate=max,elapsed=300,interval=5这个配置模拟了文件服务器的两种典型访问模式:大文件顺序读(64K,80% 读)和小文件随机访问(8K,50% 读)。seekpct=50表示 50% 的 I/O 是随机寻址,这个参数很关键,它决定了负载的随机程度。
场景二:多主机并发测试
vdbench 支持分布式测试,这是它的强项。你想想看,很多存储问题在单机下根本看不出来,一上多机并发就原形毕露。
# 在 master 节点上配置 hdb=default,vdbench=/opt/vdbench,user=root,shell=ssh hdb=hdb1,system=192.168.1.10 hdb=hdb2,system=192.168.1.11 hdb=hdb3,system=192.168.1.12 sd=sd1,lun=/dev/sdb,host=hdb1 sd=sd2,lun=/dev/sdb,host=hdb2 sd=sd3,lun=/dev/sdb,host=hdb3 wd=wd1,sd=sd*,xfersize=4k,rdpct=0 rd=run1,wd=wd1,iorate=max,elapsed=600这个配置让三台主机同时对各自的/dev/sdb做 4K 纯写入。我在项目中用这个配置发现过一个存储网关的瓶颈——单机写入能到 2GB/s,三台并发反而掉到 1.2GB/s,最后定位到是网关的 CPU 处理能力不够。
3.3 IOR:HPC 并行文件系统的标杆
3.3.1 安装
IOR 通常和 MPI 一起使用。安装稍微复杂一点,但掌握了套路其实不难。
# 安装依赖 yum install -y mpich mpich-devel autoconf automake libtool # 下载 IOR git clone https://github.com/hpc/ior.git cd ior # 编译安装 ./bootstrap ./configure --with-mpi=/usr/lib64/mpich make -j$(nproc) make install # 验证 mpirun -np 4 /usr/local/bin/ior -a POSIX -b 1g -t 1m -o /mnt/lustre/testfile注意:编译 IOR 时,--with-mpi的路径一定要指向你实际使用的 MPI 实现。我见过有人用 OpenMPI 编译,结果跑在 Intel MPI 环境里,直接报错。说白了,MPI 版本必须一致。
3.3.2 典型场景配置
场景一:Lustre 文件系统带宽测试
# 顺序写测试 mpirun -np 16 --hostfile hosts.txt \ /usr/local/bin/ior \ -a POSIX \ -b 4g \ -t 1m \ -w \ -o /mnt/lustre/ior_testfile \ -F \ -e \ -v # 顺序读测试 mpirun -np 16 --hostfile hosts.txt \ /usr/local/bin/ior \ -a POSIX \ -b 4g \ -t 1m \ -r \ -o /mnt/lustre/ior_testfile \ -F \ -e \ -v参数说明:-b 4g是每个进程写 4GB,-t 1m是传输块大小 1MB,-F是每个进程写独立文件。这个配置在 Lustre 上跑,16 个进程并发,通常能测出几十 GB/s 的聚合带宽。
场景二:MPI-IO 接口测试
IOR 支持多种 I/O 接口,除了 POSIX,还有 MPI-IO、HDF5、NetCDF 等。MPI-IO 接口能利用 MPI 的集体 I/O 优化,性能往往比 POSIX 好。
mpirun -np 32 \ /usr/local/bin/ior \ -a MPIIO \ -b 2g \ -t 4m \ -w -r \ -o /mnt/gpfs/testfile_mpiio \ -e \ -v \ -d 3-d 3是调试级别,输出详细信息。我第一次用 MPI-IO 接口时,发现性能比 POSIX 高了 30%,当时还以为是测错了。后来查文档才知道,MPI-IO 的 collective buffering 机制能合并小 I/O,减少元数据操作次数。
我的建议:做 HPC 存储性能测试时,一定要同时测 POSIX 和 MPI-IO 两种接口。如果 MPI-IO 性能明显低于 POSIX,那说明并行文件系统的 MPI-IO 优化没做好,或者客户端配置有问题。
3.4 三款工具的选择建议
| 场景 | 推荐工具 | 理由 |
|---|---|---|
| 单机磁盘/SSD 性能摸底 | fio | 轻量、灵活、参数丰富 |
| 数据库负载模拟 | vdbench | 支持复杂 I/O 模式和数据校验 |
| 并行文件系统带宽测试 | IOR | HPC 标准工具,支持 MPI 并行 |
| 多主机并发压力测试 | vdbench 或 IOR | 两者都支持分布式,vdbench 更灵活 |
| 文件系统元数据性能 | fio + mdtest | fio 测数据,mdtest 专门测元数据 |
最后说一句,工具只是手段,理解存储系统的行为才是根本。我见过有人拿着 fio 跑了一整天,出了几百页报告,结果连测试的是块设备还是文件系统都没搞清楚。你想想看,这样的测试有什么意义?
所以,我的习惯是:先想清楚要测什么,再选工具,最后才是跑测试。顺序别搞反了。