当前位置: 首页 > 科技观察

Linux测试磁盘IO性能的三种方法详解总结

时间:2023-03-12 03:07:54 科技观察

概述在磁盘测试中,我们一般会关心几个指标:iops(每秒执行的IO数),bw(带宽,每秒吞吐量),lat(延迟每个IO操作)。当每次IO操作的block较小时,比如512bytes/4k/8k等,主要测试的是iops。当每次IO操作的block较大时,比如256k/512k/1M等,主要测试bw。1、dd命令dd是linux自带的磁盘读写工具,可以用来测试顺序读写。一般来说,读写磁盘有两种方式:BufferIO和DirectIO。DirectIO更能理解纯磁盘读写的性能。1.语法语法格式dd[option]dd命令选项详解if=file:输入文件名,默认为标准输入of=file:输出文件名,默认为标准输出ibs=bytes:readbytesbytesatatime(即一个块大小为bytesbytes)obs=bytes:一次写入bytes字节(即一个块大小为bytesbytes)bs=bytes:同时设置读写块大小为bytes,即可以替换ibs和obscbs=bytes:一次转换bytes字节,即转换缓冲区大小skip=blocks:从输入文件的开头跳过blocksblocks并开始复制输出文件并开始复制。(通常只在输出文件为磁盘或磁带时有效)count=blocks:只复制blocks块,块大小等于ibs指定的字节数conv=ASCII:将EBCDIC码转换为ASCIl码。conv=ebcdic:将ASCIl码转换为EBCDIC码。conv=ibm:将ASCIl码转换为alternateEBCDIC码。conv=block:将变化的位转换成固定的字符。conv=ublock:将固定位转换为可变位。conv=ucase:将字母从小写转换为大写。conv=lcase:将字母从大写转换为小写。conv=notrunc:不截断输出文件。conv=swab:交换每对输入字节。conv=noerror:不停止错误处理。conv=sync:调整每条输入记录的大小为ibs的大小(用NUL填充)。FLAGS参数说明:append-appendmode(makessenseonlyforoutput;conv=notruncsug-gested)direct:使用直接IO读写数据;目录:除非是目录,否则读写失败;dsync:使用同步IO读写数据;sync:同上,但是对于是元数据fullblock:累计全块(accumulatefullblocksofinput)(iflagonly);nonblock:读写数据采用非阻塞IO方式noatime:读写数据不更新存取时间注意:如果指定数字以下列字符结尾,则乘以对应的数字:b=512,c=1,k=1024,w=2,xm=数m,kB=1000,K=1024,MB=1000*1000,M=1024*1024,GB=1000*1000*1000,G=1024*1024*10242,dd测试DirectIOiops——写测试ddif=/dev/zeroof=./a.datbs=8kcount=1Moflag=directiops——读测试ddif=./a.datof=/dev/nullbs=8kcount=1Miflag=directbw——写测试ddif=/dev/zeroof=./a.datbs=1Mcount=8koflag=directbw——读取测试ddif=./a.datof=/dev/nullbs=1Mcount=8kiflag=direct3、ddtestBufferIOBufferIO主要出现在一些大文件读取并编写场景。由于内存作为Cache,读写性能通常比DirectIO高很多,尤其是读,所以这种场景我们只关心bw。在使用dd测试BufferIO的写入时,需要加一个conv=f??datasync。使用这个参数,在所有读写之后都会调用一个sync,保证所有数据都刷到磁盘(期间操作系统也可能主动刷盘),否则就是主内存正在读写;另一个参数是oflag=dsync,同样使用了BufferIO,但是每次IO操作后都会执行一次sync。通常conv=f??datasync比较适合读写大文件的场景,所以这里用它作为参数进行测试。bw——写测试ddif=/dev/zeroof=./a.datbs=1Mcount=8kconv=f??datasyncbw——读测试ddif=./a.datof=/dev/nullbs=1Mcount=8k二、fio工具fio是专门的用来测试磁盘IO的工具比dd强大多了。可用于测试顺序读写、随机读写、顺序混合读写、随机混合读写,并可调整IO并发度。测试完成后会生成测试报告,功能还是比较强大的。1、测试现场:100%随机,100%读取,4Kfio-filename=/dev/emcpowerb-direct=1-iodepth1-thread-rw=randread-ioengine=psync-bs=4k-size=1000G-numjobs=50-runtime=180-group_reporting-name=rand_100read_4k100%随机,100%写入,4Kfio-filename=/dev/emcpowerb-direct=1-iodepth1-thread-rw=randwrite-ioengine=psync-bs=4k-size=1000G-numjobs=50-runtime=180-group_reporting-name=rand_100write_4k100%顺序,100%读,4Kfio-filename=/dev/emcpowerb-direct=1-iodepth1-thread-rw=read-ioengine=psync-bs=4k-size=1000G-numjobs=50-runtime=180-group_reporting-name=sqe_100read_4k100%顺序,100%写入,4Kfio-filename=/dev/emcpowerb-direct=1-iodepth1-thread-rw=write-ioengine=psync-bs=4k-size=1000G-numjobs=50-runtime=180-group_reporting-name=sqe_100write_4k100%随机,70%读,30%写4Kfio-filename=/dev/emcpowerb-direct=1-iodepth1-thread-rw=randrw-rwmixread=70-ioengine=psync-bs=4k-size=1000G-numjobs=50-runtime=180-group_reporting-name=randrw_70read_4k三、iozoneIOzone是一个文件系统基准测试工具。基准生成和测量各种文件操作。Iozone已移植到许多机器上并在许多操作系统下运行。Iozone是一款文件系统基准测试工具,可以测试文件系统在不同操作系统下的读写性能。可以测试Read、write、re-Read、re-write、readbackwards、readstrided、fread、fwrite、randomread、pread、mmap、aio_read、aio_write等硬盘在不同模式下的性能。测试的时候注意设置的测试文件的大小一定要大于你的内存(最好是内存的两倍),否则linux会缓存你读写的内容。会让价值观很不切实际。示例:iozone-i0-i2-Rc-a-q500k-g1m-n100k-btest_result.xls参数说明如下:-i代表测试场景,0代表顺序写测试,1代表随机读写测试。还有许多其他场景可供选择。具体可以参考iozone-h的说明。-R表示生成一个Excel报告文件。-c表示每次读写测试完成后发送关闭连接的命令,主要用于测试NFS系统。-a代表自动模式。-q表示最大记录大小。-g代表最大文件大小。-n代表最小的文件大小。-b输出生成的Excel报告文件名。生成报告如下: