五、存储测试工具 vdbench

一、概念

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*fwdrate

rd=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、总带宽、总平均时延、最大最小时延、总数据读写总量。

快速排查优先级

  1. 看结果:summary.html → totals.html → histogram.html
  2. 核对配置:config.html/parmfile.html
  3. 报错异常:errorlog.html → logfile.html → localhost.var_adm_msgs.html
  4. 分挂载点对比:fsd1.html/fwd1.html 及各自 histogram
  5. 二次绘图分析:flatfile.html
  6. 配置语法问题:parmscan.html
  7. 预埋慢 / 失败: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 匹配)

关键对比与结论

  1. 负载形态差异
    • format 阶段:纯 4K 写 + 大量目录 / 文件创建元数据,IOPS 167.8
    • rd1 压测:纯 4K 读,IOPS 509.3,读性能≈写入 3 倍
  2. 延迟表现极好 读平均延迟 0.003ms,写预埋 0.010ms,说明底层存储介质(共享存储 / 云盘)响应速度快,无明显抖动。
  3. 客户端资源无瓶颈 两轮 CPU 占用都<3%,可以加更多 fwd 线程、加大并发,压榨存储真实上限。
  4. 块大小严格生效 format xfer=4095、rd1=4096,都是标准 4KB 块,配置参数生效无误。
  5. 带宽换算验证 4KB * 509.3 IOPS = 1.989 MB/s,和报表 total mb/sec=1.99 完全匹配,数值精准无误差。

五、实操调优步骤

  1. 基准起步:先设置单 fwd threads = 逻辑核数 ×2
  2. 跑 600s 看 totals.html 里 cpu% pct
    • CPU <30%:线程翻倍继续加压
    • CPU 70%~80%:接近客户端瓶颈,不要再加
    • CPU>90%:线程过高,降线程防调度抖动
  3. 同步观察指标:
    • IOPS 不再上涨、延迟持续走高 → 瓶颈在存储 / 网络,不是客户端 CPU
    • IOPS 随线程线性上涨、延迟平稳 → 还能继续加线程
相关推荐
花千烬17 小时前
crictl info 连不上 containerd 怎么办?endpoint、socket 与权限一次查清
云计算
AKAMAI4 天前
每百万 Token 成本砍六成,出海 AI 团队开始重算推理这笔账
人工智能·云计算
tiancaijiben17 天前
阿里云Kubernetes集群托管完全指南:从创建到生产级运维
云计算
互联网推荐官17 天前
上海软件定制开发公司推荐:从PaaS工程化路径看D-coding的技术取舍
云原生·云计算·paas·软件开发·开发经验·上海
sbjdhjd17 天前
从零搭建企业级 CI/CD(下):Jenkins+GitLab+Harbor 全链路实战指南
git·servlet·ci/cd·云原生·云计算·gitlab·jenkins
tiancaijiben17 天前
阿里云应用实时监控服务ARMS完全接入指南:从探针部署到全链路可观测
云计算
xingyuzhisuan17 天前
算力租赁平台 GPU 资源隔离方案:显存抢占问题深度排查与解决
大数据·云计算·gpu算力
workbuddy小能手18 天前
腾讯云ADP Agent Portal vs 自建智能体:架构选型对比
架构·云计算·腾讯云
宸津-代码粉碎机18 天前
Spring AI 企业级实战|智能记忆摘要+自动遗忘机制落地,彻底解决上下文爆炸与Token冗余
java·大数据·人工智能·后端·python·spring·云计算