当前位置: 首页 > 工具软件 > fio > 使用案例 >

FIO参数简单介绍

钱振
2023-12-01

在服务器测试中,经常会对storage进行性能方面的测试,包括M.2,NVME,HDD等等.业界一般用fio工具对盘进行读写试.fio是一个IO测试工具,可以运行在Linux、Windows等多种系统之上,可以用来测试本地磁盘、网络存储等的性能。在服务器测试中最为常见,一般厂商给的spec说明,基本上是基于在fio工具下跑出来的读写性能.
比如下面一段预处理的代码:
fio --name=Precondition --filename=/dev/nvme0n1 --ioengine=libaio --direct=1 --thread=1 --numjobs=1 --iodepth=128 --rw=randwrite --bs=4k --runtime=8h --time_based=1 --size=100% --norandommap=1 --randrepeat=0 --group_reporting

上面这段代码总共包含了以下几种参数:
–name=Precondition
–filename=/dev/nvme0n1
–ioengine=libaio
–direct=1
–thread=1
–numjobs=1
–iodepth=128
–rw=randwrite
–bs=4k
–runtime=8h
–time_based=1
–size=100%
–norandommap=1
–randrepeat=0
那我们在写测试盘的脚本中,就有必要了解一下FIO的参数设置。下面我们简单介绍下

 **--name=Precondition**

预处理设置.
评估一块NVMe SSD在真实业务场景中的吞吐能力、稳定性、可靠性以及QoS,不仅要考虑压测工具、测试环境选型,还要精心设计测试规范,如此才能准确的获取NVMe SSD在日常运营中的性能表现。预处理就是这样一个在测试中具有重要作用的环节,这篇文章将对NVMe SSD的预处理操作及价值作以说明。
在NVMe SSD使用初期,尤其是使用新盘的时候,空闲资源充足,垃圾回收等操作比较少,因此性能也会处于高位。但是运行时间一长,数据排布会更随机,垃圾回收、block 擦除等操作触发的频率将趋于稳定,整个SSD的性能也将处于长期稳定的状态。通常性能测试要考核的就是SSD日常的性能和稳定性等指标,所以需要先通过预处理让盘达到稳态。
–filename=/dev/nvme0n1
待测试的盘,比如/dev/sdb;/dev/nvmeon1等等.一般不会对系统盘进行fio读写,不然会导致OS盘系统丢失,需要重新安装OS.所以在写fio测试脚本的时候,一定注意不要把OS盘符加进去.
–ioengine=libaio
使用I/O引擎,就相当于与以某些特定方式来访问存储,不同的I/O引擎有不同的使用场景 。Linux可以使用 libaio,sync,psync等 .
–direct=1
如果设置为1,将不使用I/O缓存(通常是O_DIRECT).初始值为否.再向服务器中写入数据时,有时候会发现写入速度甚至会远大于理论带宽数值,这就是由于拷贝调用了缓存,设置direct=1则可以不使用缓存,否则可能会测出来很夸张的性能数据。
–thread=1
使用pthread_create创建线程代替使用fork创建进程,fio默认会使用fork()创建job,如果这个选项设置的话,fio将使用pthread_create来创建线程使用 threads 在一定程度上可以节省系统开销.
–numjobs=1
即本次执行的线程数,可以根据自己的主机性能指定执行测试任务的job的数量,可以得到更加接近“满载”状态下的性能指标.
–iodepth=128
简单的理解就是一次提交要提交多少个I/O请求,不过这个只对异步I/O引擎有用,因为同步I/O总是会等待提交的I/O请求返回了再提交下一个I/O请求,所以iodepth总是1.
应用使用IO通常有二种方式:同步和异步。 同步的IO一次只能发出一个IO请求,等待内核完成才返回,这样对于单个线程iodepth总是小于1,但是可以透过多个线程并发执行来解决,通常我们会用16-32根线程同时工作把iodepth塞满。 异步的话就是用类似libaio这样的linux native aio一次提交一批,然后等待一批的完成,减少交互的次数,会更有效率。
–rw=randwrite
一般测试storage有6种类型数据:
顺序读: --rw=read
顺序写:–rw=write
随机读:–rw=randread
随机写:–rw=randwrite
顺序混合读写:–rw=readwrite
随机混合读写:–rw=randrw
–bs=4k
Block Size,产生的IO单元的大小,一般进行fio读写的时候会选择4k,8k,16k,…1024k。这样的单元 就是IO的Block Size。
–runtime=8h
本次执行fio的时间,–runtime=8h,即8个小时的读写测试.
–time_based=1
如果设置的即使job已被完全读写或写完,也会执行完runtime规定的时间。它是通过循环执行相同的负载来实现的。加上这个参数可以防止job提前结束。
–size=100%
设定100%,fio将会使用整个磁盘空间.如果size=20%,fio将会使用整个磁盘的20%用来设置本次测试所测的文件大小.也可以具体设置大小,比如size=4G/100G .
–norandommap=1
一般情况下,fio在做随机IO时,将会覆盖文件的每一个block.设置–norandommap=1的话,fio将只是获取一个新的随机offset,而不会查询过去的历史。这意味着一些块可能没有读或写,一些块可能要读/写很多次。
–randrepeat=0
对于随机IO负载,配置生成器的种子,使得路径是可以预估的,使得每次重复执行生成的序列是一样的。
如果无–randrepeat=0这个参数不会影响seqread,但会影响seqwrite,randwrite,randread.
group_reporting
按照组展示结果, 而不是每个 job, 这样在设置里可 numjobs > 1 的时候很有用, 没有此参数每个 numjobs 都会单独输出结果. 使用此参数后同一任务的多个线程/进程 会汇总输出结果

 类似资料: