[转帖]FIO – IO压力测试工具

fio,io,压力,测试工具 · 浏览次数 : 0

小编点评

I/O统计数据信息代表值含义主要包括: * **salt:**提交延迟,表示在提交I/O到完成的时间。 * **chat:**完成延迟,表示和上边的submit一样,不过这个是完成了多少个。 * **lat:** I/O完成延迟的分布。 * **bw:** 总带宽以及最小和最大带宽。 * **io:** 该组中所有线程执行的累计I/O。 * **run:** 这组线程中最小和最长的运行时。 * **ios:** 所有组的I/ o个数。 * **merge:** I/O调度器执行的总合并数。 * **ticks:** 使磁盘繁忙的滴答数(仅供参考,原文是Number of ticks we kept the disk busy)。 * **in_queue:** 在磁盘队列中花费的总时间。 * **util:** 磁盘利用率。

正文

https://blog.csdn.net/younger_china/article/details/71129541

        《存储工具系列文章》主要介绍存储相关的测试和调试工具,包括不限于ddfiovdbenchiozoneiometercosbench等性能负载工具,及strace等调试工具。


1. 概述

        IO是一个 I/O 工具,旨在用于基准测试和压力/硬件验证。它支持 19 种不同类型的I/O引擎(syncmmaplibaioposixaioSG v3splicenullnetworksysletguasisolarisaio 等)、I/O 优先级(适用于较新的Linux内核)、评估 I/O、分叉或线程作业等等。它可以在块设备和文件上工作。fio 接受简单易懂的文本格式的职位描述。包括几个示例作业文件。FIO显示各种 I/O 性能信息,包括完整的IO延迟和百分位数。Fio在许多地方被广泛使用,用于基准测试、QA 和验证目的。它支持 LinuxFreeBSDNetBSDOpenBSDOS XOpenSolarisAIXHP-UXAndroid Windows

        目前主流的第三方IO测试工具有fioiometer Orion,这三种工具各有千秋,在linux 下也可以使用dd 进行简单的磁盘(文件系统)测试(文末补充)。

        Fio在Linux系统下使用比较方便,iometerwindow系统下使用比较方便,OrionoracleIO测试软件,可在没有安装oracle数据库的情况下模拟oracle数据库场景的读写。

FIO 是一个多线程IO生成工具,可以生成多种IO模式,用来测试磁盘设备的性能(也包含文件系统:如针对网络文件系统 NFS IO测试)。

        FIO是一个开源的I/O压力测试工具,主要是用来测试磁盘/SSD的IO性能,也可测试cpu,nic的IO性能。它可以支持13种不同的I/O引擎,包括:sync,mmap, libaio, posixaio, SG v3, splice, network, syslet, guasi, solarisaio, I/Opriorities (针对新的Linux内核), rate I/O, forked or threaded jobs等。

        Github地址:https://github.com/axboe/fio

2. 安装部署

2.1 软件包安装

        第一步:查询fio所属软件包

  1. [root@node1 fio]# yum provide fio
  2. Loaded plugins: fastestmirror
  3. No such command: provide. Please use /usr/bin/yum --help
  4. [root@node1 fio]# yum provides fio
  5. Loaded plugins: fastestmirror
  6. Loading mirror speeds from cached hostfile
  7. * base: mirror.lzu.edu.cn
  8. * extras: ftp.sjtu.edu.cn
  9. * updates: ftp.sjtu.edu.cn
  10. fio-3.7-2.el7.x86_64 : Multithreaded IO generation tool
  11. Repo : base
  12. [root@node1 fio]# yum info fio
  13. Loaded plugins: fastestmirror
  14. Loading mirror speeds from cached hostfile
  15. * base: mirror.lzu.edu.cn
  16. * extras: ftp.sjtu.edu.cn
  17. * updates: ftp.sjtu.edu.cn
  18. Available Packages
  19. Name : fio
  20. Arch : x86_64
  21. Version : 3.7
  22. Release : 2.el7
  23. Size : 467 k
  24. Repo : base/7/x86_64
  25. Summary : Multithreaded IO generation tool
  26. URL : http://git.kernel.dk/?p=fio.git;a=summary
  27. License : GPLv2
  28. Description : fio is an I/O tool that will spawn a number of threads or processes doing
  29. : a particular type of io action as specified by the user. fio takes a
  30. : number of global parameters, each inherited by the thread unless
  31. : otherwise parameters given to them overriding that setting is given.
  32. : The typical use of fio is to write a job file matching the io load
  33. : one wants to simulate.
  34. [root@node1 fio]#

第二包:安装

[root@node1 fio]# yum install fio -y

2.2 源码包安装

第一步:根据实际情况安装依赖包 

[root@node1 fio]# yum -y install  libaio-devel  libaio-dev libaio* zilb*

第二部:下载源码:https://git.kernel.org/pub/scm/linux/kernel/git/axboe/fio.git/

[root@node1 fio]# wget http://git.kernel.org/pub/scm/linux/kernel/git/axboe/fio.git/snapshot/fio-3.30.tar.gz --no-check-certificate

解压源码

[root@node1 fio]# tar  -zxvf fio-3.30.tar.gz

第三步:编译安装

[root@node1 fio-3.30]# ./configure;

确保此处不报错,如果缺少依赖包,则根据情况安装。

[root@node1 fio-3.30]# make;make install;

第四步:检查是否安装成功 

  1. [root@node1 fio-3.30]# fio -v
  2. fio-3.29

3  配置参数介绍

        Fio提供了非常多的配置参数。

参数名称

释义

filename

待测试的文件或块设备。

若为文件,则代表测试文件系统的性能;例:-filename=/work/fstest/fio.img

若为块设备,则代表测试裸设备的性能; 例:-filename=/dev/sdb1

ioengine

IO引擎

fio支持多种引擎如:cpuio、mmap、sync、psync、vsync、pvsync、pvsync2、null、net、netsplice、ftruncate、filecreate、libaio、posixaio、falloc、e4defrag、splice、rados、rbd、mtd、sg、io_uring

direct

当前测试是否采用直接IO方式进行读写,如果采用直接IO,则取值-direct=1,否则取值-direct=0。

采用直接IO写测试,会使得测试结果更加真实。

rw

读写模式。

read:顺序读测试,使用方式-rw=read

write:顺序写测试,使用方式-rw=write

randread:随机读测试,使用方式-rw=randread

randwrite:随机写测试,使用方式-rw=randwrite

randrw:随机读写,-rw=randrw;默认比率为5:5,通过参数-rwmixread设定读的比率,如-rw=randrw-rwmixread=70,说明读写比率为70:30。或rwmixwrite

bs

单次IO的大小;例:-bs=4k

bssplit

设备读写访问的IO大小,例:-bssplit=4k/30:8k/40:16k/30,随机读4k文件占30%、8k占40%、16k占30%

bsrange

设置IO大小的范围,例如-bsrange=512-2048

size

本次测试文件的大小;例-size=1G

iodepth

IO队列深入,即一次下发的IO的个数,例如:-iodepth=16

numjobs

测试进程的并发数,默认为,例:-numjobs=16

sync

设置同步模式,同步-sync=1,异步-sync=0

fsync

设置数据同步模式,同步-fsync=1,异步-fsync=0

runtime

设置测试运行的时间,单位秒,例:-runtime=300

group_reporting

关于显示结果的,汇总每个进程的信息

lockmem

对测试所使用的内存进行限制,如-lockmem=1g,限制1G

关于ioengine,  采用的文件读写方式

  • sync:采用read,write,使用fseek定位读写位置。
  • psync:采用pread、pwrite进行文件读写操作
  • vsync:采用readv(2) orwritev(2)进行文件读写操作,
  • libaio:Linux异步读写IO(Linuxnative asynchronous I/O)

  • posixaio: glibc POSIX 异步IO读写,使用aio_read(3)and aio_write(3)实现IO读写。

注:

       read()和write()系统调用每次在文件和进程的地址空间之间传送一块连续的数据。但是,应用有时也需要将分散在内存多处地方的数据连续写到文件中,或者反之。在这种情况下,如果要从文件中读一片连续的数据至进程的不同区域,使用read()则要么一次将它们读至一个较大的缓冲区中,然后将它们分成若干部分复制到不同的区域,要么调用read()若干次分批将它们读至不同区域。同样,如果想将程序中不同区域的数据块连续地写至文件,也必须进行类似的处理。UNIX提供了另外两个函数—readv()和writev(),它们只需一次系统调用就可以实现在文件和进程的多个缓冲区之间传送数据,免除了多次系统调用或复制数据的开销。readv()称为散布读,即将文件中若干连续的数据块读入内存分散的缓冲区中。writev()称为聚集写,即收集内存中分散的若干缓冲区中的数据写至文件的连续区域中。

4. 测试案例

测试命令如下:

[root@node0 fio-3.30]#  fio -filename=/work/fstest/fio.img  -direct=1 -rw=randread -bs=8k -size=1G-numjobs=16 -runtime=60 -group_reporting -name=fio_test

磁盘读写常用测试点:

1. Read=100% Ramdon=100% rw=randread (100%随机读)

2. Read=100% Sequence=100% rw=read (100%顺序读)

3. Write=100% Sequence=100% rw=write (100%顺序写)

4. Write=100% Ramdon=100% rw=randwrite (100%随机写)

5. Read=70% Sequence=100% rw=rw, rwmixread=70, rwmixwrite=30  (70%顺序读,30%顺序写)

6. Read=70% Ramdon=100% rw=randrw, rwmixread=70, rwmixwrite=30 (70%随机读,30%随机写)

测试过程中

  1. fio_test: (g=0): rw=randread,bs=8K-8K/8K-8K/8K-8K, ioengine=psync, iodepth=1
  2. ...
  3. fio-3.30
  4. Starting 16 processes
  5. Jobs: 16 (f=16): [r(16)] [18.0% done][1840KB/0KB/0KB /s] [230/0/0 iops] [eta 00m:50s]

第一行:当前测试为随机读(randread),IO块大小,文件读写方式psync,IO队列深度为1,
第二行:fio的版本号
第三行:说明任务的并发数
第四行:任务并发数,进度,剩余测试时间。

5 . 测试结果解析

  1. [root@node0 fio-3.30]# fio -filename=/dev/sdb -direct=1 -ioengine=libaio -bs=4k -size=5G -numjobs=10 -iodepth=16 -runtime=60 -thread -rw=randrw -rwmixread=70 -group_reporting -name="local_randrw_test"
  2. local_randrw_test: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=16
  3. ...
  4. fio-3.10
  5. Starting 10 threads
  6. Jobs: 10 (f=10): [m(10)][100.0%][r=19.4MiB/s,w=8456KiB/s][r=4969,w=2114 IOPS][eta 00m:00s]
  7. local_randrw_test: (groupid=0, jobs=10): err= 0: pid=11189: Mon Oct 25 11:01:46 2021
  8.    read: IOPS=5230, BW=20.4MiB/s (21.4MB/s)(1226MiB/60031msec)
  9.     slat (usec): min=2, max=342637, avg=1266.82, stdev=7241.29
  10.     clat (usec): min=4, max=459544, avg=20056.81, stdev=24888.90
  11.      lat (usec): min=134, max=459586, avg=21329.16, stdev=25378.16
  12.     clat percentiles (usec):
  13.      |  1.00th=[  1467],  5.00th=[  1844], 10.00th=[  2147], 20.00th=[  2606],
  14.      | 30.00th=[  3032], 40.00th=[  3556], 50.00th=[  4359], 60.00th=[  6063],
  15.      | 70.00th=[ 36439], 80.00th=[ 46924], 90.00th=[ 51643], 95.00th=[ 59507],
  16.      | 99.00th=[105382], 99.50th=[117965], 99.90th=[137364], 99.95th=[152044],
  17.      | 99.99th=[219153]
  18.    bw (  KiB/s): min=  795, max= 4494, per=9.91%, avg=2072.23, stdev=744.04, samples=1195
  19.    iops        : min=  198, max= 1123, avg=517.74, stdev=186.00, samples=1195
  20.   write: IOPS=2243, BW=8972KiB/s (9188kB/s)(526MiB/60031msec)
  21.     slat (usec): min=2, max=311932, avg=1272.76, stdev=7272.09
  22.     clat (usec): min=6, max=458031, avg=20206.30, stdev=24897.71
  23.      lat (usec): min=974, max=459755, avg=21484.12, stdev=25400.41
  24.     clat percentiles (usec):
  25.      |  1.00th=[  1500],  5.00th=[  1860], 10.00th=[  2147], 20.00th=[  2606],
  26.      | 30.00th=[  3064], 40.00th=[  3621], 50.00th=[  4424], 60.00th=[  6194],
  27.      | 70.00th=[ 36439], 80.00th=[ 46924], 90.00th=[ 51643], 95.00th=[ 59507],
  28.      | 99.00th=[105382], 99.50th=[117965], 99.90th=[137364], 99.95th=[149947],
  29.      | 99.99th=[200279]
  30.    bw (  KiB/s): min=  357, max= 1944, per=9.90%, avg=888.57, stdev=325.49, samples=1195
  31.    iops        : min=   89, max=  486, avg=221.80, stdev=81.37, samples=1195
  32.   lat (usec)   : 10=0.01%, 50=0.01%, 100=0.01%, 250=0.02%, 500=0.01%
  33.   lat (usec)   : 750=0.01%, 1000=0.01%
  34.   lat (msec)   : 2=7.45%, 4=38.36%, 10=18.10%, 20=1.09%, 50=22.31%
  35.   lat (msec)   : 100=11.42%, 250=1.24%, 500=0.01%
  36.   cpu          : usr=0.26%, sys=19.41%, ctx=12026, majf=0, minf=18
  37.   IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=100.0%, 32=0.0%, >=64=0.0%
  38.      submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
  39.      complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.1%, 32=0.0%, 64=0.0%, >=64=0.0%
  40.      issued rwts: total=313975,134655,0,0 short=0,0,0,0 dropped=0,0,0,0
  41.      latency   : target=0, window=0, percentile=100.00%, depth=16
  42. Run status group 0 (all jobs):
  43.    READ: bw=20.4MiB/s (21.4MB/s), 20.4MiB/s-20.4MiB/s (21.4MB/s-21.4MB/s), io=1226MiB (1286MB), run=60031-60031msec
  44.   WRITE: bw=8972KiB/s (9188kB/s), 8972KiB/s-8972KiB/s (9188kB/s-9188kB/s), io=526MiB (552MB), run=60031-60031msec
  45. Disk stats (read/write):
  46.   sdb: ios=314008/134653, merge=0/0, ticks=189470/89778, in_queue=279286, util=99.75%

        下面是每个执行的数据方向的I/O统计数据信息的代表值含义

        read/write: 读/写的IO操作(还有一个trim没用过)


    salt: 提交延迟,这是提交I/O所花费的时间(min:最小值,max:最大值,avg:平均值,stdev:标准偏差)
    chat: 完成延迟,表示从提交到完成I/O部分的时间
    lat: 相应时间,表示从fio创建I/O单元到完成I/O操作的时间
    bw: 带宽统计
    iops: IOPS统计


lat(nsec/usec/msec): 

        I/O完成延迟的分布。这是从I/O离开fio到它完成的时间。与上面单独的读/写/修剪部分不同,这里和其余部分的数据适用于报告组的所有I/ o。10=0.01%意味着0.01%的I/O在250us以下完成。250=0.02%意味着0.02%的I/O需要10到250us才能完成。

cpu: cpu使用率

IO depths: I/O深度在作业生命周期中的分布

    IO submit: 在一个提交调用中提交了多少个I/O。每一个分录表示该数额及其以下,直到上一分录为止——例如,4=100%意味着我们每次提交0到4个I/O调用
    IO complete: 和上边的submit一样,不过这个是完成了多少个
    IO issued rwt: 发出的read/write/trim请求的数量,以及其中有多少请求被缩短或删除
    IO latency: 满足指定延迟目标所需的I/O深度

下面是Run status group 0 (all jobs) 全部任务汇总信息的代表值含义:

bw: 总带宽以及最小和最大带宽

io: 该组中所有线程执行的累计I/O

run: 这组线程中最小和最长的运行时。

最后是Linux中特有的磁盘状态统计信息的代表值含义:

ios: 所有组的I/ o个数

merge: I/O调度器执行的总合并数

ticks: 使磁盘繁忙的滴答数(仅供参考,原文是Number of ticks we kept the disk busy)

in_queue: 在磁盘队列中花费的总时间

util: 磁盘利用率。值为100%意味着我们保留了磁盘,如果一直很忙,那么50%的时间磁盘就会闲置一半的时间


6. 参考资料

[01]https://juejin.cn/post/7090839375033925646
 

</article>

与[转帖]FIO – IO压力测试工具相似的内容:

[转帖]FIO – IO压力测试工具

`https://blog.csdn.net/younger_china/article/details/71129541` 《存储工具系列文章》主要介绍存储相关的测试和调试工具,包括不限于dd、fio、vdbench、iozone、iometer、cosbench等性能负载工具,及strace等调

[转帖]perf学习-linux自带性能分析工具

存储技术为满足层出不穷应用的海量数据存储需求,从物理介质到技术架构也同样发生了天翻地覆的变革。无论技术如何更新换代,其目的都是为了更好的提供高性能,高容量,高可用的数据服务。本系列文章会对存储系统的测试和调试工具做一个介绍。 dd - Linux世界中的搬运工 FIO – IO压力测试工具 vdbe

【转帖】FIO磁盘性能测试工具

https://www.jianshu.com/p/70b8c7d5d217 FIO工具介绍 FIO 工具是一款用于测试硬件存储性能的辅助工具,兼具灵活性、可靠性从而从众多性能测试工具中脱颖而出。磁盘的 I/O 是衡量硬件性能的最重要的指标之一,而 FIO 工具通过模拟 I/O负载对存储介质进行压力

[转帖]vdbench - 性能压力测试工具

《存储工具系列文章》主要介绍存储相关的测试和调试工具,包括不限于dd、fio、vdbench、iozone、iometer、cosbench等性能负载工具,及strace等调试工具。 1. 概述 vdbench是一个I/O工作负载生成器,通常用于验证数据完整性和度量直接附加(或网络连接)存储性能。

[转帖]iometer - 性能压力测试工具

《存储工具系列文章》主要介绍存储相关的测试和调试工具,包括不限于dd、fio、vdbench、iozone、iometer、cosbench等性能负载工具,及strace等调试工具。 1 概述 Iometer 是一个免费的开源的测试磁盘性能的工具。和其他磁盘工具相比,可以测试 I/O 的传输率和平均

[转帖]FIO使用说明

FIO介绍: FIO是测试IOPS的非常好的工具,用来对磁盘进行压力测试和验证。磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写两大类。FIO是一个可以产生很多线程或进程并执行用户指定的特定类型I/O操作的工具,FIO的典型用途是编写和模拟的I/O负载匹配的作业文件。也就是

[转帖]文件系统读写性能fio测试方法及参数详解

简介 Fio 是一个 I/O 工具,用来对硬件进行压力测试和验证,磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写两大类。 Fio支持13种不同的I/O引擎,包括:sync, mmap, libaio, posixaio, SG v3, splice, null, netw

[转帖]关于iostat的问题,svctm数据不可信

使用FIO对磁盘进行压力测试,使用1个线程对磁盘进行随机读,设置单次read的数据块分别为128KB和1M,数据如下: (1)单次IO数据块为128KB (2)单次IO数据块为1M 从上面的数据可以看出,当单次IO的数据块变大,服务时间svctm反而变短,这明显不符合常规认知。 查阅到fio的相关资

[转帖]fio 命令入门到跑路

fio是一种I / O工具,用于基准测试和压力/硬件验证。它支持19种不同类型的I / O引擎(sync,mmap,libaio,posixaio,SG v3,splice,null,network,syslet,guasi,solarisaio等),I / O优先级(适用于较新的Linux内核)

[转帖]使用FIO工具对系统进行存储压力测试

https://www.modb.pro/db/495753 安装fio yum -y install fio.x86_64[root@localhost ~]# rpm -qa|grep fio #为了测试异步I/O , 需要安装libaio 。安装libaio-devel包可以直接使用如下命令[