
提到存储性能测试,除了专业的商业软件,很多工程师都会选择功能强大且免费的开源工具。其中,Vdbench 因其灵活的配置和对多种特性的支持,成为了一个非常受欢迎的选择。本文将带你从零开始,详细解析如何使用Vdbench进行全面的存储性能测试,包括工具准备、参数文件编写以及测试结果的分析。
一、 Vdbench工具准备与环境检查
-
下载与解压
首先,从Oracle官网下载最新版本的vdbench工具。下载后,将其上传至测试服务器。Vdbench无需编译安装,解压后即可使用。
- Linux示例:上传至
/root 目录并解压到 vdbench50406 目录,随后赋予主文件可执行权限。
- Windows示例:解压至任意目录,例如
C:\vdbench50406。
-
安装JRE
Vdbench基于Java运行,因此需要安装对应操作系统的Java运行时环境(JRE)。
- Linux: JRE版本需为1.7.45或更新。
- Windows: 将JRE的安装路径添加到系统环境变量
PATH 中。
- AIX: 需单独获取,版本需在1.6.20以上。
-
试运行验证
在运行正式测试前,先通过一个简单的演示命令来检查环境是否配置正确。
- Linux:进入vdbench目录,执行
./vdbench -t。
- Windows:打开CMD,进入vdbench目录,执行
vdbench -t。
说明:-t 参数会启动一个简单的演示测试,仅对一个磁盘区域进行5秒钟的随机混合读写IOPS测试并输出结果。这能快速验证当前系统环境是否可以正常运行vdbench。
-
正式运行流程
当环境验证通过后,正式的测试流程包含三个核心步骤:
- 准备待测试的存储(如挂载LUN)。
- 根据测试目标,编写参数文件(文件后缀不限,如
parmfile.txt, test.vdb)。
- 执行命令:
vdbench -f 参数文件 -o 测试结果输出目录。
说明:编辑参数文件时,注意不要使用中文标点作为分隔符。如果没有使用 -o 参数指定输出目录,vdbench会在当前目录自动创建 output 文件夹存放结果。
二、 Vdbench 存储测试参数文件编写详解
一份完整的Vdbench测试参数文件通常包含5个部分,它们按顺序定义了测试的全局设置、主机、存储、负载模型和运行方式。
1. Global 全局参数
全局参数用于设置整个测试的通用属性,例如数据重删和压缩的模拟。
| 参数名称 |
定义 |
dedupratio=xxx |
设定模拟的数据重删率。 |
compratio=xxx |
设定模拟的数据压缩率,vdbench使用lz算法生成可压缩数据。 |
dedupunit=xk |
设定重删块大小,建议遵循存储厂商的推荐配置。 |
histogram |
启用I/O响应时间分布统计。 |
messagescan=xxx |
可定义为 yes, no, nodiskplay。默认为 yes,即每5秒扫描一次系统日志。通常建议设为 no,避免无关日志干扰测试判断。 |
示例:
messagescan=no
histogram=(default,100u,200u,300u,…,9m,10m,…,30m,40m,50m…)
dedupratio=2
compratio=3
dedupunit=8k
说明:
- 若不指定重删压缩相关参数,工具默认生成无重删压缩(1:1)的数据。
- 存储最终达到的实际压缩比可能小于设定值,这取决于存储的压缩算法和下盘块大小。
histogram 的默认配置通常已足够进行性能数据分析,它会生成 histogram.html 报告。默认区间为:histogram=(default,20,40,60,80,100,200,400,600,800,1m,2m,4m,6m,8m,10m)。
2. Host Description 主机参数(可选)
在进行多主机联机测试时,必须定义此部分。单机测试则可忽略。
| 参数名称 |
定义 |
hd=default |
表明该行后续参数将作为所有主机的默认参数。 |
hd=host_label |
定义主机标签,用于交叉引用和报告标识。 |
system=system_name |
指定主机IP地址或网络名称。例如 system=192.168.1.100 或 system=localhost。 |
vdbench=工具路径 |
指定远程主机上vdbench的安装目录,所有主机路径应一致。 |
shell=rsh|ssh|vdbench |
指定联机使用的shell。Linux推荐 ssh(需配置互信),Windows无ssh/rsh时需设为 vdbench,并在从机执行 vdbench.bat rsh。 |
示例:
hd=default,shell=ssh,vdbench=/root/vdbench504,user=root
hd=hd1,system=192.168.1.1
hd=hd2,system=192.168.1.2
说明:Linux主机使用ssh联机时,需要配置SSH密钥互信,并将所有联机主机的信息写入主控机的 /etc/hosts 文件。
3. Storage Description 存储参数
这部分定义了要测试的具体磁盘或文件。
| 参数名称 |
定义 |
sd=default |
表明该行后续参数将作为所有存储定义的默认参数。 |
sd=sd_id |
定义一个存储设备ID。 |
hd=host_id |
联机测试时指定该存储所属的主机,默认为本机。 |
lun=xxx |
指定测试磁盘路径。 Linux:/dev/sd?, /dev/dm-?, /dev/mapper/mpath? Windows:D:\ 或 \\.\PhysicalDrive2 AIX:/dev/rhdisk? |
threads=xxx |
设定每个LUN的I/O并发数。 |
openflags=xxx |
通常用于启用Direct I/O,绕过系统缓存。 Linux:o_direct Windows:directio |
size=xxx |
指定测试区域大小,不指定则使用LUN全部空间。 |
说明:Windows主机使用GPT格式的磁盘进行性能测试时可能表现不佳,推荐使用MBR格式。
示例:
- Linux单主机Direct I/O:
sd=default,threads=12,openflags=o_direct
sd=sd11,lun=/dev/sdb
sd=sd12,lun=/dev/sdc
- Linux多主机联机Direct I/O:
sd=default,threads=12,openflags=o_direct
sd=sd11,hd=hd1,lun=/dev/sdb
sd=sd21,hd=hd2,lun=/dev/sdb
- Windows单主机Direct I/O:
sd=default,threads=12,openflags=directio
sd=sd11,lun=\\.\PhysicalDrive2
sd=sd12,lun=\\.\PhysicalDrive3
存储配置推荐:
- 当单机性能或链路带宽不足时,推荐使用多主机联机测试。
- 为获得稳定可靠的性能数据,建议至少配置8个LUN参与测试。
- 测试空间容量应大于存储缓存大小的5倍以上,以避免因缓存命中率过高导致数据失真。
- 如果待测存储启用了重删、压缩或Thin Provisioning功能,在正式性能测试前,需先使用非重删压缩的非零数据将测试空间完全填充一次。
4. Workload Description 负载参数
这里定义了I/O负载的具体模型,是模拟业务压力的核心。
| 参数名称 |
定义 |
wd=default |
表明该行后续参数将作为所有负载定义的默认参数。 |
wd=wd_id |
定义一个负载ID,如 wd=wd1。 |
sd=sd_list |
指定该负载作用于哪些存储设备。sd=sd* 代表所有LUN,也可指定范围如 sd=(sd1-sd4)。 |
rdpct=xxx |
定义所有I/O操作中读操作的百分比,默认为100%(全读)。 |
seekpct=xxx |
定义随机I/O的比例。100 或 random 表示全随机;0 或 sequential 表示全顺序。 |
xfersize=xx[k/m] |
定义每次I/O操作的数据块大小,单位KB或MB,默认为4k。 |
说明:xfersize 支持配置混合I/O块大小。例如 xfersize=(8k,50,16k,30,2k,20) 表示:50%的I/O为8K,30%为16K,20%为2K。
示例:8KB 块大小,70%读、30%写的全随机负载。
wd=wd_stress,sd=sd*,seekpct=100,rdpct=70,xfersize=8k
5. Run Description 运行参数
最后一部分定义了测试如何执行,包括时长、速率控制等。
| 参数名称 |
定义 |
rd=default |
表明该行后续参数将作为所有运行定义的默认参数。 |
wd=wd_list |
指定执行哪个负载,wd=wd* 代表运行所有已定义的负载。 |
iorate=xxx |
限定负载的IOPS速率。
iorate=100:固定100 IOPS。
iorate=(100,200,…):依次执行100,200… IOPS。
iorate=(100-1000,100):从100 IOPS开始,以100为步长递增至1000。
iorate=max:以存储能承受的最大IOPS运行(常用)。 |
elapsed=xxx |
测试执行的总时间,单位秒。 |
interval=xxx |
测试结果在控制台的打印间隔,单位秒。 |
warmup=xxx |
设定预热时间,此期间的数据不计入最终统计。 |
三、 实战脚本示例与测试结果分析
1. 数据预填充脚本
在正式性能测试前,通常需要用非零数据填充存储,尤其是测试重删压缩特性时。
-
单主机数据填充示例:
#定义测试存储
sd=default,threads=4,openflags=o_direct
sd=sd11,lun=/dev/sdb
sd=sd12,lun=/dev/sdc
sd=sd13,lun=/dev/sdd
sd=sd14,lun=/dev/sde
sd=sd15,lun=/dev/sdf
sd=sd16,lun=/dev/sdg
sd=sd17,lun=/dev/sdh
sd=sd18,lun=/dev/sdi
#设置运行参数 (顺序写,大块,填满空间)
rd=run1,wd=wd_fill,iorate=max,elapsed=360000,interval=1
说明:此脚本使用256KB顺序写(默认),以最大速率填充8个LUN(每个4并发),直到空间写满或达到elapsed时间。
-
多主机联机数据填充示例:
主机定义部分:
#多台服务器联机测试配置
hd=default,shell=ssh,vdbench=/home/vdbench504,user=root
hd=hd1,system=192.168.1.1
hd=hd2,system=192.168.1.2
存储与运行定义部分:
#定义测试存储
sd=default,threads=12,openflags=o_direct
sd=sd11,hd=hd1,lun=/dev/sdb
sd=sd12,hd=hd1,lun=/dev/sdc
sd=sd13,hd=hd1,lun=/dev/sdd
sd=sd14,hd=hd1,lun=/dev/sde
sd=sd21,hd=hd2,lun=/dev/sdb
sd=sd22,hd=hd2,lun=/dev/sdc
sd=sd23,hd=hd2,lun=/dev/sdd
sd=sd24,hd=hd2,lun=/dev/sde
#设置运行参数
rd=run1,wd=wd_fill,iorate=max,elapsed=360000,interval=1
2. 性能测试脚本
-
单主机性能测试示例:
dedupratio=2
compratio=3
dedupunit=8k
#定义测试存储
sd=default,threads=12,openflags=o_direct
sd=sd11,lun=/dev/sdb
sd=sd12,lun=/dev/sdc
sd=sd13,lun=/dev/sdd
sd=sd14,lun=/dev/sde
sd=sd15,lun=/dev/sdf
sd=sd16,lun=/dev/sdg
sd=sd17,lun=/dev/sdh
sd=sd18,lun=/dev/sdi
#设置I/O模型,8K 全随机,7:3混合读写
wd=wd1,sd=sd*,xfersize=8k,rdpct=70,seekpct=100
#设置运行参数
rd=run1,wd=wd1,iorate=max,elapsed=1800,interval=1,warmup=300
说明:模拟重删比2:1,压缩比3:1。在8个LUN上,以12并发进行Direct I/O测试。负载为8KB全随机,70%读/30%写。预热300秒后,正式运行1800秒(30分钟),每秒打印一次结果。
-
多主机联机性能测试示例:
dedupratio=2
compratio=3
dedupunit=8k
#多台服务器联机测试配置
hd=default,shell=ssh,vdbench=/home/vdbench504,user=root
hd=hd1,system=192.168.1.1
hd=hd2,system=192.168.1.2
#定义测试存储
sd=default,threads=12,openflags=o_direct
sd=sd11,hd=hd1,lun=/dev/sdb
sd=sd12,hd=hd1,lun=/dev/sdc
sd=sd13,hd=hd1,lun=/dev/sdd
sd=sd14,hd=hd1,lun=/dev/sde
sd=sd21,hd=hd2,lun=/dev/sdb
sd=sd22,hd=hd2,lun=/dev/sdc
sd=sd23,hd=hd2,lun=/dev/sdd
sd=sd24,hd=hd2,lun=/dev/sde
#设置I/O模型,8K 全随机,7:3混合读写
wd=wd1,sd=sd*,xfersize=8k,rdpct=70,seekpct=100
#设置运行参数
rd=run1,wd=wd1,iorate=max,elapsed=1800,interval=1,warmup=300
四、 Vdbench 测试结果解读
-
控制台实时输出
执行测试时,vdbench会在命令行界面按 interval 设定的间隔打印结果。你需要关注以下关键指标:
- i/o rate:即IOPS(每秒I/O操作数)。
- MB/sec:带宽。
- bytes i/o:平均I/O大小(混合负载时取平均值)。
- read pct:读操作百分比。
- resp time:平均响应延迟(单位:毫秒)。
- read resp / write resp:读/写平均延迟。
- resp max:最大响应延迟。
- queue depth:测试总并发数。
-
最终结果文件
测试结束后,vdbench会在输出目录(默认为 ./output)生成一系列HTML和文本报告。主要关注以下几个文件:
parmfile.html:完整的测试参数文件,用于记录和复现测试。
summary.html:详细的测试结果序列,与控制台输出一致。
total.html:整个测试周期的平均结果汇总,是评估整体性能的主要依据。
histogram.html:I/O响应时间的分布直方图,对于分析延迟长尾效应至关重要。
errorlog.html & logfile.html:当测试运行中出现异常时,用于定位问题。
通过合理组合上述参数模块,你可以灵活模拟出各种真实的业务I/O场景,从而对存储系统的性能、稳定性和功能特性进行全面评估。掌握Vdbench的使用,是每一位存储运维工程师或测试工程师都应具备的基础技能。希望这篇实战指南能帮助你在工作中更高效地进行存储性能基准测试。如果你想深入探讨测试案例或获取更多工具资源,欢迎来云栈社区交流分享。
|