FIO详解

FIO详解fio FlexibleIOTe 安装 a 下载地址 http freshmeat sourceforge net projects fio b 安装两个插件 yuminstallli yuminstallzi c 编译安装 tar xvffio 2 1 10 tar gz cdfio 2 1 10 configure mak

fio – Flexible IO Tester

一、服务器配置:

二、fio

1.安装

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

2.fio执行脚本顺序

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 (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% 

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/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/206536.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午3:28
下一篇 2026年3月19日 下午3:29


相关推荐

  • 数据挖掘十大算法之决策树详解(1)[通俗易懂]

    数据挖掘十大算法之决策树详解(1)[通俗易懂]在2006年12月召开的IEEE数据挖掘国际会议上,与会的各位专家选出了当时的十大数据挖掘算法(top10dataminingalgorithms)。本博客已经介绍过的位列十大算法之中的5个。本文主要介绍机器学习中的决策树模型。决策树模型是一类算法的集合,在数据挖掘十大算法中,具体的决策树算法占有两席位置,即C4.5和CART算法

    2022年6月1日
    42
  • 介绍一种非常好用汇总数据的方式GROUPING SETS

    介绍一种非常好用汇总数据的方式GROUPING SETS

    2021年11月26日
    57
  • Python入门教程完整版(懂中文就能学会)

    今天本宝宝给大家带来了干货,Python入门教程完整版,完整版啊!完整版!言归正传,我来给大家介绍一下这套教程,希望每个小伙伴都沉迷学习,无法自拔!本套教程学习时间15天1-3天内容:为Linux基础命令4-13天内容:为Python基础教程14-15天内容:为飞机大战项目演练第一阶段(1-3天):该阶段首先通过介绍不同领域的三种操作系统,操作系统的发展简史以及…

    2022年4月5日
    51
  • JavaScript 合并数组对象中某个相同值(数组对象合并)

    JavaScript 合并数组对象中某个相同值(数组对象合并)将图片左侧数据处理成右侧数据 ps 顺带说下数据结构直接看代码这边封装成了一个函数根据自己需求调整相应的字段 functionrese arr letarrWarp 用于存放唯一 Id letresult 最终返回数组 for letitemofarr if arrWarp includes item classId false letobj

    2026年3月18日
    3
  • Java学习之SSM框架整合

    Java学习之SSM框架整合0x00前言前面的学习的Spring、SpringMVC和Mybatis框架基本已经学习完了,但是要使用起来,我们需要把这三大框架给整合起来一起使用。0x01

    2021年12月12日
    45
  • 恢复微信撤回的图片(不容root,极其简单)

    恢复微信撤回的图片(不容root,极其简单)女友最近用微信发的一些照片总是让我看一下就给撤回,作为程序员的我,当然不甘示弱,怎可以在我熟悉的领域胡作非为呢?于是上网搜了一下恢复微信撤销图片的方法,网上给出的方法各种各样,需要各种软件,还需要root,不仅晦涩难懂而且极其麻烦,一看都不适合给小白使用,作为程序员的我当然也不愿意这样,于是我就自己琢磨。首先,你要相信这样一个道理,你能看到的东西,一定会存在你手机的某个角落,如图片,声音,视频,

    2022年6月18日
    64

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号