一、概念
Vdbench 是 Oracle 开源 Java 编写的存储性能压测工具 ,支持裸块设备、文件系统、多客户端集群压测,可测 IOPS、带宽、延迟、数据校验,擅长模拟真实文件目录业务负载(优于 FIO 文件场景)。
二、vdbench 四大核心配置块
1、HD(Host Definition 主机定义)
全局默认模板
hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh,jvms=2
多节点
hd=hd1,system=ipv4_1
hd=hd2,system=ipv4_2
-
system:远端主机 IP / 主机名,主机之间建立 ssh 免密
-
shell=ssh:Linux 集群标配,要求免密 ssh 互通,单机不要该参数
-
jvms:单台机器启动多少个 Java 进程分担压力
-
hd=localhost:单节点本地测试可简写
2、FSD(File System Definition 文件池结构定义)
定义共享目录、目录层级、文件数量、单文件大小
fsd=fsd1,anchor=/testShare1/64KB/,depth=2,width=50,files=300,size=64k,shared=yes
-
anchor:共享存储挂载根目录
-
depth:目录层数,目录层级结构
-
width:目录数量,目录层级结构
-
files:底层存储每个子目录文件数量
-
size:底层存储单文件大小
-
shared=yes:多节点读写同一套文件池(NFS/CephFS 必备),单机值为:no
3、FWD(File Workload Definition 文件负载模板)
定义文件创建、读写、删除的压力规则;支持多模板(format/default)
格式化专用模
fwd=format,threads=24,xfersize=32k,openflags=o_direct
业务读写默认模板
fwd=default,rdpct=60,fileio=random,threads=24
绑定主机执行负载
fwd=fwd1,fsd=fsd1,host=hd1
fwd=fwd2,fsd=fsd1,host=hd2
-
fwd 参数介绍:
-
fwd=format:系统内置名称,专门初始化创建文件
-
fwd=default:业务读写默认配置,不带参数的 fwd 自动继承
-
fwd1/fwd2:实际执行负载实例,只绑定资源、不写压力参数
-
-
xfersize:单次 IO 传输块大小,也就是每次读写操作一次性读写多少数据
-
openflags:是否绕过操作系统 Page Cache 页缓存,决定测出来的是缓存性能还是底层存储真实硬件性能,扩展组合,直写 + 强制落盘(o_direct,o_sync)
-
fileio=random/sequential:文件内偏移随机 / 顺序读写
-
fileselect=random:随机挑选文件操作
-
host=hd1:指定在哪台 HD 节点执行压力
4、RD(Run Definition 运行调度定义)
文件场景关键字段换成
fwd=fwd*、fwdraterd=rd1,fwd=fwd*,fwdrate=max,format=restart,elapsed=600,warmup=60
-
fwdrate=max:文件场景限速参数,打满性能;填数字为限制 IOPS 上限
-
format=restart:文件初始化策略
-
restart:先校验已有文件,齐全就复用;缺失 / 大小不对就补建,不全盘删除重建
-
yes:强制清空本次 fsd 对应的整套目录结构,全部删除后从零完整重建所有文件
-
no:完全不执行任何创建、修复文件动作,直接进入读写压测
-
-
elapsed:正式压测时长 (秒)
-
warmup:预热时间,消除缓存波动
-
interval:几秒输出一次实时性能日志
三、vdbench 配置案例
1、单节点测试案例
messagescan=no
hd=localhost,vdbench=/root/vdbench50406,user=root
fsd=fsd1,anchor=/testShare1/64KB/,depth=2,width=50,files=300,size=64k,shared=no
fwd=format,threads=24,xfersize=32k,openflags=o_direct
fwd=default,xfersize=32k,fileio=random,fileselect=random,rdpct=60,threads=24,openflags=o_direct
fwd=fwd1,fsd=fsd1
rd=rd1,fwd=fwd*,fwdrate=max,format=restart,warmup=60,elapsed=600,interval=1
2、多节点测试案例
messagescan=no
hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh
hd=hd1,system=ipv4_1
hd=hd2,system=ipv4_2
fsd=fsd1,anchor=/testShare1/64KB/,depth=2,width=50,files=300,size=64k,shared=yes
fwd=format,threads=24,xfersize=32k,openflags=o_direct
fwd=default,xfersize=32k,fileio=random,fileselect=random,rdpct=60,threads=24,openflags=o_direct
fwd=fwd1,fsd=fsd1,host=hd1
fwd=fwd2,fsd=fsd1,host=hd2
rd=rd1,fwd=fwd*,fwdrate=max,format=restart,warmup=60,elapsed=600,interval=1
四、vdbench 输出分析
| html 文件 | html 说明 |
|---|---|
| anchors.html | 文件系统测试专用,汇总所有 fsd=xxx 的 anchor 挂载目录、目录层级 (width/depth)、文件数量、单文件大小、预分配规则;快速核对你配置的测试文件结构是否和预期一致。 |
| config.html | 完整解析后的运行配置:HD/SD/FSD/FWD/RD 全部参数展开、默认值覆盖、命令行附加参数 (-i/-jn/-w 等)、Java 环境、操作系统版本;核对实际生效配置,排查参数写错不生效问题。 |
| errorlog.html | 仅开启 -jn 数据校验时生成:校验失败、数据块错乱、读写不匹配、CRC 错误、文件损坏记录;验证存储数据可靠性、纠删 / 副本是否丢数据必看。 |
| flatfile.html | 结构化原始性能 CSV 格式数据,全量 interval 细粒度数值;可复制到 Excel/Python 绘图、自定义二次分析、批量对比多轮测试曲线。 |
| format.historgram.html | 格式化阶段单独的时延分布直方图:预埋写操作的各区间延迟计数,看预埋阶段存储是否已经瓶颈。 |
| format.html | 文件系统格式化预埋全过程日志:创建目录树、生成测试文件、填充初始数据、文件大小校验、每个 fsd 的格式化耗时、写入量、IO 性能;预埋慢、文件创建失败排查用。 |
| fsd1.histogram.html | fsd1 读写 I/O 延迟分布直方图,横轴时延区间、纵轴 IO 数量,直观看长尾高延迟占比(判断抖动、慢盘、缓存颠簸)。 |
| fsd1.html | 单个文件系统定义 fsd1 独立性能报表:该目录下所有聚合 IO、IOPS、带宽、读写时延、线程深度;多挂载点对比性能时分开看每个 fsd 表现。 |
| fwd1.histogram.html | fwd1 负载单独时延直方图,区分读写延迟分布。 |
| fwd1.html | 文件系统工作负载 fwd1 明细:绑定 fsd1 的线程数、文件随机 / 顺序模式、块大小、实时每个 interval 的负载指标;多 fwd 负载拆分时看单任务压力。 |
| histogram.html | 全局合并读写延迟直方图,所有 fsd/fwd 负载合在一起的延迟分布,整体抖动、长尾延迟最直观参考。 |
| localhost-0.html | 本地第一个工作进程(slave 进程 0)资源细分,单机一般只有localhost-0。 |
| localhost-0.stdout.html | 本地子进程 stdout/stderr 日志,Java 子线程异常、系统调用报错、挂载点访问权限报错在这里。 |
| localhost.html | 本机系统资源总监控:CPU 使用率、内存、磁盘繁忙度、队列、系统负载;判断性能瓶颈是存储本身还是客户端 CPU / 内存顶满。 |
| localhost.var_adm_msgs.html | 抓取系统 /var/adm/messages 系统日志;内核 IO 报错、硬件故障、文件系统报错、OOM、挂载掉线会同步记录在此。 |
| logfile.html | 控制台标准输出完整副本,vdbench 运行全程打印日志、阶段切换、定时打点、内部调试信息;通用排错首选日志文件。 |
| parmfile.html | 原样保留你输入的.conf脚本原文 + 命令行启动参数,原始配置存档,方便复现测试场景、对比多轮配置差异。 |
| parmscan.html | 配置语法扫描日志:vdbench 加载脚本时的解析过程、警告、参数冲突、无效参数、弃用参数提示;配置报错、参数不识别时看这里定位语法问题。 |
| skew.html | 负载倾斜统计:多线程 / 多 fwd 之间 IO 分配不均程度、每个线程完成 IO 量差值;排查线程调度不均、锁竞争、元数据瓶颈。 |
| status.html | 测试运行状态快照:预热阶段、格式化阶段、正式压测阶段、结束收尾的分段时间、每个阶段是否正常跑完、异常终止标记;排查测试中途中断、时长不对先用它。 |
| summary.html | 总汇总报告,每一个 interval(采样周期)的全局指标:总 IOPS、总带宽 MB/s、平均读写时延、读写占比、队列深度、总成功 IO 数。打开报告优先看这个,判断整体性能表现。 |
| swat_mon.bin | 二进制 SPM (Swat Performance Monitor) 格式文件,对接 Oracle SWAT 工具做深度负载回放与性能可视化;普通对比测试一般不用,仅专业存储分析场景导入专用工具绘图。 |
| totals.html | 全周期平均值,只输出整个测试全程最终汇总数值(无 interval 分段),用于最终归档对比:总平均 IOPS、总带宽、总平均时延、最大最小时延、总数据读写总量。 |
快速排查优先级
- 看结果:summary.html → totals.html → histogram.html
- 核对配置:config.html/parmfile.html
- 报错异常:errorlog.html → logfile.html → localhost.var_adm_msgs.html
- 分挂载点对比:fsd1.html/fwd1.html 及各自 histogram
- 二次绘图分析:flatfile.html
- 配置语法问题:parmscan.html
- 预埋慢 / 失败:format.html + format.historgram.html
totals.html 分析:
- 第一轮:RD=format_for_rd1(文件预埋格式化阶段)
- 第二轮:RD=rd1(正式 600s 只读压力测试)
- 所有数值是全周期平均汇总值,不是每秒 interval 采样,是整段测试最终均值。

| 字段 | 数值 | 含义 |
|---|---|---|
| ReqstdOps(总 IOPS) | 167.8 | 预埋阶段整体操作速率 167.8 ops/s |
| resp(总平均时延,单位 ms) | 0.010 | 整体操作平均耗时 0.010ms |
| cpu% sys(系统 CPU 占比) | 2.1 | 内核态 CPU 使用率 2.1% |
| cpu% pct(总 CPU 占比) | 1.42 | 整机客户端总 CPU 占用很低,无 CPU 瓶颈 |
| read rate / read resp | 0.0 / 0.000 | 格式化阶段无读 IO |
| write rate(写 IOPS) | 167.8 | 预埋全是写入操作,写 IOPS = 总 IOPS |
| write resp(写平均时延 ms) | 0.010 | 写入平均延迟 0.01ms,写入响应极快 |
| mb/sec read | 0.00 | 无读带宽 |
| mb/sec write | 0.66 | 写入带宽 0.66MB/s |
| mb/sec total | 0.66 | 总带宽等于写带宽 |
| xfer size | 4095 | 单次写入块大小 4KB(和测试配置 4k 匹配) |
关键对比与结论
- 负载形态差异
- format 阶段:纯 4K 写 + 大量目录 / 文件创建元数据,IOPS 167.8
- rd1 压测:纯 4K 读,IOPS 509.3,读性能≈写入 3 倍
- 延迟表现极好 读平均延迟 0.003ms,写预埋 0.010ms,说明底层存储介质(共享存储 / 云盘)响应速度快,无明显抖动。
- 客户端资源无瓶颈 两轮 CPU 占用都<3%,可以加更多 fwd 线程、加大并发,压榨存储真实上限。
- 块大小严格生效 format xfer=4095、rd1=4096,都是标准 4KB 块,配置参数生效无误。
- 带宽换算验证 4KB * 509.3 IOPS = 1.989 MB/s,和报表 total mb/sec=1.99 完全匹配,数值精准无误差。
五、实操调优步骤
- 基准起步:先设置单 fwd threads = 逻辑核数 ×2
- 跑 600s 看 totals.html 里
cpu% pct:- CPU <30%:线程翻倍继续加压
- CPU 70%~80%:接近客户端瓶颈,不要再加
- CPU>90%:线程过高,降线程防调度抖动
- 同步观察指标:
- IOPS 不再上涨、延迟持续走高 → 瓶颈在存储 / 网络,不是客户端 CPU
- IOPS 随线程线性上涨、延迟平稳 → 还能继续加线程