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。
示例说明
fsd2
、fsd3
、fsd4
与fsd1
类似,只是挂载路径不同(/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=40、
rdpct=80
:表示读写混合,百分比是读的比例。 - seekpct=seq:顺序访问(读写时的偏移行为)。
- seekpct=random:随机访问。
运行定义(rd)
rd=run1,wd=(wd1-wd2),iorate=max,elapsed=60,interval=1
- rd=run1:用来区分不同测试,比如 运行定义的名字(run definition name),这里叫
run1
。你可以后面写rd=run2
、rd=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