存储性能测试工具——vdbench

1、简介

Vdbench 是由 Oracle 提供的一款开源存储性能测试工具,常用于模拟不同类型的磁盘或文件系统负载,评估存储设备或网络文件系统(如NFS、LUN等)性能表现。它支持多种测试模式,灵活定义主机、存储、工作负载等参数。

2. 特点

  • 跨平台:支持 Linux、Unix、Windows 等多平台运行。
  • 多负载类型:支持顺序/随机读写、混合 IO、不同块大小的读写测试。
  • 可扩展性强:可同时控制多台主机,支持分布式测试。
  • 可重复性:通过配置文件保证测试过程可复现,方便对比不同存储方案。
  • 多输出方式:支持实时终端输出与 HTML 格式报告。
  • 无需编译:Java 编写,只需有 JDK/JRE 即可运行。

3. 使用场景

  • 存储设备性能评估:如 HDD、SSD、NVMe、SAN、NAS、Ceph、DDN 等。
  • 文件系统压力测试:如 XFS、EXT4、ZFS、CephFS 等。
  • 存储系统调优验证:在调整缓存策略、块大小、RAID 级别等后验证效果。
  • 对比不同方案性能:如对比 NFS 与 iSCSI、不同硬盘类型或不同 RAID 配置。
  • 生产环境容量规划:预测在高负载情况下的存储系统响应。

4、安装部署

安装Java环境(Vdbench依赖Java运行环境)

[root@clickhouse-01 opt]# tar xf jdk-24_linux-x64_bin.tar.gz -C /usr/local/
[root@clickhouse-01 opt]# ln -s /usr/local/jdk-24.0.2/ /usr/local/java
[root@clickhouse-01 opt]# sed -i .ori '$a export JAVA_HOME=/usr/local/java \nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH \nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
[root@serverd opt]# source /etc/profile
[root@serverd opt]# java -version
java version "24.0.2"2025-07-15
Java(TM) SE Runtime Environment (build 24.0.2+12-54)
Java HotSpot(TM) 64-Bit Server VM (build 24.0.2+12-54, mixed mode, sharing)

解压Vdbench安装包

tar xzvf vdbench50407.tar.gz

进入Vdbench目录,执行测试:

./vdbench -t           # 测试Vdbench是否正常工作
./vdbench -f test1     # 执行名为test1的测试脚本

5、参数说明

Vdbench的测试脚本一般由几类定义组成:

  • hd(host define):定义参与测试的主机信息
  • sd(storage define):定义存储设备,如文件系统路径或块设备
  • wd(workload define):定义工作负载的参数,比如读写比例、块大小等
  • fsd(filesystem define):定义文件系统下的目录结构和文件属性
  • fwd(filesystem workload define):定义基于文件系统的具体工作负载
  • rd(run define):定义运行的测试计划,包括选用哪些工作负载、运行时长等

6、文件系统定义

主机定义(hd)

hd=default,vdbench=/root/vdbench50407/,user=root,shell=ssh
hd=hd1,system=c04
hd=hd2,system=c05
  • hd=default
    • vdbench= 指定Vdbench的安装路径。
    • user= 执行测试命令的用户(通常是root)。
    • shell=ssh 表示通过SSH连接远程主机执行测试。
  • hd=hd1,system=c04
    • 定义一个主机别名hd1,对应系统主机名c04
  • hd=hd2,system=c05
    • 定义第二台主机hd2,对应系统主机名c05

文件系统定义(fsd)

fsd=fsd1,anchor=/test1,width=1,depth=1,openflags=O_DIRECT,files=50,sizes=10m
fsd=fsd2,anchor=/test2,width=1,depth=1,openflags=O_DIRECT,files=50,sizes=10m
fsd=fsd3,anchor=/test3,width=1,depth=1,openflags=O_DIRECT,files=50,sizes=10m
fsd=fsd4,anchor=/test4,width=1,depth=1,openflags=O_DIRECT,files=50,sizes=10m
  • fsd1:文件系统定义的别名。
  • anchor=/test1:文件系统挂载点或目录路径,即测试目标路径。
  • width=1:目录的宽度,即每级目录下子目录个数(这里1表示不创建子目录)。
  • depth=1:目录深度(层数),1表示只在anchor目录下创建文件。
  • openflags=O_DIRECT:使用直接IO,绕过操作系统缓存,真实测量存储设备性能。
  • files=50:每个目录创建50个文件。
  • sizes=10m:每个文件大小10MB。
示例说明

fsd2fsd3fsd4fsd1类似,只是挂载路径不同(/test2、/test3、/test4)。

  • anchor=/test1 作为根目录(起点)。
  • width=1 表示每个目录里只创建 1 个子目录。
  • depth=1 表示只创建 1 层子目录,不往更深层创建。

目录结构会像这样:

/test1/dir1/file1
/test1/dir1/file2
...

如果改成 depth=2,那就会多一层目录:

/test1/dir1/dirA/file1
/test1/dir1/dirA/file2
...
  • depth=0 → 文件直接在 /test1 目录下。
  • depth=1 → /test1 下面一层子目录里有文件。
  • depth=2 → /test1 下面两层子目录里有文件。

文件系统定义(fwd)

#4k 随机读
fwd=fwd1,fsd=fsd1,host=hd1,fileio=random,fileselect=random,xfersizes=4k,operation=read,threads=32
fwd=fwd2,fsd=fsd2,host=hd1,fileio=random,fileselect=random,xfersizes=4k,operation=read,threads=32
fwd=fwd3,fsd=fsd3,host=hd2,fileio=random,fileselect=random,xfersizes=4k,operation=read,threads=32
fwd=fwd4,fsd=fsd4,host=hd2,fileio=random,fileselect=random,xfersizes=4k,operation=read,threads=32

#4k 随机写
fwd=fwd5,fsd=fsd1,host=hd1,fileio=random,fileselect=random,xfersizes=4k,operation=write,threads=32
fwd=fwd6,fsd=fsd2,host=hd1,fileio=random,fileselect=random,xfersizes=4k,operation=write,threads=32
fwd=fwd7,fsd=fsd3,host=hd2,fileio=random,fileselect=random,xfersizes=4k,operation=write,threads=32
fwd=fwd8,fsd=fsd4,host=hd2,fileio=random,fileselect=random,xfersizes=4k,operation=write,threads=32

#4k 读80%写20%
fwd=fwd9,fsd=fsd1,host=hd1,fileio=random,fileselect=random,xfersizes=4k,rdpct=80,threads=32
fwd=fwd10,fsd=fsd2,host=hd1,fileio=random,fileselect=random,xfersizes=4k,rdpct=80,threads=32
fwd=fwd11,fsd=fsd3,host=hd2,fileio=random,fileselect=random,xfersizes=4k,rdpct=80,threads=32
fwd=fwd12,fsd=fsd4,host=hd2,fileio=random,fileselect=random,xfersizes=4k,rdpct=80,threads=32

#4k 顺序读
fwd=fwd13,fsd=fsd1,host=hd1,fileio=sequential,fileselect=sequential,xfersizes=4k,operation=read,threads=32
fwd=fwd14,fsd=fsd2,host=hd1,fileio=sequential,fileselect=sequential,xfersizes=4k,operation=read,threads=32
fwd=fwd15,fsd=fsd3,host=hd2,fileio=sequential,fileselect=sequential,xfersizes=4k,operation=read,threads=32
fwd=fwd16,fsd=fsd4,host=hd2,fileio=sequential,fileselect=sequential,xfersizes=4k,operation=read,threads=32

#4k 顺序写
fwd=fwd17,fsd=fsd1,host=hd1,fileio=sequential,fileselect=sequential,xfersizes=4k,operation=write,threads=32
fwd=fwd18,fsd=fsd2,host=hd1,fileio=sequential,fileselect=sequential,xfersizes=4k,operation=write,threads=32
fwd=fwd19,fsd=fsd3,host=hd2,fileio=sequential,fileselect=sequential,xfersizes=4k,operation=write,threads=32
fwd=fwd20,fsd=fsd4,host=hd2,fileio=sequential,fileselect=sequential,xfersizes=4k,operation=write,threads=32

#4k 读40%写60%
fwd=fwd21,fsd=fsd1,host=hd1,fileio=sequential,fileselect=sequential,xfersizes=4k,rdpct=40,threads=32
fwd=fwd22,fsd=fsd2,host=hd1,fileio=sequential,fileselect=sequential,xfersizes=4k,rdpct=40,threads=32
fwd=fwd23,fsd=fsd3,host=hd2,fileio=sequential,fileselect=sequential,xfersizes=4k,rdpct=40,threads=32
fwd=fwd24,fsd=fsd4,host=hd2,fileio=sequential,fileselect=sequential,xfersizes=4k,rdpct=40,threads=32
  • fwd1:工作负载别名。
  • fsd=fsd1:绑定文件系统定义fsd1
  • host=hd1:指定主机hd1执行此工作负载。
  • fileio=random:访问模式,随机访问文件数据。
  • fileselect=random:随机选择文件。
  • xfersizes=4k:每次读写4KB数据。
  • operation=read:只做读操作。
  • threads=32:32个线程并发执行。
  • operation=write`表示写操作。
  • rdpct=80 表示读写混合比例,80%读20%写。
  • fileio=sequential 和 fileselect=sequential 表示顺序访问文件。

运行定义(rd)

rd=4kread,fwd=(fwd1-fwd4),fwdrate=max,format=yes,elapsed=60,interval=3
  • rd=4kread:运行计划名。
  • fwd=(fwd1-fwd4):指定运行 fwd1 到 fwd4 四个工作负载。
  • fwdrate=max:以最大速率运行。
  • format=yes:格式化文件,即首次运行时创建或清理测试文件。
  • elapsed=60:测试持续时间60秒。
  • interval=3:每3秒输出一次统计数据。

整体作用

用 fwd1 到 fwd4 这四个 workload 同时运行,IO 速率不限制,先初始化数据,持续 60 秒,每 3 秒记录一次性能数据。

7、块设备定义

主机定义(hd)

hd=default,vdbench=/root/vdbench50407/,user=root,shell=ssh
hd=hd1,system=c04
hd=hd2,system=c05
  • hd=default
    • vdbench= 指定Vdbench的安装路径。
    • user= 执行测试命令的用户(通常是root)。
    • shell=ssh 表示通过SSH连接远程主机执行测试。
  • hd=hd1,system=c04
    • 定义一个主机别名hd1,对应系统主机名c04
  • hd=hd2,system=c05
    • 定义第二台主机hd2,对应系统主机名c05
sd=sd1,host=hd1,lun=/dev/vdb,threads=32
sd=sd2,host=hd2,lun=/dev/vdb,threads=32
  • sd1:存储设备别名。
  • host=hd1:绑定主机hd1
  • lun=/dev/vdb:测试设备,块设备路径。
  • threads=32:使用32线程对该设备发起I/O请求。

块设备定义(wd)

4k 100%读
wd=wd1,sd=sd1,xfersize=4k,rdpct=100,openflags=o_direct
wd=wd2,sd=sd2,xfersize=4k,rdpct=100,openflags=o_direct

4k 100%写
wd=wd3,sd=sd1,xfersize=4k,rdpct=0,openflags=o_direct
wd=wd4,sd=sd2,xfersize=4k,rdpct=0,openflags=o_direct

4k 40%的读,60%写
wd=wd5,sd=sd1,xfersize=4k,rdpct=40,openflags=o_direct

4k 80%的读,20%的写
wd=wd6,sd=sd2,xfersize=4k,rdpct=80,openflags=o_direct

4k 顺序读100%
wd=wd7,sd=sd1,xfersize=4k,seekpct=seq,rdpct=100,openflags=o_direct

4k 随机读100%
wd=wd8,sd=sd1,xfersize=4k,seekpct=random,rdpct=100,openflags=o_direct

4k 顺序写100%
wd=wd9,sd=sd2,xfersize=4k,seekpct=seq,rdpct=0,openflags=o_direct

4k随机写100%
wd=wd10,sd=sd2,xfersize=4k,seekpct=random,rdpct=0,openflags=o_direct
  • wd1:工作负载别名。
  • sd=sd1:绑定存储设备sd1
  • xfersize=4k:每次读写4KB数据。
  • rdpct=100:100%读操作(读写比例)。
  • openflags=o_direct:直接IO,绕过缓存。

其他示例参数:

  • rdpct=0:表示纯写操作。
  • rdpct=40rdpct=80:表示读写混合,百分比是读的比例。
  • seekpct=seq:顺序访问(读写时的偏移行为)。
  • seekpct=random:随机访问。

运行定义(rd)

rd=run1,wd=(wd1-wd2),iorate=max,elapsed=60,interval=1
  • rd=run1:用来区分不同测试,比如 运行定义的名字(run definition name),这里叫 run1。你可以后面写 rd=run2rd=run3 分别做不同模式的测试。
  • wd=(wd1-wd2):指定本次运行要使用哪些 workload definition(wd 段)。
  • iorate=max:IO 速率控制。max 表示不限制 IOPS,由系统硬件性能决定速度,能跑多快跑多快。也可以写数字,比如 iorate=1000 表示固定 1000 IOPS。
  • elapsed=60:本次测试总时长 60 秒(不包括预热时间),到时间后自动停止。
  • interval=1:每 1 秒 采集一次性能数据(如 IOPS、延迟、带宽等),采样间隔小能看到更细的性能变化,但日志会更大。

整体作用

用 wd1 和 wd2 这两个 workload 同时运行,IO 速率不限制,持续 60 秒,每秒记录一次性能数据。

8、总结

参数说明
hd主机定义,指定测试机器及连接方式
fsd文件系统定义,指定文件目录结构及文件大小
fwd文件系统工作负载,指定文件访问模式和I/O类型
rd运行定义,指定运行的工作负载及运行时间
sd存储设备定义,指定块设备及线程数
wd块设备工作负载,指定读写比例、I/O大小、顺序等

声明:来自IT运维大爆炸,仅代表创作者观点。链接:https://eyangzhen.com/2219.html

IT运维大爆炸的头像IT运维大爆炸

相关推荐

关注我们
关注我们
购买服务
购买服务
返回顶部