FIO介绍:

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

另外还有GFIO则是FIO的图形监测工具,它提供了图形界面的参数配置,和性能监测图像。

fio在github上的坐标:https://github.com/axboe/fio 。

FIO安装说明:

1.可以到网站:http://freshmeat.sourceforge.net/projects/fio获取FIO安装包:fio-2.1.10.tar.gz

2.为了使用异步IO引擎,需要在安装FIO前先安装libaio-dev(apt-get install libaio-dev),顺序不能反,否则会出现以下错误:

 fio: engine libaio not loadable
fio: failed to load engine

如果顺序反了可以使用 make clean清理编译文件后重新安装FIO 

3.如需要安装gfio:gfio是基于gdk实现,因此需要首先安装gdk:apt-get install libgtk2.0-dev

4.安装FIO:解压FIO压缩包,进入FIO目录

  • ./configure  --enable-gfio (注:如果希望不支持gfio,只需去掉后面的--enable-gfio参数)

  • make

  • make install

5.经过这几步,Fio的安装已经全部完成,为了测试是否安装成功,这里使用examples中的例子进行测试:

fio  examples/ssd-test.fio 

修正示例测试文件出现的错误:目录设置问题


  1. fio: /mount-point-of-ssd is not a directory
  2. fio: failed parsing directory=/mount-point-of-ssd
  3. fio: job global dropped

修改后,如果成功执行,说明FIO安装成功。

FIO 工具常用参数:


  1. 参数说明:
  2. filename=/dev/sdb1 测试文件名称,通常选择需要测试的盘的data目录。
  3. direct=1 是否使用directIO,测试过程绕过OS自带的buffer,使测试磁盘的结果更真实。Linux读写的时候,内核维护了缓存,数据先写到缓存,后面再后台写到SSD。读的时候也优先读缓存里的数据。这样速度可以加快,但是一旦掉电缓存里的数据就没了。所以有一种模式叫做DirectIO,跳过缓存,直接读写SSD。
  4. rw=randwrite 测试随机写的I/O
  5. rw=randrw 测试随机写和读的I/O
  6. bs=16k 单次io的块文件大小为16k
  7. bsrange=512-2048 同上,提定数据块的大小范围
  8. size=5G 每个线程读写的数据量是5GB。
  9. numjobs=1 每个job(任务)开1个线程,这里用了几,后面每个用-name指定的任务就开几个线程测试。所以最终线程数=任务数(几个name=jobx)* numjobs。
  10. name=job1: 一个任务的名字,重复了也没关系。如果fio -name=job1 -name=job2,建立了两个任务,共享-name=job1之前的参数。-name之后的就是job2任务独有的参数。
  11. thread 使用pthread_create创建线程,另一种是fork创建进程。进程的开销比线程要大,一般都采用thread测试。
  12. runtime=1000 测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止。
  13. ioengine=libaio 指定io引擎使用libaio方式。libaio:Linux本地异步I/O。请注意,Linux可能只支持具有非缓冲I/O的排队行为(设置为“direct=1”或“buffered=0”);rbd:通过librbd直接访问CEPH Rados
  14. iodepth=16 队列的深度为16.在异步模式下,CPU不能一直无限的发命令到SSD。比如SSD执行读写如果发生了卡顿,那有可能系统会一直不停的发命令,几千个,甚至几万个,这样一方面SSD扛不住,另一方面这么多命令会很占内存,系统也要挂掉了。这样,就带来一个参数叫做队列深度。
  15. Block Devices(RBD) 无需使用内核RBD驱动程序(rbd.ko)。该参数包含很多ioengine,如:libhdfs/rdma等
  16. rwmixwrite=30 在混合读写的模式下,写占30%
  17. group_reporting 关于显示结果的,汇总每个进程的信息。
  18. 此外
  19. lockmem=1g 只使用1g内存进行测试。
  20. zero_buffers 用0初始化系统buffer。
  21. nrfiles=8 每个进程生成文件的数量。
  22. 磁盘读写常用测试点:
  23. 1. Read=100% Ramdon=100% rw=randread (100%随机读)
  24. 2. Read=100% Sequence=100% rw=read (100%顺序读)
  25. 3. Write=100% Sequence=100% rw=write (100%顺序写)
  26. 4. Write=100% Ramdon=100% rw=randwrite (100%随机写)
  27. 5. Read=70% Sequence=100% rw=rw, rwmixread=70, rwmixwrite=30
  28. (70%顺序读,30%顺序写)
  29. 6. Read=70% Ramdon=100% rw=randrw, rwmixread=70, rwmixwrite=30
  30. (70%随机读,30%随机写)

FIO命令实例:


  1. 100%随机,100%读, 4K
  2. 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
  3. 100%随机,100%写, 4K
  4. 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
  5. 100%顺序,100%读 ,4K
  6. 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
  7. 100%顺序,100%写 ,4K
  8. 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
  9. 100%随机,70%读,30%写 4K
  10. 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

FIO测试实例:


  1. [root@docker sda]# fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=read -filename=/dev/sda -name="BS 4KB read test" -iodepth=16 -runtime=60
  2. BS 4KB read test: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=16
  3. fio-3.7
  4. Starting 1 thread
  5. Jobs: 1 (f=1): [R(1)][100.0%][r=89.3MiB/s,w=0KiB/s][r=22.9k,w=0 IOPS][eta 00m:00s]
  6. BS 4KB read test: (groupid=0, jobs=1): err= 0: pid=18557: Thu Apr 11 13:08:11 2019
  7. read: IOPS=22.7k, BW=88.5MiB/s (92.8MB/s)(5313MiB/60001msec)
  8. slat (nsec): min=901, max=168330, avg=6932.34, stdev=1348.82
  9. clat (usec): min=90, max=63760, avg=698.08, stdev=240.83
  10. lat (usec): min=97, max=63762, avg=705.17, stdev=240.81
  11. clat percentiles (usec):
  12. | 1.00th=[ 619], 5.00th=[ 627], 10.00th=[ 627], 20.00th=[ 635],
  13. | 30.00th=[ 635], 40.00th=[ 685], 50.00th=[ 717], 60.00th=[ 725],
  14. | 70.00th=[ 725], 80.00th=[ 725], 90.00th=[ 734], 95.00th=[ 816],
  15. | 99.00th=[ 1004], 99.50th=[ 1020], 99.90th=[ 1057], 99.95th=[ 1057],
  16. | 99.99th=[ 1860]
  17. bw ( KiB/s): min=62144, max=91552, per=100.00%, avg=90669.02, stdev=3533.77, samples=120
  18. iops : min=15536, max=22888, avg=22667.27, stdev=883.44, samples=120
  19. lat (usec) : 100=0.01%, 250=0.01%, 500=0.01%, 750=93.85%, 1000=5.14%
  20. lat (msec) : 2=0.99%, 4=0.01%, 10=0.01%, 50=0.01%, 100=0.01%
  21. cpu : usr=5.35%, sys=23.17%, ctx=1359692, majf=0, minf=17
  22. IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=100.0%, 32=0.0%, >=64=0.0%
  23. submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
  24. complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.1%, 32=0.0%, 64=0.0%, >=64=0.0%
  25. issued rwts: total=1360097,0,0,0 short=0,0,0,0 dropped=0,0,0,0
  26. latency : target=0, window=0, percentile=100.00%, depth=16
  27. Run status group 0 (all jobs):
  28. READ: bw=88.5MiB/s (92.8MB/s), 88.5MiB/s-88.5MiB/s (92.8MB/s-92.8MB/s), io=5313MiB (5571MB), run=60001-60001msec
  29. Disk stats (read/write):
  30. sda: ios=1357472/0, merge=70/0, ticks=949141/0, in_queue=948776, util=99.88%

FIO结果解读:


  1. 结果解读:
  2. test: (g=0): rw=write, bs=1M-1M/1M-1M/1M-1M, ioengine=libaio, iodepth=16
  3. fio-2.8
  4. Starting 1 process
  5. Jobs: 1 (f=1): [W(1)] [100.0% done] [0KB/68198KB/0KB /s] [0/66/0 iops] [eta 00m:00s]
  6. test: (groupid=0, jobs=1): err= 0: pid=4676: Thu Apr 7 17:22:37 2016
  7. write: io=20075MB, bw=68464KB/s, iops=66, runt=300255msec #执行多少IO,平均带宽,线程运行时间
  8. slat (usec): min=51, max=5732, avg=291.11, stdev=262.47 #提交延迟
  9. clat (usec): min=1, max=2235.8K, avg=239043.28, stdev=153384.41 #完成延迟
  10. lat (usec): min=367, max=2235.9K, avg=239337.72, stdev=153389.57 #响应时间
  11. clat percentiles (usec):
  12. | 1.00th=[ 221], 5.00th=[ 442], 10.00th=[ 1004], 20.00th=[108032],
  13. | 30.00th=[228352], 40.00th=[248832], 50.00th=[257024], 60.00th=[268288],
  14. | 70.00th=[280576], 80.00th=[301056], 90.00th=[342016], 95.00th=[477184],
  15. | 99.00th=[806912], 99.50th=[864256], 99.90th=[1122304], 99.95th=[1171456],
  16. | 99.99th=[1646592]
  17. bw (KB /s): min= 170, max=204800, per=100.00%, avg=68755.07, stdev=27034.84
  18. lat (usec) : 2=0.01%, 4=0.13%, 50=0.06%, 100=0.26%, 250=1.04%
  19. lat (usec) : 500=4.53%, 750=2.61%, 1000=1.33%
  20. lat (msec) : 2=1.18%, 4=0.15%, 10=0.77%, 20=0.77%, 50=1.50%
  21. lat (msec) : 100=4.43%, 250=23.48%, 500=53.23%, 750=3.09%, 1000=1.30%
  22. lat (msec) : 2000=0.19%, >=2000=0.01%
  23. cpu : usr=0.03%, sys=2.11%, ctx=19066, majf=0, minf=7
  24. IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=103.8%, 32=0.0%, >=64=0.0% #io队列
  25. submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% #单个IO提交要提交的IO数
  26. complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.1%, 32=0.0%, 64=0.0%, >=64=0.0%
  27. issued : total=r=0/w=20060/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0
  28. latency : target=0, window=0, percentile=100.00%, depth=16 #IO完延迟的分布
  29. Run status group 0 (all jobs):
  30. WRITE: io=20075MB, aggrb=68464KB/s(group总带宽), minb=68464KB/s(最小平均带宽), maxb=68464KB/s(最大平均带宽), mint=300255msec(group中线程的最短运行时间), maxt=300255msec(group中线程的最长运行时间)
  31. Disk stats (read/write):
  32. sda: ios=23/41769(所有group总共执行的IO数), merge=0/149(总共发生的IO合并数), ticks=706/9102766(Number of ticks we kept the disk busy), in_queue=9105836(花费在队列上的总共时间), util=100.00%(磁盘利用率)
  33. io=执行了多少M的IO
  34. bw=平均IO带宽
  35. iops=IOPS
  36. runt=线程运行时间
  37. slat=提交延迟,提交该IO请求到kernel所花的时间(不包括kernel处理的时间)
  38. clat=完成延迟, 提交该IO请求到kernel后,处理所花的时间
  39. lat=响应时间
  40. bw=带宽
  41. cpu=利用率
  42. IO depths=io队列
  43. IO submit=单个IO提交要提交的IO数
  44. IO complete=Like the above submit number, but for completions instead.
  45. IO issued=The number of read/write requests issued, and how many of them were short.
  46. IO latencies=IO完延迟的分布
  47. io=总共执行了多少size的IO
  48. aggrb=group总带宽
  49. minb=最小.平均带宽.
  50. maxb=最大平均带宽.
  51. mint=group中线程的最短运行时间.
  52. maxt=group中线程的最长运行时间.
  53. ios=所有group总共执行的IO数.
  54. merge=总共发生的IO合并数.
  55. ticks=Number of ticks we kept the disk busy.
  56. io_queue=花费在队列上的总共时间.
  57. util=磁盘利用率

IO状态监控工具Iostat介绍

iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。

进行磁盘测试的时候,我们可以使用iostat 等监控工具,查看所有磁盘当前的读写状态

监控磁盘IO命令:iostat –mx 1

语法:

iostat [ -c ] [ -d ] [ -h ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ] [ device [...] | ALL ] [ -p [ device [,...] | ALL ] ] [ interval [ count ] ]

iostat使用范例:


  1. iostat -d -x -k 1 10
  2. Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
  3. sda 1.56 28.31 7.80 31.49 42.51 2.92 21.26 1.46 1.16 0.03 0.79 2.62 10.28
  4. Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
  5. sda 2.00 20.00 381.00 7.00 12320.00 216.00 6160.00 108.00 32.31 1.75 4.50 2.17 84.20

-d: 显示该设备的状态的参数;

-x:是一个比较常用的选项,该选项将用于显示和io相关的扩展数据。

-k:  静态显示每秒的统计(单位kilobytes )

1: 第一个数字表示每隔1秒刷新一次数据显示。

10:第二个数字表示总共的刷新次数

输出信息的含义:


  1. rrqm/s: 每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);
  2. wrqm/s: 每秒这个设备相关的写入请求有多少被Merge了。
  3. r/s: 该设备的每秒完成的读请求数(merge合并之后的)
  4. w/s:   该设备的每秒完成的写请求数(merge合并之后的)
  5. rsec/s: 每秒读取的扇区数;
  6. wsec/: 每秒写入的扇区数。
  7. rKB/s: 每秒发送给该设备的总读请求数
  8. wKB/s: 每秒发送给该设备的总写请求数
  9. avgrq-sz 平均请求扇区的大小
  10. avgqu-sz 是平均请求队列的长度。毫无疑问,队列长度越短越好。
  11. await: 每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
  12. svctm: 表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢。
  13. %util: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。

本文转自:https://blog.csdn.net/don_chiang709/article/details/92628623

</article>

[转帖]FIO使用说明的更多相关文章

  1. [转帖] tmux 的使用说明

    之前曾经看过 tmux 的简介 但是一直不会用 这次 看了下 原来是这么处理 不过 用windows 多了 还是感觉鼠标 操作多一些 全键盘操作的习惯 还是没有养成. 原贴地址: https://ww ...

  2. linux 磁盘IO测试工具:FIO (同时简要介绍dd工具测试)

    FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证.磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写两大类. 目前主流的第三方IO测试工具有fio.iomete ...

  3. fio 测试磁盘性能

    在磁盘测试中最关心的几个指标分别为: iops(每秒执行的IO次数).bw(带宽,每秒的吞吐量).lat(每次IO操作的延迟). 当每次IO操作的block较小时,如512bytes/4k/8k等,测 ...

  4. Delphi中SendMessage使用说明(所有消息说明) good

    Delphi中SendMessage使用说明 SendMessage基础知识 函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.而函数Po ...

  5. MySQL 常用工具sysbench/fio/tpcc等测试

    为什么要压力测试采购新设备,评估新设备性能开发新项目,评估数据库容量新系统上线前,预估/模拟数据库负载更换数据库版本,评估性能变化 关注指标  CPU %wait,%user,%sys 内存 只内存读 ...

  6. Atitit.项目修改补丁打包工具 使用说明

    Atitit.项目修改补丁打包工具 使用说明 1.1. 打包工具已经在群里面.打包工具.bat1 1.2. 使用方法:放在项目主目录下,执行即可1 1.3. 打包工具的原理以及要打包的项目列表1 1. ...

  7. awk使用说明

    原文地址:http://www.cnblogs.com/verrion/p/awk_usage.html Awk使用说明 运维必须掌握的三剑客工具:grep(文件内容过滤器),sed(数据流处理器), ...

  8. Linux Shell 重定向与管道【转帖】

    by 程默 在了解重定向之前,我们先来看看linux 的文件描述符. linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以 ...

  9. “我爱背单词”beta版发布与使用说明

    我爱背单词BETA版本发布 第二轮迭代终于画上圆满句号,我们的“我爱背单词”beta版本已经发布. Beta版本说明 项目名称 我爱背单词 版本 Beta版 团队名称 北京航空航天大学计算机学院  拒 ...

  10. Oracle 中 union 和union all 的简单使用说明

    1.刚刚工作不久,经常接触oracle,但是对oracle很多东西都不是很熟.今天我们来了解一下union和union all的简单使用说明.Union(union all): 指令的目的是将两个 S ...

随机推荐

  1. python 处理pdf加密文件

    近期有同事需要提取加密的pdf文件,截取其中的信息,并且重构pdf文件.网上没有搜到相关的pdf操作,于是咨询了chatgpt,给出了pypdf2的使用案例.但是时间比较久远了,很多库内的调用接口都已 ...

  2. UE5: 探究Actor Tick的注册与执行

    1. 前情提要 因工作需要,有在编辑器模式下执行Actor的Tick函数的需求.经过查阅资料,了解到重载Actor::ShouldTickIfViewportOnly函数可以实现在编辑器视口下也可以执 ...

  3. 容器中域名解析流程以及不同dnsPolicy对域名解析影响

    本文分享自华为云社区<容器中域名解析流程以及不同dnsPolicy对域名解析影响>,作者:可以交个朋友 . 一.coreDNS背景 部署在kubernetes集群中的容器业务通过coreD ...

  4. 实战案例丨使用云连接CC和数据复制服务DRS实现跨区域RDS迁移和数据同步

    摘要:实践案例展示如何使用云连接CC和数据复制服务DRS实现跨区域RDS迁移和数据同步. [业务场景及诉求] 希望将不同区域"华北-北京四"的rds与"亚太-新加坡&qu ...

  5. 知识+AI融合创新探索,华为云论文被AI顶级学术期刊IEEE TPAMI接受

    摘要:通过利用物体类别之间存在的层级关系约束,自动学习从数据中抽取识别不同类别的规则,一方面对模型的预测过程进行解释,另一方面也提供了一条引入人工先验知识的可行途径. 前言 受益于深度学习技术的突破, ...

  6. 云小课 | 华为云KYON之ELB混合负载均衡

    摘要:本文介绍在华为云KYON(Keep Your Own Network)企业级云网络解决方案中,弹性负载均衡服务提供混合负载均衡功能,支持使用公有云的负载均衡绑定华为云上和IDC,实现云上云下业务 ...

  7. DataLeap的Catalog系统近实时消息同步能力优化

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 摘要 字节数据中台DataLeap的Data Catalog系统通过接收MQ中的近实时消息来同步部分元数据.Apa ...

  8. linux 实时刷新显示当前时间

    同步阿里云时间 ntpdate ntp1.aliyun.com 使用watch命令:周期性的执行一个命令,并全屏显示. watch -n 1 date 即可:每1秒刷新date命令. # 格式 wat ...

  9. Linux day4:查看文件属性信息 inode和block 硬链接和软链接 inux系统时间 虚拟机克隆 linux定时任务 paramiko模块 公钥私钥

    目录 文件属性信息 存储数据相关 inode block 访问文件原理 链接信息 硬链接 软链接 linux系统时间 虚拟机克隆 链接克隆和完整克隆 克隆之后的配置 linux定时任务 定时任务软件 ...

  10. termius macos 破解版,激活版下载,永久激活,亲测可用

    termius 是一款非常值得推荐的 SSH/SFTP 跨平台终端工具,其十分亮眼的功能是可以上传文件夹,这是其他几款终端工具都不具备的,比如说 macOS 自带的终端.号称 21 世纪最强终端的 w ...