FIO详解

fio - Flexible IO Tester

一、服务器配置:

由于我们想通过fio得到SSD真实的参数信息,因此我们需要服务器BIOS一些参数的配合,以便能更好的体现硬盘的性能。
在这里插入图片描述
以华为1288HV5为例:
在这里插入图片描述

二、fio

1.安装

a.下载地址:http://freshmeat.sourceforge.net/projects/fio/
b.安装两个插件
#yum install libaio*
#yum install zlib*
c.编译安装
#tar -xvf fio-2.1.10.tar.gz
#cd fio-2.1.10
#./configure
#make
#make install

备注:
最新的fio可以在https://github.com/axboe/fio进行下载,但可能会由于系统自带的gcc版本较低导致无法顺利安装。
升级gcc后即可顺利安装。升级gcc请参考:https://blog.csdn.net/weixin_40343504/article/details/107843661

2.fio执行脚本顺序

1)Secure erase the drive
2)Prefill the drive with Sequential Write (128K Sequential Write QD=32 / size=100% with loops=2 / numjobs=1)
3)128K 100% Sequential Write (ramp_time=60sec / runtime=2h / QD=32 / numjobs=1)
4)128K 100% Sequential Read (ramp_time=60sec / runtime=2h / QD=32 / numjobs=1)

5)Prefill the drive with randwrite (128K randwrite QD=32 / runtime=3hr / numjobs=1)
6) 4K 100% Random Write (ramp_time=60sec / runtime=2h / QD=32 / numjobs=1)
7)4K 100% Random Read (ramp_time=60sec / runtime=2h / QD=32 / numjobs=1)

注意事项:
a.硬盘应直连主板这样测出来的数据更加真实,但如SATA通过Raid Card连接应将硬盘设置为JBOD。
b.硬盘测试前一定要进行安全擦除。
c.顺序读、顺序写前可以不添加稳态处理。
d.随机读、随机写前一定要有randwrite 2h(这个时间与硬盘容量大小有关,4T以下设置2个小时应该没有问题)左右的稳态处理,如果没有添加会影响Random write。下图就是在随机读写前未加稳态处理时,rand_write iops的图
在这里插入图片描述
e.测试时间runime的值应尽量不低于1h,如果时间很短没有测试实际意义。

3.执行脚本,以SATA接口硬盘为例:

./SATA.sh sdb

#**************************Script of precondition*************************#
echo "$DEV precondition seq write ready"
date
fio --ioengine=libaio --direct=1 --thread --norandommap --filename=/dev/"$DEV" --name="$DEV"_init_seq --output="$DEV"_init_seq.log --rw=write --bs=128k --numjobs=1 --iodepth=128 --loops=2

#**************************Script of seq*************************#
for WL2 in write read
do
	for jobs2 in 1
	do
		for QD2 in 128
		do
			for runt2 in 1800
			do
				for block2 in 128k
				do

echo "$DEV rw_${WL2}  bs_${block2} nujobs_${jobs2} QD_${QD2} test      "
date
issdcm -drive_index 0 -smart >"$DEV"_${block2}_${WL2}_${jobs2}_${QD2}_smart.log
fio --ioengine=libaio --randrepeat=0 --norandommap --thread --direct=1 --group_reporting --name=mytest --ramp_time=60 --runtime=${runt2} --time_based --numjobs=${jobs2} --iodepth=${QD2} --filename=/dev/"$DEV" --rw=${WL2} --bs=${block2} --output="$DEV"_${block2}_${WL2}_${jobs2}_${QD2}.log --log_avg_msec=1000 --write_iops_log="$DEV"_${block2}_${WL2}_${jobs2}_${QD2}_iops --write_lat_log="$DEV"_${block2}_${WL2}_${jobs2}_${QD2}_lat --write_bw_log="$DEV"_${block2}_${WL2}_${jobs2}_${QD2}_bw
				done
			done
		done
	done
done
#**************************Script of precondition*************************#
echo "$DEV precondition random write ready"
date
fio --ioengine=libaio --direct=1 --thread --norandommap --filename=/dev/"$DEV" --name="$DEV"_init_random --output="$DEV"_init2_random.log --rw=randwrite --bs=128k --numjobs=4 --iodepth=64 --time_based --ramp_time=60 --runtime=7200
#**************************Script of random*************************#
for WL in randwrite randread
do
	for jobs in 4
	do
		for QD in 64
		do
			for runt in 1800
			do
				for block in 8k 4k
				do	
			
echo "$DEV rw_${WL} bs_${block} nujobs_${jobs} QD_${QD} test    "
date
issdcm -drive_index 0 -smart >"$DEV"_${block}_${WL}_${jobs}_${QD}_smart.log
fio --ioengine=libaio --randrepeat=0 --norandommap --thread --direct=1 --group_reporting --name=mytest --ramp_time=60 --runtime=${runt} --time_based --numjobs=${jobs} --iodepth=${QD} --filename=/dev/"$DEV" --rw=${WL} --bs=${block} --output="$DEV"_${block}_${WL}_${jobs}_${QD}.log --log_avg_msec=1000 --write_iops_log="$DEV"_${block}_${WL}_${jobs}_${QD}_iops --write_lat_log="$DEV"_${block}_${WL}_${jobs}_${QD}_lat
				done
			done
		done
	done
done

#**************************Script of randrw*************************#
for WL1 in randrw
do
	for jobs1 in 4
	do
		for QD1 in 64
		do
			for runt1 in 1800
			do
				for block1 in 8k 4k
				do	
			
echo "$DEV rw_${WL1}  bs_${block1} nujobs_${jobs1} QD_${QD1} test    "
date
issdcm -drive_index 0 -smart >"$DEV"_${block1}_${WL1}_${jobs1}_${QD1}_smart.log
fio --ioengine=libaio --randrepeat=0 --norandommap --thread --direct=1 --group_reporting --name=mytest --ramp_time=60 --runtime=${runt1} --time_based --numjobs=${jobs1} --iodepth=${QD1} --filename=/dev/"$DEV" --rw=${WL1} --rwmixread=70 --bs=${block1} --output="$DEV"_${block1}_${WL1}_${jobs1}_${QD1}.log --log_avg_msec=1000 --write_iops_log="$DEV"_${block1}_${WL1}_${jobs1}_${QD1}_iops --write_lat_log="$DEV"_${block1}_${WL1}_${jobs1}_${QD1}_lat
				done
			done
		done
	done
done

4.数据分析

顺序读、顺序写主要看BW,随机读、随机写主要看IOPS.
1)怎么看lat分布?

bw (KB  /s): min=   71, max=  251, per=0.36%, avg=154.84, stdev=18.29

    lat (usec) :   2= 0.01%,   4=0.01%,  10=0.01%,   20=0.01%, 50=51.41%
    lat (usec) : 100=48.53%, 250=0.06%, 500=0.01%, 1000=0.01%
    lat (msec) :   2= 0.01%,   4=0.01%,  10=0.01%,   20=0.01%

这组数据表示latency的分布,说明了51.41%的request延迟小于50微秒,48.53%的延迟小于100微秒(但是大于50微秒),以此类推
其他待续:
参考:https://blog.csdn.net/feilianbb/article/details/50497845

2)fio log收集
请参考<利用Python3.4+收集fio测试结果>
https://blog.csdn.net/weixin_40343504/article/details/97886537

5.fio常用参数详解

a.loops=int
重复运行某个job多次,默认是1。
loops与runtime是两个不能同时存在的两个参数,loops主要是定义硬盘执行的圈数,而runtime只是定义fio执行的时间。
b.time_based
如果设置的话,即使file已被完全读写或写完,也要执行完runtime规定的时间。它是通过循环执行相同的负载来实现的,与runtime相对应。
c.ramp_time=time
设定在记录任何性能信息之前要运行特定负载的时间。这个用来等性能稳定后,再记录日志结果,因此可以减少生成稳定的结果需要的运行时间。
d.randrepeat=bool
对于随机IO负载,配置生成器的种子,使得路径是可以预估的,使得每次重复执行生成的序列是一样的。

如果无–randrepeat=0这个参数不会影响seqread,但会影响seqwrite,randwrite,randread.

在这里插入图片描述
e.norandommap
一般情况下,fio在做随机IO时,将会覆盖文件的每一个block.如果这个选项设置的话,fio将只是获取一个新的随机offset,而不会查询过去的历史。这意味着一些块可能没有读或写,一些块可能要读/写很多次。在个选项与verify=互斥,并只有多个块大小(bsrange=)正在使用,因为fio只会记录完整的块的重写。
f.thread
fio默认会使用fork()创建job,如果这个选项设置的话,fio将使用pthread_create来创建线程。
在这里插入图片描述
g.direct=bool
direct=1 测试过程绕过机器自带的buffer。使测试结果更真实。
h.group_reporting
如果‘numjobs’设置的话,我们感兴趣的可能是打印group的统计值,而不是一个单独的job。这在‘numjobs’的值很大时,一般是设置为true的,可以减少输出的信息量。如果‘group_reporting’设置的话,fio将会显示最终的per-groupreport而不是每一个job都会显示。
i.numjobs=int
创建特定数目的job副本。可能是创建大量的线程/进程来执行同一件事。我们将这样一系列的job,看作一个特定的group。

参考:https://www.itzhoulin.com/2015/12/24/fio-man-guide/

### 回答1: Linux fio命令是一款功能非常强大的IO测试工具,可以测试磁盘性能、网络性能等。它可以创建不同类型的IO负载,支持多线程测试,能够测试读写随机访问等不同场景下的性能表现,并能够生成报告进行分析。使用fio命令可以有效地评估系统IO性能表现,帮助用户找到系统瓶颈,从而优化系统性能。 ### 回答2: Linux Fio命令是一款性能测试工具,它可以用来测试存储设备或文件系统的性能。它可以随机读取、顺序读取、随机写入、顺序写入等测试。下面我们来详细了解一下Linux Fio命令的使用。 1、安装Linux Fio命令 我们可以使用下面的命令在Linux系统中安装Fio:sudo apt-get install fio 2、语法格式 fio [OPTIONS] [fio config files] 其中OPTIONS表示选项,包括:--name、--description、--ioengine、--blocksize等。fio config files表示配置文件的路径。 3、常见的Fio选项 (1)--name:命名当前测试,便于在日志中识别。 (2)--description:为当前测试进行描述,便于说明测试目的。 (3)--ioengine:设定IO引擎,包括async、mmap、sync、pvsync等。 (4)--blocksize:设定块大小,一般为512、4096等。 (5)--iodepth:设定I/O队列深度,一般为1、2、4、8等。 (6)--size:设定测试文件大小。 (7)--time_based:设定测试时间。 (8)--rw:设定读写模式,包括randread、randwrite、read、write等。 (9)--numjobs:设定同时进行的I/O操作数。 4、Fio配置文件 Fio的配置文件采用ini格式,其中包括以下几个关键词: (1)[global]:设定全局参数,如调度器,I/O引擎等。 (2)[job]:指定一个测试任务。 (3)[read]:指定读取操作的设置。 (4)[write]:指定写入操作的设置。 (5)[randread]:指定随机读取操作的设置。 (6)[randwrite]:指定随机写入操作的设置。 (7)[rwmixread]:指定读写比例。 5、使用Fio进行测试 我们可以使用下面的命令进行测试:sudo fio test.fio 其中test.fioFio配置文件的名称,我们也可以使用其他名称。 6、结论 通过使用Fio测试存储设备或文件系统的性能,可以比较客观地了解它们的读写能力,从而选择最合适的存储方案。但是需要注意的是,我们需要根据自己的情况设置合理的参数,才能得到可靠的测试结果。 ### 回答3: Linux下的fio命令是一款非常强大的IO性能测试工具,常用于测试各种存储设备的IO性能,包括硬盘、SSD、NVMe、RAID等。它支持多种IO模式、多种块大小、多种混合读写模式、多种IO引擎、多种输出格式等,可以模拟出各种实际应用场景下的IO负载,非常灵活。 fio命令的基本语法为:fio [options] [jobfile,......]。 其中,options表示命令选项,jobfile表示fio测试工作的配置文件。 fio测试工作的配置文件中,可以指定多个job来测试不同的IO负载。每个job由多个section构成,可以指定section的IO模式、块大小、读写比例、IO深度、运行时间、输出格式等,同时还可以指定多个模拟设备、多个文件或目录进行测试。 fio支持的IO模式包括: - sync:同步IO,即阻塞IO,占用CPU时间长,但IO质量和性能最优。 - async:异步IO,不占用CPU时间,但IO质量和性能较差。 - mmap:内存映射IO,可以将文件映射到内存中进行IO操作。 fio支持的块大小包括: - 512bytes - 1KB - 2KB - 4KB - 8KB - 16KB - 32KB - 64KB - 128KB - 256KB - 512KB - 1MB - 2MB - 4MB - 8MB - 16MB - 32MB - 64MB - 128MB fio支持的读写混合模式包括: - randwrite:随机写入数据 - randread:随机读取数据 - randrw:既有随机写入数据,又有随机读取数据 - readwrite:既有顺序写入数据,又有顺序读取数据 fio支持的IO引擎包括: - sync:同步IO引擎 - mmap:内存映射引擎 - libaio:异步IO引擎 - posixaio:异步IO引擎 - pvsync:相对比sync性能更好的同步IO引擎 fio支持的输出格式包括: - human:人类可读的格式,以KB/s、MB/s、IOPS等为单位 - normal:标准格式,包括各种统计信息,用于后续分析 - json:JSON格式,方便系统集成和自动化测试 总之,fio命令是一款非常强大的IO性能测试工具,可以帮助我们非常准确地测试各种存储设备的IO性能,并针对不同的应用场景进行优化。如果你是一位系统管理员或开发人员,一定要熟练掌握fio命令的使用,它会对你的工作带来很大的帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值