硬盘的性能如何衡量?一般使用以下几个指标对存储设备的性能进行描述:
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是测试磁盘性能的一个非常好的工具,用来对硬件进行压力测试和验证。支持13种不同的I/O引擎,包括:sync,mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio 等等。
支持几乎所有的存储描述参数,大量对CPU、内存、进程/线程、文件、IO特性的配置。
FIO最初是用来节省为特定负载写专门测试程序,或是进行性能测试,或是找到和重现bug的时间。
请特别注意:
1. 请不要在系统盘上进行 fio 测试,避免损坏系统重要文件
2. fio测试建议在空闲的、未保存重要数据的硬盘上进行,并在测试完后重新制作文件系统。请不要在业务数据硬盘上测试,避免底层文件系统元数据损坏导致数据损坏
2. 测试硬盘性能时,推荐直接测试裸盘(如 vdb);测试文件系统性能时,推荐指定具体文件测试(如 /data/file)
1、FIO安装
wget http://freshmeat.net/projects/fio/ 或者 http://brick.kernel.dk/snaps/fio-2.2.5.tar.gz
yum install gcc libaio libaio-devel
tar zxvf fio-2.2.5.tar.gz && cd fio-2.2.5.tar.gz
./configure
make && make install
2、FIO用法
fio -filename=/tmp/test_randread -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=mytest
常用参数如下:
filename=/dev/sdb1 测试文件名称,通常选择需要测试的盘的data目录。待测试的磁盘设备文件 name=mytest job的名称
direct=1 测试过程绕过机器自带的buffer。使测试结果更真实。
rw=randwrite 读写模式,包括顺序读(read)、顺序写(write)、随机读(randread)、随机写(randwrite)、混合读写(rw)、随机读写(randrw)
bs=16k 单次io的块文件大小为16k
bsrange=512-2048 同上,提定数据块的大小范围,也可以是4k,8k,32k
size=5g 本次的测试文件大小为5g,以每次4k的io进行测试。
numjobs=30 本次的测试线程为30.
runtime=1000 测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止。
ioengine=psync 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、测试过程
环境:4个盘做raid5
fio -filename=/dev/sda3 -iodepth=30 -thread -rw=read -ioengine=libio -bs=4k -runtime=120 -numjobs=50 -group_reporting -name=iotest|tee read_4k
上图中时延“18136.07”单位为微秒(usec),可以转换单位为18.136毫秒(ms)
另一种简单的测试方法
利用配置文件,此处的fio.conf是自己编写的脚本文件
job文件格式
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
iodepth=128
time_based
direct=1
thread=1
group_reporting
randrepeat=0
norandommap
numjobs=32
timeout=6000
runtime=120
[randrw-4k]
rw=randrw
bs=4k
filename=/dev/sdb:/dev/sdc:/dev/sdf:/dev/sdd:/dev/sde:/dev/sdh:/dev/sdg:/dev/sdi:/dev/sdk:/dev/sdj:/dev/sdl:/dev/sdm
rwmixread=100
stonewall
[randrw-8k]
rw=randrw
bs=8k
filename=/dev/sdb:/dev/sdc:/dev/sdf:/dev/sdd:/dev/sde:/dev/sdh:/dev/sdg:/dev/sdi:/dev/sdk:/dev/sdj:/dev/sdl:/dev/sdm
rwmixread=100
stonewall
[randrw-512k]
rw=randrw
bs=512k
filename=/dev/sdb:/dev/sdc:/dev/sdf:/dev/sdd:/dev/sde:/dev/sdh:/dev/sdg:/dev/sdi:/dev/sdk:/dev/sdj:/dev/sdl:/dev/sdm
rwmixread=100
实例二:
$fio –name=global –rw=randread –size=128m –name=job1 –name=job2
运行fio文件
运行方式:
$fio job_file
它会根据job_file的内容来运行。你可以在命令行中指定多个job file,fio进串行化运行这些文件。相当于在同一个job file不同的section之间使用了stonewall参数。
如果某个job file只包含一个job,可以在命令行中给出参数,来直接运行,不再需要读取job file。命令行参数同job file参数的格式是一样的。比如,在job file中的参数iodepth=2,在命令行中可以写为–iodepth 2 或是 –iodepth=2.
fio不需要使用root来执行,除非使用到的文件或是设备需要root权限。一些选项可能会被限制,比如内存锁,io调度器切换,或是nice value降级
参考文件:https://www.iteye.com/blog/elf8848-2168876
fio工具测试硬盘性能_十里平湖的博客-CSDN博客_fio测试磁盘性能