云主机磁盘性能测试
磁盘性能指标
磁盘的性能一般使用以下几个指标对存储设备的性能进行描述:
IOPS:Input/Output Operations Per Second,是一个用于计算机存储设备(如硬盘(HDD)、固态硬盘(SSD)或存储区域网络(SAN))性能测试的量测方式,可以视为是每秒的读写次数,单位为次(计数)。存储设备的底层驱动类型决定了不同的IOPS。
吞吐量:每秒的磁盘读写数据量,即磁盘写入加上读出的数据的大小。单位为MB/s。
时延:IO操作的发送时间到接收确认所经过的时间,单位为秒。
bw:带宽 KB/s
iops:每秒钟的IO数
runt:总运行时间
lat (msec):延迟(毫秒)
msec: 毫秒
usec: 微秒
IOPS
IOPS(Input/Output Operations Per Second)是一个用于计算机存储设备(如硬盘(HDD)、固态硬盘(SSD)存储区域网络(SAN)性能测试的量测方式,可以视为是每秒的读写次数。和其他性能测试一样,存储设备制造商提出的IOPS不保证就是实际应用下的性能。
IOPS的数值会随系统配置而有很大的不同,依测试者在测试时的控制变因而异,控制变因包括读取及写入的比例、其中循序访问及随机存取的比例及配置方式、线程数量及访问队列深度,以及数据区块的大小。其他因素也会影响IOPS的结果,例如系统设置、存储设备的驱动程序、操作系统后台运行的作业等。若在测试固态硬盘时,是否先进行预调(preconditioning)机制也会影响IOPS的结果。
FIO测试工具
Fio(Flexible I/O Tester) 是一款由 Jens Axboe开发的用于性能和压力测试的自由开源的软件。它支持 19 种不同类型的 I/O 引擎 (sync、mmap、libaio、posixaio、SG v3、splice、null、network、 syslet、guasi、solarisaio等),我司主要使用Fio用于云主机磁盘性能测试,常用引擎psync、libaio和rbd。
1、FIO安装
wget http://freshmeat.net/projects/fio/ 或者 http://brick.kernel.dk/snaps/fio-x.x.x.tar.gz
yum install gcc libaio libaio-devel
tar zxvf fio-x.x.x.tar.gz && cd fio-x.x.x.tar.gz
./configure
make && make install
2、FIO用法
fio -filename=/dev/vdb -direct=1 -iodepth 1 -thread=1 -rw=randread -ioengine=libaio -bs=4k -size=100% -numjobs=1 -runtime=300 -group_reporting -name=test
常用参数如下:
filename=/dev/vdb 测试文件名称,通常选择需要测试的盘的data目录。待测试的磁盘设备文件
name=mytest job的名称
direct=1 测试过程绕过机器自带的buffer。使测试结果更真实。
rw=randwrite 读写模式,包括顺序读(read)、顺序写(write)、随机读(randread)、随机写(randwrite)、混合读写(rw)、随机读写(randrw)
bs=16k 单次io的块文件大小为
bsrange=512-2048 同上,指定定数据块的大小范围,也可以是4k,8k,32k
size=5g 本次的测试文件大小为5g,以每次4k的io进行测试。
numjobs=30 本次的测试线程为30.
runtime=300 测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止。
ioengine=libaio io引擎使用pync方式
rwmixwrite=30 在混合读写的模式下,写占30%
group_reporting 关于显示结果的,汇总每个进程的信息。
iodepth =30 IO深度为30,最大IO并发数
time_based 该参数不需要值,只是fio基于时间来运行
norandommp 这个参数在测试随机IO时起作用,默认随机IO也回写入所有的Size里描述的块,加了之后就打破了这个限制,有些块可能无法被read/write到,有些则可能IO多次,能够更好的模拟用户场景。
randrepeat=0 随机序列是否重复
此外
lockmem=1g 只使用1g内存进行测试。
zero_buffers 用0初始化系统buffer。
nrfiles=8 每个进程生成文件的数量。
3、测试执行
fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4k -numjobs=4 -time_based=1 -runtime=300 -group_reporting -filename=/dev/vdb -name=test
结果输出
将以上输出结果可以分为三个部分:从“job1: (groupid=0, jobs=16)”到“issued : total=r=0”是第一部分,这是任务job的输出,是第一部分;“Run status group 0 (all jobs):”是group的输出,这是第二部分;“Disk stats (read/write)”是磁盘的统计输出,这是第三部分。下面分别针对这三部分的输出进行解释。
对任务job的各项输出解释如下:
输出 |
解释 |
io= |
总共的IO读写数据量,以MB为单位 |
bw= |
带宽,以KB/s为单位 |
iops= |
IOPS |
runt= |
运行时间(runt是run time的缩写) |
slat= |
提交(Submission)延时统计,这一行是提交IO请求所花的时间统计,对于同步IO来说, slat实际上等于IO延时。 min=表示最短延时; max=表示最长延时; avg=表示平均延时; stdev=表示标准偏差,stdev是standard deviation的缩写; |
clat= |
完成(Completion)延时统计。从提交完IO请求到IO响应完成的时间统计。slat + clat等于 IO从提交到完成的全部延时。 |
lat= |
IO延时统计(包括fio提交IO请求到IO响应完成后返回的时间),等于slat + clat |
clat percentiles |
IO响应时间分布 |
bw= |
带宽统计。 min=统计最小带宽; max=统计最大带宽; per=每个线程占比; avg=统计平均带宽; stdev=表示标准偏差,stdev是standard deviation的缩写; |
lat |
统计所有的IO请求完成所需的时间中,不同的时间所占的比例。 |
cpu=
|
CPU统计信息; usr=测试进程所占CPU的%usr占用率; sys=测试进程所占CPU的%sys占用率 ctx=统计测试进程所发生的上下文切换次数; majf=统计major page fault的次数; minf=统计minor page fault的次数; |
IO depths= |
平均的IO队列深度统计。 |
IO submit= |
发出的IO请求中,不同的IO块所占的比例。 |
IO complete= |
类似于上面的IO submit统计,IO complete表示Fio所完成的IO请求中,不同的IO块 所占的比例。 |
Group的各项输出解释
Group的输出结果类似如下所示:
对这部分的输出解释如下:
输出
|
解释
|
io= |
测试所完成的IO数据量。 |
aggrb= |
测试过程的平均带宽。Aggrb是Aggregate bandwidth的缩写。 |
minb= |
当前group中各个thread的最低带宽。 |
maxb= |
当前group中各个thread的最高带跨。 |
mint= |
当前group中各个thread所花费的最短时间。 |
maxt= |
当前group中各个thread所花费的最长时间。 |
磁盘输出结果类似如下所示:
对这部分的输出解释如下:
输出 |
解释 |
ios= |
所有group在当前磁盘上所产生的读/写IO请求次数。 |
merge= |
发送给当前磁盘的读/写IO请求中,在IO调度层被合并的次数是多少。 |
ticks= |
这项统计的意思暂时不明白。 |
in_queue = |
在磁盘队列中所花费的所有时间。 |
util= |
当前磁盘的利用率。如果该值为100%,表示磁盘时刻都在处理IO请求;如果该值为50%, 表示磁盘有50%的时间处于空闲。 |
另一种测试方法利用配置文件
job file格式采用经典的ini文件,[]中的值表示job name,可以采用任意的ASCII字符,‘global’除外,global有特殊的意义。Global section描述了job file中各个job的默认配置值。一个job section可以覆盖global section中的参数,一个job file可以包含几个global section.一个job只会受到它上面的global section的影响。‘;’和‘#’可以用作注释
实例:
[global]
ioengine=libaio
direct=1
bs=4k
runtime=300
size=100%
numjobs=4
iodepth=128
group_reporting
time_based=1
rw=randread
[vdb]
new_group
filename=/dev/vdb
[vdc]
new_group
filename=/dev/vdc
[vdd]
new_group
filename=/dev/vdd
[vde]
new_group
filename=/dev/vde
运行fio文件
运行方式:$fio job_file
它会根据job_file的内容来运行。你可以在命令行中指定多个job file,fio进并行化运行这些文件。
原文链接:https://blog.csdn.net/owlcity123/article/details/104345168
云主机磁盘性能测试
云主机磁盘性能测试主要包含时延测试、IOPS测试、带宽测试。
通常采用小io单线程、单并发测试时延,4k随机读时延示例:
[global]
ioengine=libaio
direct=1
bs=4k
runtime=300
size=100%
numjobs=1
iodepth=1
group_reporting
time_based=1
rw=randread
[vdb]
new_group
filename=/dev/vdb
测试IOPS一般选用小IO,线程数小于等于云主机cpu核数,如在一个4c8g的云主机中测试IOPS示例如下:
[global]
ioengine=libaio
direct=1
bs=4k
runtime=300
size=100%
numjobs=4
iodepth=128
group_reporting
time_based=1
rw=randread
[vdb]
new_group
filename=/dev/vdb
测试带宽通常选择大IO,如使用1M块大小的IO测试带宽,示例:
[global]
ioengine=libaio
direct=1
bs=1m
runtime=300
size=100%
numjobs=4
iodepth=32
group_reporting
time_based=1
rw=randread
[vdb]
new_group
filename=/dev/vdb
我们在测试云主机磁盘性能的时候会根据云主机的使用场景选择不同大小的io进行测试,上述示例适用于一般情况下不明确云主机使用场景时的测试。