【工作笔记】FIO是测试IOPS的非常好的工具,用来对磁盘进行压力测试和验证。

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.可以到网站:Best Open Source Mac Software Development Software 2023获取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%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。

本文转自:linux FIO命令详解(一):磁盘IO测试工具 fio (并简要介绍iostat工具)_Yannick_J的博客-CSDN博客FIO介绍FIO是测试IOPS的非常好的工具,用来对磁盘进行压力测试和验证。磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写两大类。FIO是一个可以产生很多线程或进程并执行用户指定的特定类型I/O操作的工具,FIO的典型用途是编写和模拟的I/O负载匹配的作业文件。也就是说FIO 是一个多线程io生成工具,可以生成多种IO模式,用来测试磁盘设备的性能(也包含文件系统:如..._fiohttps://blog.csdn.net/don_chiang709/article/details/92628623

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值