windows io测试工具_Fio磁盘io测试工具详解
目前主流的第三方IO测试工具有fio、iometer。windows下常用iometer进行测试,而fio则常用于Linux系统。用来测试本地磁盘、网络存储等的性能。
其配置灵活多样,支持多客户端并发测试(server、client模式),支持文件级、对象级存储测试,更对多种主流的存储如GlusterFS、CephFS等有专用测试引擎。测试结果包括IOPS、BW、lat等多种数据
1.安装fio
在fio下载fio-2.1.文件,解压后./configure、make、make install之后就可以使用fio了。
2、fio参数简介(后面有详细解释)
filename=/dev/emcpowerb 支持文件系统或者裸设备,-filename=/dev/sda2或-filename=/dev/sdb
direct=1 测试过程绕过机器自带的buffer,使测试结果更真实
rw=randwread 测试随机读的I/O
rw=randwrite 测试随机写的I/O
rw=randrw 测试随机混合写和读的I/O
rw=read 测试顺序读的I/O
rw=write 测试顺序写的I/O
rw=rw 测试顺序混合写和读的I/O
bs=4k 单次io的块文件大小为4k
bsrange=512-2048 同上,提定数据块的大小范围
size=5g 本次的测试文件大小为5g,以每次4k的io进行测试
numjobs=0 本次的测试线程为0
runtime=1000 测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止
ioengine=psync io引擎使用pync方式,如果要使用libaio引擎,需要yum install libaio-devel包
rwmixwrite=0 在混合读写的模式下,写占0%
group_reporting 关于显示结果的,汇总每个进程的信息
此外
lockmem=1g 只使用1g内存进行测试
zero_buffers 用0初始化系统buffer
nrfiles=8 每个进程生成文件的数量
#fio -help查看每个参数,具体的参数可以在查看how to文档
例:100%随机,100%读, 4K
fio -filename=/dev/sdb -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=rand_100read_4k
.fio脚本
除了例子中的直接加命令行运行,还可以配置文件脚本运行
fio xxx.fio(脚本文件)
脚本基本格式:
; -- start job file -- ; 或 # 为fio脚本注释
[global] ;[global]为全局参数,即后面所有job都可以共享
rw=randread
size=128m
[job1] ;[job name]对应job 名,后面加该job特有参数
[job2]
; -- end job file --
变量参数传递:
; -- start job file --
[random-writers]
rw=randwrite
size=${SIZE}
numjobs=${UMJOBS}
; -- end job file --
简单例子:
[mytest]
filename=/mnt/beegfs/fioTest
ioengine=psync
direct=0
thread
rw=randread
bs=4k
size=1g
numjobs=2
runtime=10
group_reporting
参数详解
fio可以指定要测试的I/O的类型,读/写,顺序/随机
一般情况下读写速度区别:
读大于写的速度| 顺序读写大于随机的速度,尤其是小文件的随机读写 性能之差令人唏嘘。但对于固态硬盘,由于其没有机械硬盘的物理结构,所以其物理小文件性能可以碾压机械硬盘。并且随着以固态硬盘位核心而设计的接口和协议的出现(M.2、PCIe接口 VMe协议等)即使大文件固态硬盘也能完全碾压机械硬盘了。
块大小(Block Size)
一般来说块大小为 512B 4K 16K .....1M、4M 这样的扇区大小(512字节)的倍数,小于16K的文件,一般算作小文件,大于16K的文件属于大文件。
I/O size
一次读写多大的数据,即每次io请求要读写多少数据,一般是1K/4K....1M/4M等大小。
I/O引擎(I/O engine)
使用I/O引擎就是使用某些函数,以某些特定方式来访问存储,不同的I/O引擎有不同的使用场景。 Linux可以使用 libaio,sync,psync等
libaio引擎允许异步多线程进行,颇为钟爱Linux native asynchronous I/O. ote that Linux may only support queued behavior with non-buffered I/O (set direct=1 or buffered=0). This engine defines engine specific opti.
I/O深度(I/O depth)
简单的理解就是一次提交要提交多少个I/O请求,不过这个只对异步I/O引擎有用,因为同步I/O总是会等待提交的I/O请求返回了再提交下一个I/O请求,所以iodepth总是1。
随着iodepth的增大在一定范围内,带宽、io延时会增加,超过一定范围后带宽增加缓慢,延时继续会增加。延时增加的原因是因为随着iodepth增加都需花更多的时间等待请求io数量达到iodepth数值后,才会真正把io请求发送给存储,所以平均每一个io的延时都会增大了。
带宽之所以会提高可能主要与网络延时有关,如果每次只发一个io请求,那么完成这一次io请求的时间 = 收发延时 io请求执行时间,如果没有延时则每秒客户端可以完成1000次请求,但是加上收发延时后,每秒的请求次数必然减少。但是如果将每次io请求数量增加,比如一次发10个请求,那么这10次请求时间花费 = 等待10个io请求 1次收发延时 10次io请求执行时间,而10次单个的io请求时间 = 10次收发延时 10次io请求执行时间。如果等待10个io请求时间低于9次收发延时,那么每秒能够完成的io请求时间就会增加,也就会增加带宽
线程/进程(Threads/Processes)
简单的理解就是一次提交要提交多少个I/O请求,不过这个只对异步I/O引擎有用,因为同步I/O总是会等待提交的I/O请求返回了再提交下一个I/O请求,所以iodepth总是1
ioengine=str
定义job向文件发起IO的方式,不同的引擎使用不同的函数和实现对测试文件发起访问。有很多(在安装了fio的系统上可以通过fio--enghelp查看有哪些ioengine,并且通过fio --enghelp=“引擎名字”查看对应引擎的帮助)如:
libaio Linux专有的异步IO,异步引擎。(需要注意的是如果你是编译安装的fio,则需要在fio编译前安装libaio的相关库,否则编译出来的fio是没有这个引擎的)
psync/sync 同步引擎
windowsaio 如果在windows下运行fio则需要使用这个引擎
filename=str
fio一般会根据job线程号,文件号来给文件起名。如果想让多个线程共享一个文件,指定一个代替默认名字的名字,如果i/o引擎是基于文件的,你可以使用:来分开不同的文件 - 是保留的名称,表示是stdin或stdout,取决于读/写方向设置。
一般测试块设备级(磁盘)时候把 filename=str 指定为设备名如:filename=/dev/sda1 测试的就是/dev/sda1磁盘,如果要测试文件级设备,可以将 filename 指定到挂载好的目录中,如filename=/mnt/nfs/test,注意filename指定的是一个文件(filename=/mnt/nfs/test 测的是/mnt/nfs挂载目录中生成test文件进行测试)写成目录fio会报error=Is a directory。
一般测试文件级设备或目录,最好实用directory=/mnt/nfs/参数fio一般会根据job线程号,文件号来给文件起名。
size=int
fio本次job的总共的io大小。除非你设置了runtime(运行时间)或 nrfiles(运行文件数量) 和 filesize(运行文件大小)被设定,fio将会一直运行到这个(size=int)大小的数据被传输完毕,这些数据将会被平均分到job定义的文件中,如果没有设定这个大小,fio将会使用整个磁盘空间,如果这个文件不存在的话(filename=str没有给出),大小一定要给出。也可以给一个1-100的百分比大小,如果size=20%,fio将会使用整个磁盘的20%用来设置本次测试所测的文件大小使用时发现fio会先生成你指定大小的文件,然后在进行测试(如果之前有生成的与本次同名的就不会再生成一次了),实际测试时可以定时测试(runtime=int)或定量测试(size=int)
nrfiles和fileszie可以指定生成几个(nrfiles=int)多大(filesize=int)的文件进行测试,所以测试过程中生成的文件总量size=nrfiles*fileszie
ramp_time=int
如果设置了这个参数,fio将会在做任何有关性能的纪录之前,(job)运行你指定的时间,用于在记录前使设备性能稳定,从而最大限度的减少稳定性能的运行时间,注意这个job运行时间会是(ramp_timeruntime)。
有时设备测试之前需要运行一会性能才稳定,加上这个参数就可以让设备运行一会而不记录,这个时间是包括在runtime时间之内的.
readwrite=str, rw=str
I/O类型
read 顺序读
write 顺序写
randread 随机读
randwrite 随机写
rw 混合顺序读写
randrw 混合随机读写对于混合的读写,默认的比例是50/50(另外可以在读写类型的字符串后面添加一个“:”,比如rw=randread:8,这个是用来指定每次随机读前有关偏移量之类的东西的,一般也用不到,有需要的可以自己看官方文档)
rwmixread=int
混合随机读写中读所占的百分比,初始值是50
通过这个参数既可以控制读写的比例了,比如如果想要读写:7则可以设置rwmixread=70
startdelay=int
fio启动几秒后再启动job。只有在job文件包含几个jobs时才有效,是为了将某个job延时几秒后执行,可以让多个job之间有一定的时间间隔。
与ramp_time的区别就是startdelay是job任务完全不运行,就是闲等,ramp_time是指job开始执行你指定的任务了,但是ramp_time时间内不会做记录
numjobs=int
本次任务克隆的数量(线程/进程 执行相同的任务),默认值1。
可以根据自己的主机性能指定执行测试任务的job的数量,可以得到更加接近“满载”状态下的性能指标
thread
使用pthread_create创建线程代替使用fork创建进程,
使用 threads 在一定程度上可以节省系统开销
blocksize=int[,int], bs=int[,int]
指定一个变化的i/o块,i/o的大小总是最小i/o的整数倍(除非设置了blocksize_unaligned参数),如果只设置了一个变化区间,这项设置将会同时作用于读和写。但是可以使用逗号分开指定(读和写),例如(bsrange=1k-4k,2k-8k),(其它的见blocksize项)
bs可以指定特定大小的i/o块大小,bsrange则可以指定一个变化的i/o块大小,再性能测试中,这个参数可以模拟一个更真实的i/o请求
blocksize_range=irange[,irange][,irange]
,bsrange=irange[,irange][,irange]
指定一个IO块范围,除非设置了blocksize_unaligned参数,否则生成的IO块大小将是最小的IO的整数倍。使用逗号分隔读写的区间描述,如: bsrange=1k-4k,2k-8k
即随机生成1k-4k的文件用于读,2k-8k的文件用于写,而且如果你没有指定blocksize_unaligned,则本例中只会生成1k、2k、k、4k的测试文件用于读取,2k、4k、6k ......。如果不想把读写分开指定,则可以写为bsrange=1k-8k,那么就会生成1k-8k的文件同时用于读写。
blocksize_unaligned, bs_unaligned
如果设置了这个参数,那么fio将产生任何bsrange指定的区间中任意大小的测试文件,但是此设置在direct 的I/O通常需要分区对齐。
iodepth=int
文件上I/O模块的数量,注意大于1的iodepth对于同步io来说是没用的的(除非verify_async被使用),即使是异步引擎也可能会被操作系统限制,达不到指定的iO深度,这可能会发生在使用libaio引擎且direct没有设置成1时,因为操作系统的缓存可能不是异步的。注意fio的输出中的IO depth分布区间,是否符合设置的预期。默认值:1
这个选项可以提高I/O的并发数量,但并不是数值越大测出来性能就越好,具体的数值可以多尝试几次来确定。
direct=bool
如果设置为真,将不使用I/O缓存(通常是O_DIRECT).初始值为否
文件及存储如nfs,再向服务器中写入数据时,有事会发现写入速度甚至会远大于理论带宽数值,这就是由于拷贝调用了缓存,设置direct=1则可以不使用缓存,否则有事可能会测出来很吓人的性能数据。
exec_preren=str
运行job之前,通过过system执行指定的命令
exec_postrun=str
运行job之后,通过过system执行指定的命令
exec_preren与exec_postrun可以再job运行前后执行一些命令,配合你的测试。
nrfiles=int
用于指定每一个job的要产生多少个大小为filesize的文件,注意每一个独立的job都会产生int数量的文件
description=str
可以给输出做标识
unlink=bool
job运行完毕后会删除运行过程中产生的测试文件。但可能会使测试文件被反复创建,浪费测试时间。
filesize=int
单个文件的大小,可以是一个范围,在这种情况下,fio将会在一个范围内选择一个大小来决定单个文件大小,如果没有设置的话,所有的文件将会是同样的大小。
使用nrfiles和filesize这两个参数,可以使每个job(每个任务的每个线程或进程)生成指定数量特定大小的文件,这样对于后端是分布式的文件系统,模拟会更真实。(如果是通过size=int和filename=str两个参数,生成的会只有一个名为str,大小为size的文件)
注意此参数与bs参数的区别,bs是控制一次访问的块的大小的,而filesize是控制被访问的文件的大小的,例如bs=4K, fileszie=1M,fio则会以每次4K的请求大小来访问1M的文件
openfile=int
在同一时间可以同时打开的文件数目,默认同nrfiles相等,可以设置小一些,来限制同时打开的文件数目。
可以通过设置它模拟指定的负载time_based
如果设置的即使job已被完全读写或写完,也会执行完runtime规定的时间。它是通过循环执行相同的负载来实现的。加上这个参数可以防止job提前结束。
create_only=bool
如果设置为true的话,fio将只会生成测试需要的文件但是不执行任务,可以用它来创建大量的文件(配合nrfiles和filesize)。
stonewall,wait_for_previous
在一个有多个job的文件中,可以多个job逐个执行(stonewall后面将是一个新的group),通常用于需要执行多种不同的任务时,让任务按顺序执行
这两个参数其实功能基本相同,只是使用的位置有所不同,stonewall一般放在一个job任务的末尾,wait_for_previous一般放在一个job任务的开头
4、Linux系统中查看IO命令iostat详解
[root@shannon /]# iostat -xd
Linux .8.1-16.2.x86_64 (rac01-node01) 0/10/2019 _x86_64_ (40 CPU)
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.05 0.75 2.50 0.50 76.59 69.8 48.96 0.00 1.17 0.47 0.14
输出参数描述:
rrqms:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge)
wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。
rsec/s:The number of sectors read from the device per second.
wsec/s:The number of sectors written to the device per second.
rKB/s:The number of kilobytes read from the device per second.
wKB/s:The number of kilobytes written to the device per second.
avgrq-sz:平均请求扇区的大小,The average size (in sectors) of the requests that were issued to the device.
avgqu-sz:是平均请求队列的长度。毫无疑问,队列长度越短越好,The average queue length of the requests that were issued to the device.
await:每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。
这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
svctm:表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好。
如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢。
%util: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,
所以该参数暗示了设备的繁忙程度,一般地,如果该参数是100%表示磁盘设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)
5.IO队列深度
在某个时刻,有个inflight的IO请求,包括在队列中的IO请求、磁盘正在处理的IO请求。就是队列深度。加大硬盘队列深度就是让硬盘不断工作,减少硬盘的空闲时间。加大队列深度 -> 提高利用率 -> 获得IOPS和MBPS峰值 ->注意响应时间在可接受的范围内,增加队列深度的办法有很多,使用异步IO,同时发起多个IO请求,相当于队列中有多个IO请求,多线程发起同步IO请求,相当于队列中有多个IO请求。增大应用IO大小,到达底层之后,会变成多个IO请求,相当于队列中有多个IO请求 队列深度增加了。队列深度增加了,IO在队列的等待时间也会增加,导致IO响应时间变大,这需要权衡。
为何要对磁盘I/O进行并行处理呢?主要目的是提升应用程序的性能。这一点对于多物理磁盘组成的虚拟磁盘(或LU)显得尤为重要。如果一次提交一个I/O,虽然响应时间较短,但系统的吞吐量很小。相比较而言,一次提交多个I/O既缩短了磁头移动距离(通过电梯算法),同时也能够提升IOPS。假如一部电梯一次只能搭乘一人,那么每个人一但乘上电梯,就能快速达到目的地(响应时间),但需要耗费较长的等待时间(队列长度)。因此一次向磁盘系统提交多个I/O能够平衡吞吐量和整体响应时间。
Linux系统查看默认队列深度:
lsscsi -l
6.对报告分析
测试结果包括IOPS、BW、lat等多种数据
io=执行了多少M的IO
bw=平均IO带宽iops=IOPSrunt=线程运行时间slat=提交延迟clat=完成延迟lat=响应时间bw=带宽cpu=利用率IO depths=io队列IO submit=单个IO提交要提交的IO数IO complete=Like the above submit number, but for completi instead.IO issued=The number of read/write requests issued, and how many of them were short.IO latencies=IO完延迟的分布
io=总共执行了多少size的IOaggrb=group总带宽minb=最小.平均带宽.maxb=最大平均带宽.mint=group中线程的最短运行时间.maxt=group中线程的最长运行时间.
ios=所有group总共执行的IO数.merge=总共发生的IO合并数.ticks=umber of ticks we kept the disk busy.io_queue=花费在队列上的总共时间.util=磁盘利用率
参考资料:https://wwwblogs/raykuan/p/6914748.html、https:///mrsate/article/details/5292102?from=groupmessage&isappinstalled=0
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
推荐阅读
留言与评论(共有 5 条评论) |
本站网友 奉贤海滩 | 1分钟前 发表 |
Linux系统查看默认队列深度:lsscsi -l6.对报告分析测试结果包括IOPS | |
本站网友 缝肛门 | 7分钟前 发表 |
只有在job文件包含几个jobs时才有效,是为了将某个job延时几秒后执行,可以让多个job之间有一定的时间间隔 | |
本站网友 激烈的意思 | 4分钟前 发表 |
带宽之所以会提高可能主要与网络延时有关,如果每次只发一个io请求,那么完成这一次io请求的时间 = 收发延时 io请求执行时间,如果没有延时则每秒客户端可以完成1000次请求,但是加上收发延时后,每秒的请求次数必然减少 | |
本站网友 济南绿地国际花都 | 8分钟前 发表 |
包括在队列中的IO请求 |