磁盘I/O测试工具-FIO

[复制链接]
发表于 2026-1-10 15:39:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、简介

FIO (Flexible I/O Tester)是一款功能强盛的I/O性能测试工具,用来对硬件举行压力测试和验证。通过机动的设置和丰富的下令参数,可以模仿各种复杂的I/O负载场景,资助用户全面相识存储装备的性能体现。磁盘IO是查抄磁盘性能的紧张指标,可以按照负载情况分成照序次读写,随机读写两大类。
FIO Github:https://github.com/axboe/fio
FIO 文档:https://fio.readthedocs.io/en/latest/fio_doc.html
GFIO 是 FIO 的图形监测工具,它提供了图形界面的参数设置,和性能监测图像。可自行相识:https://blog.yufeng.info/archives/tag/fio
二、安装

  1. yum -y install fio
  2. ​
  3. # 如需使用 libaio 引擎,需安装
  4. yum -y install libaio-devel
复制代码
三、常用参数

FIO 的参数非常丰富,可以根据测试需求举行机动设置。以下是一些具体的参数阐明,并已按照参数用途举行了分类:
1.测试使命相干参数



  • –name=测试名称:为测试指定一个名称,方便区分差别的测试。比方:–name=mytest。假如fio --name=job1 --name=job2,创建了两个使命,共享–name=job1之前的参数。–name=job1之后的就是job2使命独有的参数
  • –description=字符串:提供测试项目的形貌信息。
  • –filename=测试文件路径:指定测试使用文件的相对路径大概绝对路径,没有的话会自行创建,可以是文件或裸装备。比方:–filename=/path/to/testfile
  • –size=测试文件巨细:指定测试文件的巨细,支持K、M、G等单元。比方:–size=1G
  • –numjobs=并发使命数:指定并发实行的使命数。比方:-–numjobs=4。每个使命都作为一个独立的线程大概历程产生(实行类似工作的历程大概线程)。每个Job(使命)开1个线程,有多少 --name 就开多少个线程。以是终极线程数 = 使命数 (–name 的数量) * --numjobs
  • –ioengine=IO引擎:指定所使用的IO引擎,如libaio、sync等。比方:–ioengine=libaio
  • –iodepth=io队列深度:指定IO队列的深度,默以为1。在肯定范围内越大越好,增长队列深度可以看到IOPS不会随着队列深度的增长而不绝增长,到达肯定值后会有所降落。增长队列深度,可以测试出磁盘的峰值
  • –runtime=测试时间:指定测试的时间长度,单元可以是秒、分钟、小时。当省略单元时间,该数值以秒为单元举行表明。比方:–runtime=60s
  • –ramp_time=预热时间:指定测试前的预热时间。设定在纪录任何性能信息之前要运行特定负载的时间。这个用来等性能稳固后,再纪录日志日志效果,因此可以镌汰天生稳固的效果须要的运行时间。比方:–ramp_time=5s
  • –time_based:参数用于控制FIO的测试模式。当设置time_based时,FIO将确保测试运行指定的时间长度,纵然文件已经被完全读写或写入完成。假设你设置了runtime=60s(即测试运行60秒)而且指定了time_based,FIO将确保测试至少运行60秒,纵然在这段时间内文件已经被完全读写。在某些情况下,纵然设置了time_based,FIO也大概在到达runtime之前克制,比方当碰到错误或到达其他限定条件时
  • –lockmem=内存巨细:指定运行时使用的内存巨细,比方 --lockmem=1g 体现只使用1g内存举行测试
2.读写相干参数

2.1 通例读写参数



  • –rw=读写模式:

    • read:序次读
    • write:序次写
    • randread:随机读
    • randwrite:随机写
    • randrw:随机混淆读写(默认50%读和50%写)
    • trim、randtrim:仅支持Linux块装备,用于 Linux 块装备的特殊 I/O 模式

  • –bs=块巨细:指定测试的块巨细,如–bs=4K
  • –bsrange=块巨细范围:指定测试的块巨细范围,如–bsrange=512-2048
  • –bssplit=字符串:指定混淆块巨细的比例,如 bssplit=4k/10:64k/50:32k/40 体现4K占10%,64K占50%,32K占40%
  • –direct=1或0:1体现使用直接IO,绕过文件体系缓存;0体现倒霉用直接IO
  • –rwmixwrite=数字:在混淆读写模式下,指定写的百分比,如 --rwmixwrite=20 体现写占20%
2.2 随机读写相干参数

这些参数影响随机读写的活动,如randrepeat、randseed、offset等,它们决定了随机IO的天生方式和位置


  • randrepeat=True或False:控制随机I/O使用是否可重复,通过固定randseed值实现
    当randrepeat设置为True(或未指定,由于默认值为True)时,使用类似的randseed值(默以为137)将会产生类似的随机I/O位置序列。这意味着在多次运行具有类似randseed值的测试时,I/O使用的位置将是类似的,从而实现了可重复的随机测试。
    假如randseed被设置为一个自界说的值,那么randrepeat将主动变为False,由于每次使用差别的randseed值都会天生差别的随机I/O位置序列。
  • randseed=数字:设置随机数天生器的种子值,用于控制随机I/O使用的位置
    随机数天生器使用种子值作为出发点来天生随机数序列。在FIO中,randseed用于控制随机I/O使用的位置。
    通过设置特定的randseed值,可以确保在多次运行测试时产生类似的随机I/O位置序列,从而实现可重复的随机测试。
    假如不指定randseed值,FIO将使用默认值(通常为137)作为种子值。
  • offset=整数数字:指定I/O使用在文件或装备上的起始偏移量,用于控制I/O使用的起始位置
    offset是一个整数参数,可以以字节或块为单元指定。它界说了I/O使用在文件或装备上的起始位置。
    通过设置offset参数,可以控制I/O使用从文件的特定位置开始,而不是从文件的开头开始。这对于测试文件的差别部门或模仿特定的I/O模式(如序次读/写、随机读/写等)非常有用。
3.其他参数



  • –debug:开启调试模式,输出调试信息
  • –version:表现FIO的版本信息
  • –output=文件名:将测试效果输出到指定文件
  • –group_reporting:汇总每个历程的信息
四、常见测试场景

1.下令行测试

100%随机,100%读,4K
  1. fio -filename=/dev/emcpowerb -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=rand_100read_4k
复制代码
100%随机,100%写,4K
  1. fio -filename=/dev/emcpowerb -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=rand_100write_4k
复制代码
100%序次,100%读,4K
  1. fio -filename=/dev/emcpowerb -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=sqe_100read_4k
复制代码
100%序次,100%写,4K
  1. fio -filename=/dev/emcpowerb -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=sqe_100write_4k
复制代码
100%随机,70%读,30%写 4K
  1. fio -filename=/dev/emcpowerb -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=4k -size=1000G -numjobs=50 -runtime=180 -group_reporting -name=randrw_70read_4k
复制代码
2.参数文件测试

FIO提供了差别场景的压测参数文件,修改此中设置然后直接实行即可
  1. fio examples/ssd-test.fio
复制代码
上面这个参数文件用于测试ssd性能,参数文件内容如下:
此中每一个[]代表一个测试分组(global除外,global中为通用设置),会为每组分别举行测试,此中stonewall指示fio在全部指定的I/O作业(job)都完成其I/O使用之前,不会退出测试步伐。这有助于确保测试效果的完备性和正确性,特殊是在须要模仿复杂I/O负载场景时。
  1. # Do some important numbers on SSD drives, to gauge what kind of
  2. # performance you might get out of them.
  3. #
  4. # Sequential read and write speeds are tested, these are expected to be
  5. # high. Random reads should also be fast, random writes are where crap
  6. # drives are usually separated from the good drives.
  7. #
  8. # This uses a queue depth of 4. New SATA SSD's will support up to 32
  9. # in flight commands, so it may also be interesting to increase the queue
  10. # depth and compare. Note that most real-life usage will not see that
  11. # large of a queue depth, so 4 is more representative of normal use.
  12. #
  13. [global]
  14. bs=4k
  15. ioengine=libaio
  16. iodepth=4
  17. size=10g
  18. direct=1
  19. runtime=60
  20. directory=/mount-point-of-ssd
  21. filename=ssd.test.file
  22. [seq-read]
  23. rw=read
  24. stonewall
  25. [rand-read]
  26. rw=randread
  27. stonewall
  28. [seq-write]
  29. rw=write
  30. stonewall
  31. [rand-write]
  32. rw=randwrite
  33. stonewall
复制代码
五、测试效果解读

  1. fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=read -filename=/dev/sda -name="BS 4KB read test" -iodepth=16 -runtime=60
  2. #输出
  3. BS 4KB read test: (g=0): rw=write, bs=1M-1M/1M-1M/1M-1M, ioengine=libaio, iodepth=16
  4. fio-2.8
  5. Starting 1 process
  6. Jobs: 1 (f=1): [W(1)] [100.0% done] [0KB/68198KB/0KB /s] [0/66/0 iops] [eta 00m:00s]
  7. test: (groupid=0, jobs=1): err= 0: pid=4676: Thu Apr  7 17:22:37 2016
  8.   write: io=20075MB, bw=68464KB/s, iops=66, runt=300255msec           #执行多少IO,平均带宽,线程运行时间
  9.     slat (usec): min=51, max=5732, avg=291.11, stdev=262.47           #提交延迟
  10.     clat (usec): min=1, max=2235.8K, avg=239043.28, stdev=153384.41   #完成延迟
  11.      lat (usec): min=367, max=2235.9K, avg=239337.72, stdev=153389.57 #响应时间
  12.     clat percentiles (usec):
  13.      |  1.00th=[  221],  5.00th=[  442], 10.00th=[ 1004], 20.00th=[108032],
  14.      | 30.00th=[228352], 40.00th=[248832], 50.00th=[257024], 60.00th=[268288],
  15.      | 70.00th=[280576], 80.00th=[301056], 90.00th=[342016], 95.00th=[477184],
  16.      | 99.00th=[806912], 99.50th=[864256], 99.90th=[1122304], 99.95th=[1171456],
  17.        | 99.99th=[1646592]
  18.     bw (KB/s): min=  170, max=204800, per=100.00%, avg=68755.07, stdev=27034.84
  19.     lat (usec) : 2=0.01%, 4=0.13%, 50=0.06%, 100=0.26%, 250=1.04%
  20.     lat (usec) : 500=4.53%, 750=2.61%, 1000=1.33%
  21.     lat (msec) : 2=1.18%, 4=0.15%, 10=0.77%, 20=0.77%, 50=1.50%
  22.     lat (msec) : 100=4.43%, 250=23.48%, 500=53.23%, 750=3.09%, 1000=1.30%
  23.     lat (msec) : 2000=0.19%, >=2000=0.01%
  24.   cpu          : usr=0.03%, sys=2.11%, ctx=19066, majf=0, minf=7
  25.   IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=103.8%, 32=0.0%, >=64=0.0%   #io队列
  26.      submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%  #单个IO提交的IO数
  27.      complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.1%, 32=0.0%, 64=0.0%, >=64=0.0%  
  28.      issued    : total=r=0/w=20060/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0
  29.      latency   : target=0, window=0, percentile=100.00%, depth=16    #IO完延迟的分布
  30. Run status group 0 (all jobs):
  31.   WRITE: io=20075MB, aggrb=68464KB/s(group总带宽), minb=68464KB/s(最小平均带宽), maxb=68464KB/s(最大平均带宽), mint=300255msec(group中线程的最短运行时间), maxt=300255msec(group中线程的最长运行时间)
  32. Disk stats (read/write):
  33.   sda: ios=23/41769(所有group总共执行的IO数), merge=0/149(总共发生的IO合并数), ticks=706/9102766(磁盘繁忙的节拍数), in_queue=9105836(花费在队列上的总共时间), util=100.00%(磁盘利用率)
复制代码
输出参数先容(详情参考 Fio Output Explained)


  • io=实行了多少M的IO
  • bw=匀称IO带宽(吞吐量)
  • iops=IOPS,即每秒磁盘 I/O 读写次数
  • runt=线程运行时间
  • slat=提交耽误,提交该IO哀求到kernel所花的时间(不包罗kernel处理惩罚的时间)
  • clat=完成耽误, 提交该IO哀求到kernel后,处理惩罚所花的时间
  • lat=相应时间
  • bw=带宽
  • cpu=使用率
  • IO depths=io队列
  • IO submit=单个IO提交要提交的IO数
  • IO complete=完成的IO数
  • IO issued=提交的IO总数、较短的IO数、抛弃的IO数
  • IO latencies=IO完耽误的分布
  • io=统共实行了多少size的IO
  • aggrb=group总带宽
  • minb=最小匀称带宽
  • maxb=最大匀称带宽
  • mint=group中线程的最短运行时间
  • maxt=group中线程的最长运行时间
  • ios=全部group统共实行的IO数
  • merge=统共发生的IO归并数
  • ticks=磁盘繁忙的节奏数
  • io_queue=耗费在队列上的统共时间
  • util=磁盘使用率
六、归纳



  • FIO提供了丰富的参数来设置测试方案,可以根据具体需求选择得当的参数组合。
  • 通过指定差别的读写模式、块巨细、并发使命数等参数,可以模仿差别的磁盘负载场景,以评估磁盘的性能。
  • 在举行磁盘性能测试时,发起联合实际需求选择符合的参数举行测试,以得到正确的效果。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表