介绍
vdbench是一个I/O工作负载生成器,通常用于验证数据完整性和度量直接附加(或网络连接)存储性能。它可以运行在windows、linux环境,可用于测试文件系统或块设备基准性能。我们下面主要以块设备为介绍对象。
下载及安装
下载地址:
Vdbench Downloads
下载后直接解压就可以使用,此外还要安装java和csh,因为vdbench是使用java编写的。
Linux下:
yum install java
yum install csh
使用
1)检查vdbench环境
当开始使用时,./vdbench -t 验证下是否存在问题,如下图有报错现象,对整个文件夹增加权限后,输出正常。
2)运行测试模型
对于单独的块设备来说,常见的vdbench使用如下
./vdbench –f xxx –o xxx
-f后跟运行的配置文件,-o后面跟保存测试结果的文件夹
3)配置文件
配置文件可以参考解压后的examples文件夹下的脚本,比如create_files;也可以参考output目录下的parmfile.html,下面我们以一个例子来进行拆解。
块设备配置文件定义顺序为:HD、SD、WD、RD,后面三个对应上图的A,B,C,至于为什么没有HD(Host Define 主机定义),主要是我们是单机使用,未涉及联机使用,不是一个必选项,暂时跳过。
区域A主要是对SD(Storage Define 存储定义)配置
- sd= 标识存储定义的名称
- hd= 标识主机定义的名称
- lun= 写入块设备,如:/dev/sdb, /dev/sdc...
- openflags= 通过设置为o_direct,以无缓冲缓存的方式进行读写操作
- threads= 对SD的最大并发I/O请求数量
- offset=lun上的偏移
注意:待测SSD要进行分区,不要使用fdisk命令,因为它最大只能对2T进行操作,而SSD显然可以更大,所以我们要使用parted分区命令。操作如下:
#创建分区表
parted /dev/nvme0n1 mklabel gpt
#将硬盘容量分给分区1并指定起止位置
parted /dev/nvme0n1 mkpart 1 0% 25%
#查询磁盘的已有分区
parted /dev/nvme0n1 print
#格式化分区
mkfs -t ext2 /dev/nvme0n1p1
区域B主要是对WD(Workload Define 工作负载定义)配置
- wd= 标识工作负载定义的名称
- sd= 标识存储定义的名称
- seekpct= 可选值为0或100(也可使用sequential或random表示),默认值为100,随机寻道的百分比,设置为0时表示顺序,设置为100时表示随机。
- rdpct= 读取请求占请求总数的百分比,设置为0时表示写,设置为100时表示读
- xfersize= 要传输的数据大小。默认设置为4k
这里主要是配置要测试哪个sd,读还是写,顺序还是随机,bs是多少。需要注意的是sd*实际上是指所有的sd,虽然区域A上面只有1个sd,但是如果有多个sd的话都是要一起去执行。
区域C主要是对RD(Run Define)配置
- rd= 标识运行定义的名称
- wd= 标识工作负载定义的名称
- iorate= 常用可选值为100、max,此工作负载的固定I/O速率
--当参数值为100时,以每秒100个I/Os的速度运行工作负载,当参数值设置为一个低于最大速率的值时,可以达到限制读写速度的效果
--当参数值为max时,以最大的I/O速率运行工作负载,一般测试读写最大性能时,该参数值均为max - warmup= 预热时间(单位为秒),默认情况下vdbench会将第一个时间间隔输出数据排除在外,程序在预热时间内的测试不纳入最终测试结果中(即预热结束后,才开始正式测试)
- elapsed= 默认值为30,测试运行持续时间(单位为秒)
- interval= 报告时间间隔(单位为秒)
这里需要注意的地方有两点:
1)我们选择iorate=(curve),curve=(10-120,10),实际上就是限制io的速率从10%到120%按照10%为间隔增长,即就是顺序随机读写每个workload都要在不同的速率下跑一次,即要跑12次。(高于100%实际还是按100%执行)
2) 当RD出现”forxx”时,会把之前的参数配置强制覆盖掉,比如我们再区域B定义顺序读写bs=4k,但是区域C中使用forxfersize=(64k),所以最终还是会以64k去传输数据。
结果分析
如果运行没有出现错误,最后打印会出现
即我们log的存放地址,如果没有指定log存放地址,一般会生成一个output文件。
在log文件夹我们主要关注summary这个报告,如下是截取的一部分:
图中,是截取了在I/O rate 20%情况下的测试状况,warmup=90,采样间隔是5s,所以前18个值都不会采用,只有后面的6个值才是有效值(elapsed=30),取平均即为我们真正要获得的值。取完所有I/O rate average值画图即可观察到盘的运行趋势。
补充更新
实际测试时发现测试的值比正常的要小很多,在报告中发现有很多这样的警告,原来是我们的IOPS已经超过了单个java虚拟机可以处理的IOPS,这里需要在HD部分增加。
HD(Host Define):主机定义
- 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主机联机时使用此通信方式
协议推荐hd=default,jvms=nn设置JVM计数或者hd=hostX,jvms=nn。要合理选择jvms个数,不要太多当然也要满足需求。
最后还有一点要说的是,SSD分区时,要不要做文件系统,以及做什么文件系统都要看实际的要求,毕竟在windows分完区要格式化才能使用磁盘,而linux可以直接对裸盘操作。