存储工具系列文章》主要介绍存储相关的测试和调试工具,包括不限于ddfiovdbenchiozoneiometercosbench等性能负载工具,及strace等调试工具。


1. 概述

vdbench是一个I/O工作负载生成器,通常用于验证数据完整性和度量直接附加(或网络连接)存储性能。

vdbench可以运行在windows、linux环境,可用于测试文件系统或块设备基准性能。

2. 安装部署

2.1    Linux平台

        一、安装jdk

[root@node1 vdbench50406]# rpm -ivh jdk-8u144-linux-x64.rpm

配置jdk环境变量,明确jdk安装目录,本次实践为/usr/java/jdk1.8.0_144


  1. [root@node1 vdbench50406]# echo 'JAVA_HOME=/usr/java/jdk1.8.0_144' >> /etc/profile
  2. [root@node1 vdbench50406]# echo 'PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile
  3. [root@node1 vdbench50406]# echo 'CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar' >> /etc/profile
  4. [root@node1 vdbench50406]# echo 'export PATH' >> /etc/profile
  5. [root@node1 vdbench50406]# echo 'export JAVA_HOME' >> /etc/profile
  6. [root@node1 vdbench50406]# echo 'export CLASSPTH' >> /etc/profile

使环境变量生效

[root@node1 vdbench50406]# source /etc/profile

        二、vdbench解压

        解压缩vdbench安装包,切换到vdbench解压缩目录执行对应参数文件即可

[root@node1 vdbench50406]# unzip vdbench50406.zip

2.2    Windows平台

        一、部署jdk环境

直接安装jdk软件即可(环境变量在安装完成后会自动添加)

        二、vdbench使用

解压缩vdbench软件包,切换到vdbench解压缩目录执行对应参数文件即可

3. 配置参数说明

vdbench可用于文件系统及块设备基准性能测试,以下主要介绍文件系统及块存储的常用测试参数

vdbench所有测试参数都定义到一个参数文件内,在运行时按照顺序被读取执行相应操作,在参数文件定义时需要执行顺序进行定义。

3.1 文件系统

文件系统参数文件定义顺序为:HD、FSD、FWD、RD。

3.1.1 hd(host define)

非必选项,单机运行时不需要配置HD参数,一般只有在多主机联机测试时才需要配置。


  1. hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh
  2. hd=hd1,system=node241
  3. hd=hd2,system=node242
  4. hd=hd3,system=node243

        hd:标识主机定义的名称,多主机运行时,可以使用hd1、hd2、hd3…区分

        system:主机IP地址或主机名

        vdbench:vdbench执行文件存放路径,当多主机存放路径不同时,可在hd定义时单独指定

        user:slave和master通信使用用户

        shell:可选值为rsh、ssh或vdbench,默认值为rsh,多主机联机测试时,mater和slave主机间通信方式

  • 当参数值为rsh时,需要配置master和slave主机rsh互信,考虑到rsh使用明文传输,安全级别不够,通常情况下不建议使用这种通信方式;
  • 当参数值为ssh时,需要配置master和slave主机ssh互信,通常Linux主机联机时使用此通信方式;
  • 当参数值为vdbench,需要在所有slave主机运行vdbench rsh启用vdbench本身的rsh守护进程,通常Window主机联机时使用此通信方式。

3.1.2 FSD(File System Define)


  1. fsd=default,openflags=directio,depth=2,width=3,files=2,size=128k
  2. fsd=fsd1,anchor=/mnt/client1
  3. fsd=fsd2,anchor=/mnt/client2
  4. fsd=fsd3,anchor=/mnt/client3

        fsd:标识文件系统定义的名称,多文件系统时(fsd1、fsd2、fsd3…),可以指定default(将相同的参数作为所有fsd的默认值)

        openflags:通过设置为o_direct或directio,以无缓冲缓存的方式进行读写操作

 anchor:文件写入目录,linux指定路径为/dir01;windows指定路径为E:\dir01;

depth:创建目录层级数(即目录深度)

width:每层文件夹的子文件夹数

files:测试文件个数(vdbench测试过程中会生成多层级目录结构,实际只有最后一层目录会生成测试文件)

size:每个测试文件大小

 **distribution= ** 可选值为bottom或all,默认为bottom

–当参数值为bottom时,程序只在最后一层目录写入测试文件

–当参数值为all时,程序在每一层目录都写入测试文件

shared:可选值为yes或no,默认值为no,一般只有在多主机联机测试时指定

vdbench不允许不同的slave之间共享同一个目录结构下的所有文件,因为这样会带来很大的开销,但是它们允许共享同一个目录结构。加入设置了shared=yes,那么不同的slave可以平分一个目录下所有的文件来进行访问,相当于每个slave有各自等分的访问区域,因此不能测试多个客户的对同一个文件的读写–当多主机联机测试时,写入的根目录anchor为同一个路径时,需要指定参数值为yes

        说明


  1. hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh
  2. hd=hd1,system=node1
  3. hd=hd2,system=node2
  4. hd=hd3,system=node3
  5. fsd=fsd1,anchor=/client/,depth=2,width=100,files=100,size=4k,shared=yes

计算公式如下:

最后一层生成文件夹个数=width^depth

测试文件个数=(width^depth)*files

fsd=fsd1,anchor=/dir1,depth=2,width=3,files=2,size=128k

以上述参数为例,生成目录结构及测试文件如下:

最后一层文件夹数=3^2=9 最后一层文件数=9*2=18


  1. /dir1/
  2. ├── no_dismount.txt
  3. ├── vdb.1_1.dir
  4. │   ├── vdb.2_1.dir
  5. │   │   ├── vdb_f0001.file
  6. │   │   └── vdb_f0002.file
  7. │   ├── vdb.2_2.dir
  8. │   │   ├── vdb_f0001.file
  9. │   │   └── vdb_f0002.file
  10. │   └── vdb.2_3.dir
  11. │       ├── vdb_f0001.file
  12. │       └── vdb_f0002.file
  13. ├── vdb.1_2.dir
  14. │   ├── vdb.2_1.dir
  15. │   │   ├── vdb_f0001.file
  16. │   │   └── vdb_f0002.file
  17. │   ├── vdb.2_2.dir
  18. │   │   ├── vdb_f0001.file
  19. │   │   └── vdb_f0002.file
  20. │   └── vdb.2_3.dir
  21. │       ├── vdb_f0001.file
  22. │       └── vdb_f0002.file
  23. ├── vdb.1_3.dir
  24. │   ├── vdb.2_1.dir
  25. │   │   ├── vdb_f0001.file
  26. │   │   └── vdb_f0002.file
  27. │   ├── vdb.2_2.dir
  28. │   │   ├── vdb_f0001.file
  29. │   │   └── vdb_f0002.file
  30. │   └── vdb.2_3.dir
  31. │       ├── vdb_f0001.file
  32. │       └── vdb_f0002.file
  33. └── vdb_control.file
  34. 12 directories, 20 files

3.1.3 FWD(FileSystem Workload Defile)


  1. fwd=default,operation=read,xfersize=4k,fileio=sequential,fileselect=random,threads=2
  2. fwd=fwd1,fsd=fsd1,host=hd1
  3. fwd=fwd2,fsd=fsd2,host=hd2
  4. fwd=fwd3,fsd=fsd3,host=hd3

fwd:标识文件系统工作负载定义的名称,多文件系统工作负载定义时,可以使用fwd1、fwd2、fwd3…区分

fsd:标识此工作负载使用文件存储定义的名称

host:标识此工作负载使用主机

operation:可选值为read或write,文件操作方式

rdpct:可选值为0~100,读操作占比百分比,一般混合读写时需要指定,当值为60时,则混合读写比为6:4

fileio:可选值为random或sequential,标识文件 I/O 将执行的方式

fileselect: random或sequential,标识选择文件或目录的方式

xfersizes:数据传输(读取和写入操作)处理的数据大小(即单次IO大小)

 threads:此工作负载的并发线程数量

注:


  1. 1、默认情况下,预填数据工作负载定义为threads=8,xfersize=128k,即预填数据使用8线程,IO大小为128K
  2. 如需更改默认预填数据工作负载定义,则需要增加参数指定线程数和IO大小(fwd=format,threads=nn,xfersize=nn)

3.1.4 RD(Run Define)

rd=rd1,fwd=(fwd1-fwd3),fwdrate=max,format=restart,elapsed=604800,interval=10

rd:标识文件系统运行定义的名称。

fwd:标识文件系统工作负载定义的名称。

fwdrate:每秒执行的文件系统操作数量。设置为max,表示不做任何限制,按照最大强度自适应
        format: 可选值为no、yes、或restart,标识预处理目录和文件结构的方式

  • no:默认参数值,不执行format预处理操作,如测试目录不存在文件时,vdbench会由于无可用文件读写而异常退出
  • yes:表示删除测试目录已有文件结构,并且重新创建新的文件结构
  • restart:表示只创建未生成的目录或文件,并且增大未达到实际大小的文件

elapsed:默认值为30,测试运行持续时间(单位为秒)

interval:结果输出打印时间间隔(单位为秒)

3.2 块设备

块设备参数文件定义顺序为:HD、SD、WD、RD

3.2.1 HD(Host Define)

非必选项,单机运行时不需要配置HD参数,一般只有在多主机联机测试时才需要配置


  1. hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh
  2. hd=hd1,system=node241
  3. hd=hd2,system=node242
  4. hd=hd3,system=node243

参数解析参照文件系统的hd系列参数

3.2.2 SD(Storage Define)


  1. sd=sd1,hd=hd1,lun=/dev/sdb,openflags=o_direct,threads=6
  2. sd=sd3,hd=hd2,lun=/dev/sdb,openflags=o_direct,threads=6
  3. sd=sd6,hd=hd3,lun=/dev/sdb,openflags=o_direct,threads=6

sd: 标识存储定义的名称

hd: 标识主机定义的名称

 lun: 写入块设备,linux使用sdb盘,则指定路径为/dev/sdb;windows使用G盘,则指定路径为\\.\G:;

openflags: 通过设置为o_direct或directio,以无缓冲缓存的方式进行读写操作

threads: 对SD的最大并发I/O请求数量

3.2.3 WD(Workload Define)


  1. wd=wd1,sd=sd*,seekpct=100,rdpct=100,xfersize=8k,skew=40
  2. wd=wd2,sd=sd*,seekpct=100,rdpct=0,xfersize=8k,skew=10
  3. wd=wd3,sd=sd*,seekpct=100,rdpct=100,xfersize=1024k,skew=40
  4. wd=wd4,sd=sd*,seekpct=100,rdpct=0,xfersize=1024k,skew=10

   wd: 标识工作负载定义的名称

 sd: 标识存储定义的名称

seekpct: 可选值为0或100(也可使用sequential或random表示),默认值为100,随机寻道的百分比,设置为0时表示顺序,设置为100时表示随机。

rdpct:读取请求占请求总数的百分比,设置为0时表示写,设置为100时表示读

xfersize: 要传输的数据大小。默认设置为4k

 skew: 非必选项,一般在多个工作负载时需要指定,表示该工作负载占总工作量百分比(skew总和为100)

3.2.4 RD(Run Define)

rd=rd1,wd=wd*,iorate=max,maxdata=400GB,warmup=30,elapse=604800,interval=5

        rd: 标识运行定义的名称

        wd: 标识工作负载定义的名称

        iorate: 常用可选值为100、max,此工作负载的固定I/O速率

  • –当参数值为100时,以每秒100个I/Os的速度运行工作负载,当参数值设置为一个低于最大速率的值时,可以达到限制读写速度的效果
  • –当参数值为max时,以最大的I/O速率运行工作负载,一般测试读写最大性能时,该参数值均为max

warmup: 预热时间(单位为秒),默认情况下vdbench会将第一个时间间隔输出数据排除在外,程序在预热时间内的测试不纳入最终测试结果中(即预热结束后,才开始正式测试)

  • –当interval为5、elapsed为600时,测试性能为2~elapsed/interval(avg_2-120)时间间隔内的平均性能
  • –当interval为5、warmup为60、elapsed为600时,测试性能为1+(warmup/interval)~(warmup+elapsed)/interval(avg_13-132)时间间隔内的平均性能

        maxdata:读写数据大小,通常情况下,当运行elapsed时间后测试结束;当同时指定elapsed和maxdata参数值时,以最快运行完的参数为准(即maxdata测试时间小于elapsed时,程序写完elapsed数据量后结束)

  • –当参数值为100以下时,表示读写数据量为总存储定义大小的倍数(如maxdata=2,2个存储定义(每个存储定义数据量为100G),则实际读写数据大小为400G)
  • –当参数值为100以上时,表示数据量为实际读写数据量(可以使用单位M、G、T等)

        elapsed: 默认值为30,测试运行持续时间(单位为秒)

        interval: 报告时间间隔(单位为秒)

4 测试案例

4.1 单机测试

4.1.1 Linux平台

示例如下,单节点针对裸盘测试,1M顺序写,测试时间600s,预热时间60s,报告时间间隔2s


  1. [root@node241 vdbench50406]# cat Single-RawDisk.html 
  2. sd=sd1,lun=/dev/sdb,openflag=o_direct
  3. wd=wd1,sd=sd1,seekpct=0,rdpct=0,xfersize=1M
  4. rd=rd1,wd=wd1,iorate=max,warmup=60,elapsed=600,interval=2
  5. [root@node241 vdbench50406]# 
  6. [root@node241 vdbench50406]# ./vdbench -f Single-RawDisk.html

4.1.2 Windows平台

示例如下,单节点针对文件系统测试,1M顺序写,目录深度为2,每层目录数为3,每个目录文件数为10,每个文件大小为200M,测试时间为600s,报告时间时间2s


  1. E:\vdbench50406>more "Single FileSystem.txt"
  2. fsd=fsd1,anchor=E:\Sigle-FileSystem,depth=2,width=3,files=10,size=200M
  3. fwd=fwd1,fsd=fsd1,operation=write,xfersize=1M,fileio=sequential,fileselect=rando
  4. m,threads=2
  5. rd=rd1,fwd=fwd1,fwdrate=max,format=yes,elapsed=600,interval=5
  6. E:\vdbench50406>
  7. E:\vdbench50406>vdbench -f "Single FileSystem.txt"

4.2 联机测试

4.2.1 Linux平台

        一、配置多主机ssh互信

        二、master主机运行测试参数文件即可

示例如下,三节点针对裸盘联机测试,1M顺序写,测试数据量为400G,预热时间30s,报告间隔5s


  1. [root@node241 vdbench50406]# cat Multi-RawDisk
  2. hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh
  3. hd=hd1,system=node241
  4. hd=hd2,system=node242
  5. hd=hd3,system=node243
  6. sd=sd1,hd=hd1,lun=/dev/sdb,openflag=o_direct
  7. sd=sd2,hd=hd2,lun=/dev/sdb,openflag=o_direct
  8. sd=sd3,hd=hd3,lun=/dev/sdb,openflag=o_direct
  9. wd=wd1,sd=sd*,seekpct=0,rdpct=0,xfersize=1M
  10. rd=rd1,wd=wd1,iorate=max,maxdata=100M,elapsed=64800,warmup=30,interval=5
  11. [root@node241 vdbench50406]# 
  12. [root@node241 vdbench50406]# ./vdbench -f Multi-RawDisk

4.2.2 Windows平台

        一、所有slave主机运行vdbench本身rsh守护进程

E:\vdbench50406>vdbench rsh

        二、master主机运行测试参数文件即可

示例如下,三节点针对文件系统联机测试,1M顺序写,目录深度为2,每层目录数为3,每个目录文件数为10000,每个文件大小为200M,测试时间为600s,报告间隔1s


  1. E:\vdbench50406>more "Multi FileSystem.txt"
  2. hd=default,vdbench=E:\vdbench50406,user=Micah,shell=vdbench
  3. hd=hd1,system=66.66.66.250
  4. hd=hd2,system=66.66.66.252
  5. fsd=fsd1,anchor=Z:\Sigle-FileSystem-01,depth=2,width=3,files=10000,size=200M
  6. fsd=fsd2,anchor=Z:\Sigle-FileSystem-02,depth=2,width=3,files=10000,size=200M
  7. fwd=default,operation=write,xfersize=1M,fileio=sequential,fileselect=random,threads=16
  8. fwd=fwd1,fsd=fsd1,host=hd1
  9. fwd=fwd2,fsd=fsd2,host=hd2
  10. rd=rd1,fwd=fwd*,fwdrate=max,format=yes,elapsed=600,interval=1
  11. E:\vdbench50406>
  12. E:\vdbench50406>vdbench -f "Multi FileSystem.txt"

4.3 常见测试参数

4.3.1 4M顺序写

目录深度2、单级目录数100、单个目录文件数100、单文件大小4M、IO块大小1M、顺序写。


  1. hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh
  2. hd=hd1,system=node21
  3. hd=hd2,system=node22
  4. hd=hd3,system=node23
  5. hd=hd4,system=node24
  6. hd=hd5,system=node25
  7. hd=hd6,system=node26
  8. fsd=fsd1,anchor=/client/test01,depth=2,width=100,files=100,size=4M,shared=yes
  9. fwd=format,threads=24,xfersize=1m
  10. fwd=default,xfersize=1m,fileio=sequential,fileselect=sequential,operation=write,threads=24
  11. fwd=fwd1,fsd=fsd1,host=hd1
  12. fwd=fwd2,fsd=fsd1,host=hd2
  13. fwd=fwd3,fsd=fsd1,host=hd3
  14. fwd=fwd4,fsd=fsd1,host=hd4
  15. fwd=fwd5,fsd=fsd1,host=hd5
  16. fwd=fwd6,fsd=fsd1,host=hd6
  17. rd=rd1,fwd=fwd*,fwdrate=max,format=restart,elapsed=600,interval=1

4.3.1 4M顺序读

目录深度2、单级目录数100、单个目录文件数100、单文件大小4M、IO块大小1M、顺序读


  1. hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh
  2. hd=hd1,system=node21
  3. hd=hd2,system=node22
  4. hd=hd3,system=node23
  5. hd=hd4,system=node24
  6. hd=hd5,system=node25
  7. hd=hd6,system=node26
  8. fsd=fsd1,anchor=/client/test02,depth=2,width=100,files=100,size=4M,shared=yes
  9. fwd=format,threads=24,xfersize=1m
  10. fwd=default,xfersize=1m,fileio=sequential,fileselect=sequential,operation=read,threads=24
  11. fwd=fwd1,fsd=fsd1,host=hd1
  12. fwd=fwd2,fsd=fsd1,host=hd2
  13. fwd=fwd3,fsd=fsd1,host=hd3
  14. fwd=fwd4,fsd=fsd1,host=hd4
  15. fwd=fwd5,fsd=fsd1,host=hd5
  16. fwd=fwd6,fsd=fsd1,host=hd6
  17. rd=rd1,fwd=fwd*,fwdrate=max,format=restart,elapsed=600,interval=1

4.3.2 8M混合读写

目录深度2、单级目录数100、单个目录文件数100、单文件大小8M、IO块大小1M、混合读写(读写比为6:4)


  1. hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh
  2. hd=hd1,system=node21
  3. hd=hd2,system=node22
  4. hd=hd3,system=node23
  5. hd=hd4,system=node24
  6. hd=hd5,system=node25
  7. hd=hd6,system=node26
  8. fsd=fsd1,anchor=/client/test03,depth=2,width=100,files=100,size=8M,shared=yes
  9. fwd=format,threads=24,xfersize=1m
  10. fwd=default,xfersize=1m,fileio=random,fileselect=random,rdpct=60,threads=24
  11. fwd=fwd1,fsd=fsd1,host=hd1
  12. fwd=fwd2,fsd=fsd1,host=hd2
  13. fwd=fwd3,fsd=fsd1,host=hd3
  14. fwd=fwd4,fsd=fsd1,host=hd4
  15. fwd=fwd5,fsd=fsd1,host=hd5
  16. fwd=fwd6,fsd=fsd1,host=hd6
  17. rd=rd1,fwd=fwd*,fwdrate=max,format=restart,elapsed=600,interval=1

5 测试结果解析

当vdbench运行完负载测试后,会在安装目录下生成output文件夹,里边包含测试结果文件。

5.1 输出文件

errorlog.html

当运行测试启用数据校验时,它可能会包含一些错误信息,如:无效的密钥读取、无效的 lba 读取(一个扇区的逻辑字节地址)、无效的 SD 或 FSD 名称读取、数据损坏、坏扇区。

flatfile.html

vdbench 生成的一种逐列的 ASCII 格式的信息,可以使用parseflat参数解析结果

histogram.html

一种包含报告柱状图的响应时间、文本格式的文件

logfile.html

包含 Java 代码写入控制台窗口的每行信息的副本。logfile.html 主要用于调试用途

parmfile.html

包含测试运行配置参数信息

summary.html

记录全部数据信息,显示每个报告间隔内总体性能情况及工作负载情况,以及除第一个间隔外的所有间隔的加权平均值

totals.html

记录全部数据计算之后的平均值,一般测试结果从该文件取值,除第一个间隔外所有间隔的加权平均值

5.2 文件系统结果分析

测试参数:


  1. hd=default,vdbench=E:\vdbench50406,user=Micah,shell=vdbench
  2. hd=hd1,system=66.66.66.250
  3. hd=hd2,system=66.66.66.252
  4. fsd=fsd1,anchor=Z:\Sigle-FileSystem-01,depth=2,width=3,files=10,size=4M
  5. fsd=fsd2,anchor=Z:\Sigle-FileSystem-02,depth=2,width=3,files=10,size=4M
  6. fwd=default,operation=write,xfersize=1M,fileio=sequential,fileselect=random,threads=2
  7. fwd=fwd1,fsd=fsd1,host=hd1
  8. fwd=fwd2,fsd=fsd2,host=hd2
  9. rd=rd1,fwd=fwd*,fwdrate=max,format=yes,elapsed=600,interval=5

测试结果:


  1. 18:47:03.001 Starting RD=format_for_rd1
  2. 六月 04, 2020 .Interval. .ReqstdOps... ...cpu%...  read ....read..... ....write.... ..mb/sec... mb/sec .xfer.. ...mkdir.... ...rmdir.... ...create... ....open.... ...close.... ...delete...
  3.                           rate   resp total  sys   pct   rate   resp   rate   resp  read write  total    size  rate   resp  rate   resp  rate   resp  rate   resp  rate   resp  rate   resp
  4. 18:48:40.218   avg_2-20   57.6  6.244  13.4 2.99   0.0    0.0  0.000   57.6  6.244  0.00  7.20   7.20  131072   0.2 104.49   0.2 41.526   1.8 7527.0   1.8 192.01   1.8 7134.3   1.8 21.984
  5. 18:48:42.000 Starting RD=rd1; elapsed=600; fwdrate=max. For loops: None
  6. 18:58:42.205  avg_2-120    6.2  1.063  13.0 2.80   0.0    0.0  0.000    6.2  1.063  0.00  6.24   6.24 1048576   0.0  0.000   0.0  0.000   0.0  0.000   1.6 47.864   1.6 2401.1   0.0  0.000

    totals.html

一般包括两个部分,第一部分为文件存储目录结构及数据填充的平均性能值,第二部分为执行测试过程中除第一个时间间隔外所有时间间隔平均性能值,主要看第二部分的内容

    Interval:报告间隔序号,测试结果一般为除第一个时间间隔外所有时间间隔加权平均值,如elapsed=600,interval=5,则性能结果为第2个间隔到第120个间隔的平均值(avg_2-120)

    ReqstdOps:Rate:每秒读写I/O个数(读写IOPS),可以通过rd运行定义参数fwdrate控制;当fwdrate为max时,以最大I/O速率运行工作负载;当fwdrate为低于最大I/0速率的一个数值时,可以限制读写速度,以固定I/O速率运行工作负载。
Resp:读写请求响应时间(读写时延),单位为ms

    cpu%

tatol:总的cpu占用率
sys:系统cpu占用率

    read pct

读取请求占总请求数百分比占比,当为0时表示写,当为100时表示读

    read

rate:每秒读I/O个数(读IOPS)
resp:读请求响应时间(读时延),单位为ms

    write

rate:每秒写I/O个数(写IOPS)
resp:写请求响应时间(写时延),单位为ms

    mb/sec

read:每秒读取速度
write:每秒写入速度
total:每秒读写速度总和

    xfersize

每个读写I/O传输数据量(即单个读写I/O大小),单位为字节B

5.3    块设备结果分析

测试参数如下:


  1. messagescan=no
  2. hd=default,vdbench=/root/vdbench50406,user=root,shell=ssh
  3. hd=hd1,system=node241
  4. hd=hd2,system=node242
  5. hd=hd3,system=node243
  6. sd=sd1,hd=hd1,lun=/dev/sdb,openflag=o_direct
  7. sd=sd2,hd=hd2,lun=/dev/sdb,openflag=o_direct
  8. sd=sd3,hd=hd3,lun=/dev/sdb,openflag=o_direct
  9. wd=wd1,sd=sd*,seekpct=0,rdpct=0,xfersize=1M
  10. rd=rd1,wd=wd1,iorate=max,elapsed=600,warmup=30,interval=5

测试结果如下:


  1. 19:02:15.001 Starting RD=rd1; I/O rate: Uncontrolled MAX; elapsed=600 warmup=30; For loops: None
  2. Jun 04, 2020  interval        i/o   MB/sec   bytes   read     resp     read    write     resp     resp queue  cpu%  cpu%
  3.                              rate  1024**2     i/o    pct     time     resp     resp      max   stddev depth sys+u   sys
  4. 19:12:46.068 avg_7-126      82.74    82.74 1048576   0.00  289.158    0.000  289.158 2092.803  155.103  23.9  16.3  14.2

    interval

报告间隔序号,测试结果一般为除第一个时间时间外所有时间间隔加权平均值,如有设置预热时间,则这部分测试数据也需要排除在外
如elapsed=600,warmup=30,interval=5,则性能测试结果为第7个间隔到第126个间隔的平均值(avg_7-126)

    i/o rate

每秒读写I/O个数(读写IOPS),可以通过rd运行定义参数iorate控制
当iorate为max时,以最大I/O速率运行工作负载
当iorate为低于最大I/0速率的一个数值时,可以限制读写速度,以固定I/O速率运行工作负载

    MB/sec

每秒读写速度(读写带宽)
注:按官方手册说明,

    bytes i/0

每个读写I/O传输数据量(即单个读写I/O大小),单位为字节B,可以通过wd工作负载定义参数xfersize控制

    read pct

读取请求占请求总数的百分比,可以通过wd工作负载定义参数rdpct控制
当rdpct为0时,表示测试模型为写
当rdpct为100时,表示测试模型为读

    resp time

请求响应时间(读写时延),单位为毫秒ms

    read resp

读取请求响应时间,单位为毫秒ms

    write resp

写入请求响应时间,单位为毫秒ms

    resp max

最大请求响应时间,单位为毫秒ms

    resp stddev

请求响应时间标准偏差,单位为毫秒ms

    queue depth

读写I/0队列深度

    cpu% sys+u

内核态空间及用户态空间CPU占用率

    cpu% sys

内核态空间CPU占用率

6 常见问题

6.1 open failed for xxx

一、问题描述:

使用vdbench测试过程中,测试中断,报错信息如下:


  1. 19:37:41.155 19:37:44.813 error: 20
  2. 19:37:41.155 19:37:44.813 file_open(), open /trash/64M/vdb.1_47.dir/vdb.2_24.dir/vdb_f0002.file failed
  3. 19:37:41.155 19:37:44.814 error: 20
  4. 19:37:41.155 19:37:44.814 file_open(), open /trash/64M/vdb.1_47.dir/vdb.2_24.dir/vdb_f0003.file failed
  5. 19:37:41.156 19:37:44.814 Maximum native memory allocation:    1,048,576; Current allocation:    1,048,576
  6. 19:37:41.156 19:37:44.814 Maximum native memory allocation:    1,048,576; Current allocation:    1,048,576
  7. 19:37:41.156 19:37:44.814 error: 20
  8. 19:37:41.156 19:37:44.814 
  9. 19:37:41.156 19:37:44.814 open failed for /trash/64M/vdb.1_47.dir/vdb.2_24.dir/vdb_f0002.file
  10. 19:37:41.156 19:37:44.814 
  11. 19:37:41.158 java.lang.RuntimeException: open failed for /trash/64M/vdb.1_47.dir/vdb.2_24.dir/vdb_f0002.file

二、原因分析:

默认vdbench限制了java内存使用量,测试期间java运行内存不足才导致测试异常中断。

三、处理措施:

增大vdbench运行脚本的java内存参数


  1. [root@node40 ~]# cat vdbench50406/vdbench
  2. if [ "$1" == "SlaveJvm" ]; then
  3.   $java -client -Xmx10240m -Xms128m -cp $cp Vdb.SlaveJvm $*
  4.   exit $?
  5. else
  6.   $java -client -Xmx10240m  -Xms64m  -cp $cp Vdb.Vdbmain $*
  7.   exit $?
  8. fi

注:Xmx表示jvm最大内存分配池,Xms表示初始内存分配池
进程初始以Xms内存大小启动,当空余堆内存小于40%时,jvm会增大内存至Xmx;当空余堆内存大于70%时,jvm会减少内存至Xms;为避免每次GC后JVM重新分配内存,可以将Xmx和Xms设置为相同的参数值。

6.2 linux/aarch64.so does not exist

一、问题描述

arm服务器运行vdbench,出现共享库不匹配问题linux/aarch64.so does not exist,提示需要手动编译。

二、原因分析:

vdbench根目录动态库文件linux/linux64.so为基于x86编译的,需要基于aarch64重新编译linux/linux64.so动态库文件


  1. [root@node163 vdbench50407]# ls linux/
  2. config.sh  linux32.so  linux64.so  sparc64.so
  3. [root@node163 vdbench50407]# file linux/linux64.so 
  4. linux/linux64.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=34a31f32956f21153c372a95e73c02e84ddd29f8, not stripped

三、处理措施:

第一步:准备源码

下载vdbench50407源码包,下载地址:vdbench50407.src.zip

解压缩源码包,创建linux目录


  1. mkdir vdbench50407-src
  2. unzip vdbench50407.src.zip -d vdbench50407-src/
  3. cd vdbench50407-src/src/
  4. mkdir linux

第二步:完善代码

进入Jni目录下,修改make.linux文件,主要修改如下:

– 指定vdbench源码路径(vdb=xx)

– 指定jdk路径(java=xx),通常在/usr/lib/jvm/路径下

– 删除全文-m32和-m64字符


  1. cd Jni/
  2. sed -i 's#vdb=$mine/vdbench504#vdb=/root/vdbench50407-src/src#g' make.linux
  3. sed -i 's#java=/net/sbm-240a.us.oracle.com/export/swat/swat_java/linux/jdk1.5.0_22/#java=/usr/lib/jvm/java-1.8.0-openjdk/#g' make.linux
  4. sed -i 's/-m32//g' make.linux 
  5. sed -i 's/-m64//g' make.linux

第三步:编译安装

执行源码编译操作./make.linux

执行成功后会在../linux目录下生成linux32.so和linux64.so文件,将linux64.so文件拷贝到vdbench测试工具根目录linux/aarch64.so下,重新运行vdbench测试


  1. [root@node163 Jni]# ./make.linux
  2. target directory: /root/vdbench50407-src/src
  3. Compiling 32 bit
  4. Linking 32 bit
  5. Compiling 64 bit
  6. Linking 64 bit
  7. [root@node163 Jni]# ll ../linux/
  8. total 160
  9. -rwxrwxrwx 1 root root 78656 Feb  9 14:54 linux32.so
  10. -rwxrwxrwx 1 root root 78656 Feb  9 14:54 linux64.so
  11. [root@node163 Jni]# cp ../linux/linux64.so /root/vdbench50407/linux/aarch64.so

6.3 Raw device ‘sd=sd1,lun=\.\G:’ does not exist, or no permissions.

一、问题描述:

windows系统下使用vdbench测试裸盘性能,脚本运行失败,提示Raw device 'sd=sd1,lun=\\.\G:' does not exist, or no permissions.


  1. D:\vdbench50406>more raw-test.txt
  2. sd=sd1,lun=\\.\G:
  3. wd=wd1,sd=sd1,seekpct=0,rdpct=0,xfersize=1M
  4. rd=rd1,wd=wd1,iorate=max,maxdata=100M,elapsed=64800,warmup=30,interval=5
  5. D:\vdbench50406>vdbench.bat -f raw-test.txt
  6. Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
  7. Vdbench distribution: vdbench50406 Wed July 20 15:49:52 MDT 2016
  8. For documentation, see 'vdbench.pdf'.
  9. 17:35:24.328 input argument scanned: '-fraw-test.txt'
  10. 17:35:24.375 Starting slave: D:\vdbench50406\vdbench SlaveJvm -m localhost -n localhost-10-220119-17.35.24.293 -l localhost-0 -p 5570
  11. 17:35:24.834 All slaves are now connected
  12. 17:35:25.263 Raw device 'sd=sd1,lun=\\.\G:' does not exist, or no permissions.
  13. 17:35:25.764
  14. 17:35:25.764 Please check above failures
  15. 17:35:25.765
  16. java.lang.RuntimeException: Please check above failures
  17.         at Vdb.common.failure(common.java:335)
  18.         at Vdb.InfoFromHost.matchDataWithSds(InfoFromHost.java:674)
  19.         at Vdb.InfoFromHost.receiveInfoFromHost(InfoFromHost.java:485)
  20.         at Vdb.SlaveOnMaster.processSlave(SlaveOnMaster.java:151)
  21.         at Vdb.SlaveOnMaster.run(SlaveOnMaster.java:42)

二、处理措施:

1、检查裸盘路径是否正确,如测试G盘裸盘性能,则测试参数指定为lun=\\.\G:
        2、检查是否有执行权限,cmd窗口需要以管理员身份运行

6.4 Minimum required Java version for Vdbench is 1.7.0

一、问题描述

Linux下运行vdbench失败,提示Minimum required Java version for Vdbench is 1.7.0; Vdbench terminated.


  1. root@node65:/home/vdbench50406# ./vdbench -t
  2. Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
  3. Vdbench distribution: vdbench50406 Wed July 20 15:49:52 MDT 2016
  4. For documentation, see 'vdbench.pdf'.
  5. *
  6. *
  7. *
  8. * Minimum required Java version for Vdbench is 1.7.0; 
  9. * You are currently running 11.0.9.1
  10. * Vdbench terminated.
  11. *
  12. *
  13. *
  14. CTRL-C requested. vdbench terminating

二、处理措施:

查看官方相关说明,vdbench50407以前的版本,存在java检测功能(vdbench50407版本已移除),在不变更现有环境java版本的情况下,可升级版本至vdbench50407版本解决。


  1.    // Removed as per 50407 because of java 1.10.x
  2.     //checkJavaVersion();
  3.     //....
  4.      private static void checkJavaVersion()
  5.   {
  6.     if (common.get_debug(common.USE_ANY_JAVA))
  7.       return;
  8.     if (!JVMCheck.isJREValid(System.getProperty("java.version"), 1, 7, 0))
  9.     {
  10.       System.out.print("*\n*\n*\n");
  11.       System.out.println("* Minimum required Java version for Vdbench is 1.7.0; \n" +
  12.                          "* You are currently running " + System.getProperty("java.version") +
  13.                          "\n* Vdbench terminated.");
  14.       System.out.println("*\n*\n*\n");
  15.       System.exit(-99);
  16.     }
  17.   }

版本发布说明:# Vdbench 50407 is now available

50407rc29

*   The check to make sure you are running java 1.7 or higher has been removed.

7 参考资料

[01] https://blog.csdn.net/Micha_Lu/article/details/109227774

[转帖]vdbench - 性能压力测试工具的更多相关文章

  1. [AapacheBench工具]web性能压力测试工具的应用与实践

    背景:网站性能压力测试是性能调优过程中必不可少的一环.服务器负载太大而影响程序效率是很常见的事情,一个网站到底能够承受多大的用户访问量经常是我们最关心的问题.因此,只有让服务器处在高压情况下才能真正体 ...

  2. Web服务器性能/压力测试工具http_load、webbench、ab、Siege使用教程 - VPS侦探

    Web服务器性能/压力测试工具http_load.webbench.ab.Siege使用教程 - VPS侦探 http://soft.vpser.net/test/http_load/http_loa ...

  3. Web服务器性能压力测试工具http_load、webbench、ab、Siege使用教程

    Web服务器性能压力测试工具http_load.webbench.ab.Siege使用教程 作者: feng 日期: 2012/07/25 发表评论 (0) 查看评论   一.http_load 程序 ...

  4. Web服务器性能/压力测试工具http_load、webbench、ab、Siege、loadrunner

    回头看看 Web服务器性能/压力测试工具http_load.webbench.ab.Siege.loadrunner

  5. 三种web性能压力测试工具

    三种web性能压力测试工具http_load webbench ab小结 题记:压力和性能测试工具很多,下文讨论的是我觉得比较容易上手,用的比较多的三种 http_load 下载地址:http://w ...

  6. (总结)Web性能压力测试工具之WebBench详解

      PS:在运维工作中,压力测试是一项很重要的工作.比如在一个网站上线之前,能承受多大访问量.在大访问量情况下性能怎样,这些数据指标好坏将会直接影响用户体验.但是,在压力测试中存在一个共性,那就是压力 ...

  7. Web性能压力测试工具之Siege详解

    PS:Siege是一款开源的压力测试工具,设计用于评估WEB应用在压力下的承受能力.可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进 ...

  8. Web服务器性能/压力测试工具http_load、webbench、ab、Siege使用教程

    一.http_load 程序非常小,解压后也不到100K http_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载.但是它不同于大多数压力测试工 具,它可以以一个单一的进程运行,一般 ...

  9. 网站性能压力测试工具--apache ab使用详解

    ab是apache自带的压力测试工具.ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对其它类型的服务器进行压力测试.比如nginx.tomcat.IIS等. 下面我们开始介绍 ...

  10. MySQL自带的性能压力测试工具mysqlslap

    mysqlslap是从MySQL的5.1.4版开始就开始官方提供的压力测试工具. 通过模拟多个并发客户端并发访问MySQL来执行压力测试,同时提供了较详细的SQL执行数据性能报告,并且能很好的对比多个 ...

随机推荐

  1. Next.js 开发指南 路由篇 | 动态路由、路由组、平行路由和拦截路由

    前言 实际项目开发的时候,有的路由场景会比较复杂,比如数据库里的文章有很多,我们不可能一一去定义路由,此时该怎么办?组织代码的时候,有的路由是用于移动端,有的路由是用于 PC 端,该如何组织?如何有条 ...

  2. 下载安装Android Studio

    1,安装java的jdk 2,下载安装Dart 3,下载安装  Android Studio 建议这个安装在C盘,以防后期出现各种问题 在plugins中 (1)下载dart插件 (2)下载flutt ...

  3. 《华为云DTSE》期刊2023年第二季—HDC.Cloud 2023专刊

    本文分享自华为云社区<<华为云DTSE>期刊2023年第二季-HDC.Cloud 2023专刊>,作者: HuaweiCloudDeveloper . AI技术风起云涌,百家争 ...

  4. 【小白学YOLO】YOLOv3网络结构细致解析

    摘要:本文将详细介绍Yolov3的网络结构相关内容. Yolov3 网络结构 在博客"Yolo发展历史及网络结构"中我们已经详细的解释了Yolov1的网络结构,并简要的提到了Yol ...

  5. 为什么MySQL单表不能超过2000万行?

    摘要:MySQL一张表最多能存多少数据? 本文分享自华为云社区<为什么MySQL单表不能超过2000万行?>,作者: GaussDB 数据库 . 最近看到一篇<我说MySQL每张表最 ...

  6. 聊聊LiteOS中生成的Bin、HEX、ELF三种文件格式

    摘要:我们在使用编译器在编译工程后会要求生成可执行文件,将这些文件烧录到MCU进行运行,达到我们测试和使用程序的目的,再使用工具链进行编译的时候往往生成.bin..hex ..elf ..alf等文件 ...

  7. 40个问题让你快速掌握Java多线程的精髓

    摘要:多线程可以理解为在同一个程序中能够同时运行多个不同的线程来执行不同的任务,这些线程可以同时利用CPU的多个核心运行. 多线程可以理解为在同一个程序中能够同时运行多个不同的线程来执行不同的任务,这 ...

  8. 华为云NFT云宝限量开抢,区块链技术为你的数字资产保驾护航

    摘要:正是有这些底层的区块链技术支撑,才能让我们真正的"拥有"独属于自己的NFT数字资产. 本文分享自华为云社区<华为云独家NFT限量开抢,背后的这些技术你都知道吗?> ...

  9. 云图说丨初识数据工坊DWR

    摘要:数据工坊DWR是一款近数据处理服务,通过易用的工作流编排和开放生态的数据处理算子,能够在云上实现图像.视频.文档.图片等数据处理业务. 本文分享自华为云社区<[云图说]第236期 初识数据 ...

  10. 火山引擎 DataTester 推出可视化数据集成方案

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 随着数字化的长期演进,企业中往往存在多个运行在不同平台的数字系统,这些数据源彼此独立,数据跨系统间的交流.共享和融 ...