一、准备工作与环境配置
1. 获取Vdbench工具
从Oracle官方网站下载最新版本的Vdbench工具包:
下载地址:http://www.oracle.com/technetwork/server-storage/vdbench-downloads-1901681.html
2. 部署工具包
将下载的工具包上传至测试服务器,并解压到指定目录。Vdbench为绿色软件,无需编译安装。
- Linux示例:上传至
/root目录,解压到vdbench50406文件夹,并赋予可执行权限。
- Windows:解压到任意目录即可。
3. 安装Java运行环境
确保系统中已安装正确版本的JRE(Java Runtime Environment)。
- Linux:建议使用JRE 1.7.45或更高版本。
- Windows:将JRE安装路径添加到系统环境变量
PATH中。
- AIX:需单独获取,版本需在1.6.20以上。
4. 验证工具可用性
在工具目录下执行快速测试命令,以检查环境是否配置正确。
# Linux
./vdbench -t
# Windows (在命令行中)
vdbench -t
说明:-t参数会启动一个简短的演示测试,对一个磁盘区域进行5秒的随机混合读写IOPS测试,并输出结果,用于快速验证工具是否可正常运行。
5. 运行完整测试
执行一次完整测试通常包含三个步骤:
- 准备好待测试的存储设备(LUN)。
- 编写测试参数配置文件(文件后缀名不限,如
.txt或.vdb)。
- 执行命令:
vdbench -f 参数文件 -o 输出目录。
说明:编辑参数文件时,避免使用中文标点。若未指定-o参数,测试结果将默认输出到当前目录下的output文件夹中。
二、测试参数文件详解
Vdbench的参数文件通常由以下5个部分组成,它们共同定义了测试的全局设置、主机、存储、负载模型和运行方式。
- Global (全局参数)
- Host Description (HD, 主机定义)
- Storage Description (SD, 存储定义)
- Workload Description (WD, 负载定义)
- Run Description (RD, 运行定义)
1. Global 全局参数
此部分定义适用于整个测试的通用设置。
| 参数名称 |
定义 |
dedupratio=xxx |
设定数据重删比率。 |
compratio=xxx |
设定数据压缩比率(使用LZ算法生成数据)。 |
dedupunit=xk |
设定重删数据块大小,需参考存储厂商建议配置。 |
histogram |
收集并统计I/O响应时间的分布情况。 |
messagescan=xxx |
定义是否扫描系统日志(yes/no/nodiskplay),建议设为no以避免无关日志干扰。 |
示例配置:
messagescan=no
histogram=(default,100u,200u,300u,…,9m,10m,…,30m,40m,50m…)
dedupratio=2
compratio=3
dedupunit=8k
技术要点:
- 若不指定重删压缩参数,工具默认生成1:1的数据。
- 存储最终达到的实际压缩比可能低于设定值,这取决于存储的压缩算法和落盘块大小。
histogram参数会生成详细的时延分布HTML报告。默认配置通常已满足大多数性能数据分析需求。
2. Host Description (HD) 主机定义
在多主机联机测试场景下必须定义,用于指定参与测试的服务器。
| 参数名称 |
定义 |
hd=default |
后续参数作为所有主机的默认值。 |
hd=host_label |
定义主机标签,用于标识和引用。 |
system=system_name |
指定主机IP地址或主机名(多机测试时使用)。 |
vdbench=工具路径 |
指定远程主机上vdbench的安装路径(所有主机需一致)。 |
shell=rsh|ssh|vdbench |
指定联机使用的命令协议。Linux推荐ssh,Windows可用vdbench。 |
示例配置(Linux多机):
hd=default,shell=ssh,vdbench=/root/vdbench504,user=root
hd=hd1,system=192.168.1.1
hd=hd2,system=192.168.1.2
配置前提:使用ssh时,需配置主控机与所有主机间的SSH免密互信,并将主机信息写入主控机的/etc/hosts文件。
3. Storage Description (SD) 存储定义
定义测试的目标存储设备(磁盘/LUN)及相关I/O设置。
| 参数名称 |
定义 |
sd=default |
后续参数作为所有存储设备的默认值。 |
sd=sd_id |
定义一个存储设备标识。 |
hd=host_label |
(多机测试)指定该存储设备所属的主机。 |
lun=path |
指定测试对象的设备路径。<br>Linux: /dev/sdb, /dev/mapper/mpatha<br>Windows: D:\ 或 \\.\PhysicalDrive2<br>AIX: /dev/rhdisk1 |
threads=xxx |
设定每个LUN的I/O并发线程数。 |
openflags=xxx |
设置I/O模式,通常用于启用Direct I/O绕过缓存。<br>Linux: o_direct<br>Windows: directio |
size=nnn |
指定测试区域大小,默认为整个LUN。 |
示例配置:
# Linux单机,Direct IO
sd=default,threads=12,openflags=o_direct
sd=sd11,lun=/dev/sdb
sd=sd12,lun=/dev/sdc
存储配置推荐:
- 当单主机性能或链路成为瓶颈时,建议采用多主机联机测试。
- 为充分压测存储性能,建议至少配置8个LUN参与测试。
- 测试空间总量应大于存储缓存容量的5倍,以避免缓存命中率虚高。
- 若存储启用了重删、压缩或Thin功能,在正式性能测试前,需先用非零、非重删压缩数据将测试空间填充一遍(预埋)。
4. Workload Description (WD) 负载定义
定义具体的I/O负载模型,即测试的访问模式。
| 参数名称 |
定义 |
wd=default |
后续参数作为所有负载的默认值。 |
wd=wd_id |
定义一个负载标识。 |
sd=sd_id |
指定施加此负载的存储设备,可用sd*代表所有设备。 |
rdpct=xxx |
设定读操作所占的百分比(默认100%)。 |
seekpct=xxx |
设定随机I/O的比例。100或random为全随机;0或sequential为全顺序。 |
xfersize=xx[k/m] |
设定每次I/O操作的数据块大小,默认4k。支持定义混合块大小。 |
示例配置:
# 8KB数据块,全随机访问,70%读 + 30%写
wd=wd_stress,sd=sd*,seekpct=100,rdpct=70,xfersize=8k
高级技巧:xfersize参数支持定义混合I/O,例如xfersize=(8k,50,16k,30,2k,20)表示50%的I/O为8k,30%为16k,20%为2k。
5. Run Description (RD) 运行定义
定义测试如何执行,包括时间、强度等运行参数。
| 参数名称 |
定义 |
rd=default |
后续参数作为所有运行定义的默认值。 |
wd=wd_id |
指定要执行的负载。 |
iorate=xxx |
限定I/O速率(IOPS)。可设固定值(如100)、递增序列(如(100-1000,100))或max(最大压力)。 |
elapsed=xxx |
测试总运行时间(单位:秒)。 |
interval=xxx |
测试结果打印输出间隔(单位:秒)。 |
warmup=xxx |
设定预热时间,此期间的数据不计入最终统计结果。 |
数据预埋(填充)示例:
在正式性能测试前,通常需要先进行数据填充,以构建稳定的重删压缩状态或覆盖整个测试空间。
# 定义存储设备(这里以8个LUN为例)
sd=default,threads=4,openflags=o_direct
sd=sd11,lun=/dev/sdb
sd=sd12,lun=/dev/sdc
... (sd13 到 sd18)
# 设置填充负载:256KB,100%顺序写
wd=wd_fill,sd=sd*,seekpct=0,rdpct=0,xfersize=256k
# 运行填充任务:以最大速率运行直到空间写满或超时(这里设为100小时)
rd=run_fill,wd=wd_fill,iorate=max,elapsed=360000,interval=1
三、测试脚本示例与结果分析
测试脚本示例
以下是两个完整的测试脚本示例,涵盖了单机和多机场景。
1. 单主机性能测试脚本 (single_host_test.vdb):
# 全局参数:模拟2:1重删,3:1压缩
dedupratio=2
compratio=3
dedupunit=8k
# 定义测试存储:8个LUN,每LUN12并发,Direct IO
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
# 定义负载模型:8KB,100%随机,70%读,30%写
wd=wd1,sd=sd*,xfersize=8k,rdpct=70,seekpct=100
# 定义运行方式:预热300秒,正式测试1800秒(30分钟),每秒打印结果
rd=run1,wd=wd1,iorate=max,elapsed=1800,interval=1,warmup=300
2. 多主机联机性能测试脚本 (multi_host_test.vdb):
# 全局参数
dedupratio=2
compratio=3
dedupunit=8k
# 主机定义:两台主机,使用SSH连接
hd=default,shell=ssh,vdbench=/home/vdbench504,user=root
hd=hd1,system=192.168.1.1
hd=hd2,system=192.168.1.2
# 存储定义:每台主机使用4个LUN,共8个LUN
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
# 负载模型:8KB,100%随机,70%读,30%写
wd=wd1,sd=sd*,xfersize=8k,rdpct=70,seekpct=100
# 运行方式
rd=run1,wd=wd1,iorate=max,elapsed=1800,interval=1,warmup=300
测试结果解读
执行测试后,Vdbench会在命令行界面实时打印结果,并在-o指定的输出目录(默认为./output)生成详细报告文件。
1. 实时输出关键指标:
在Linux命令行操作界面,每秒(根据interval设置)会打印一行统计数据,主要关注以下列:
- i/o rate: 当前IOPS。
- MB/sec: 当前带宽。
- bytes i/o: 平均I/O大小(混合负载下为加权平均)。
- read pct: 读操作百分比。
- resp time: 平均I/O响应时延(毫秒)。
- read/write resp: 读/写平均响应时延(毫秒)。
- resp max: 最大响应时延(毫秒)。
- queue depth: 总体队列深度(总并发数)。
2. 生成的结果文件:
测试结束后,在输出目录中会生成以下关键文件:
parmfile.html: 记录的测试参数文件,用于复现测试。
summary.html: 详细的测试结果汇总,与命令行输出一致。
totals.html: 整个测试周期的平均性能结果。
histogram.html: I/O响应时间的详细分布直方图,是分析时延特性的关键。
errorlog.html & logfile.html: 当测试过程中出现异常时,用于排查和定位问题。