磁盘IO测试工具 FIO

603 阅读6分钟

一、安装

yum install fio –y  

二、基本参数

  1. I/O engine
  • libaio - Linux 原生的异步 I/O,这也是通常我们这边用的最多的测试盘吞吐和延迟的方法
  • sync - 也就是最通常的 read / write 操作
  • vsync - 使用 readv / writev,主要是会将相邻的 I/O 进行合并
  • psync - 对应的 pread / pwrite,增量同步,一般sync是全量的
  • pvsync / pvsync2 - 对应的 preadv / pwritev,以及 preadv2 / p writev2
  1. filename
    测试文件名称,通常选择需要测试的盘的data目录
  2. direct
    是否使用directIO,direct=1 测试过程绕过OS自带的buffer,使测试磁盘的结果更真实。所以有一种模式叫做DirectIO,跳过缓存,直接读写SSD。
  3. rw
    rw=randwrite     测试随机写的I/O
    rw=randrw        测试随机写和读的I/O
  4. bs
    I/O 操作的大小,通常我们都是读写使用相同的 block,譬如 bs=4k,但实际还会不一样,我们可以用 bs=4k,16k 来设置读是 4k,但写是 16k
  5. size
    size=5G 每个线程读写的数据量为5G
  6. numjobs
    每个job(任务)开1个线程,这里用了几,后面每个用-name指定的任务就开几个线程测试。所以最终线程数=任务数(几个name=jobx)* numjobs
    如 fio -name=job1 -name=job2
    即:建立了两个任务,共享-name=job1之前的参数。-name之后的就是job2任务独有的参数。 并发测试容易满死
  7. thread
    使用pthread_create创建线程,另一种是fork创建进程。
  8. runtime
    runtime=1000 测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止。测试时间runime的值应尽量不低于1h,如果时间很短没有测试实际意义
  9. rwmixwrite
    rwmixwrite=30 在混合读写的模式下,写占30%
  10. group_reporting
    关于显示结果的,汇总每个进程的信息。
  11. lockmem
    lockmem=1g 只使用1g内存进行测试
  12. zero_buffers
    zero_buffers=0 用0初始化系统buffer。
  13. nrfiles
    每个进程生成文件的数量

三、常用命令参考

顺序读
/home/lym/fio-2.1.4/fio -name=test-read -filename=/opt/test_read -direct=1 -thread -rw=read -ioengine=psync -bs=4k -size=1G -numjobs=8 -runtime=60 -group_reporting 

顺序写
/home/lym/fio-2.1.4/fio -name=test-write -filename=/opt/test_write -direct=1 -thread -rw=write -ioengine=psync -bs=4k -size=1G -numjobs=8 -runtime=60 -group_reporting 

混合顺序读写
/home/lym/fio-2.1.4/fio -name=test-randrwmix -filename=/opt/test_randrwmix -direct=1 -thread -rw=rw -rwmixread=70 -ioengine=psync -bs=4k -size=1G -numjobs=8 -runtime=60 -group_reporting

随机读
/home/lym/fio-2.1.4/fio -name=test-randread -filename=/opt/test_randread -direct=1 -thread -rw=randread -ioengine=psync -bs=4k -size=1G -numjobs=8 -runtime=60 -group_reporting

随机写
/home/lym/fio-2.1.4/fio -name=test-randwrite -filename=/opt/test_randwrite -direct=1 -thread -rw=randwrite -ioengine=psync -bs=4k -size=1G -numjobs=8 -runtime=60 -group_reporting

混合随机读写
/home/lym/fio-2.1.4/fio -name=test-randrwmix -filename=/opt/test_randrwmix -direct=1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=4k -size=1G -numjobs=8 -runtime=60 -group_reporting

四、结果分析

Jobs: 30 (f=30): [w(30)][100.0%][w=153MiB/s][w=9782 IOPS][eta 00m:00s]
test: (groupid=0, jobs=30): err= 0: pid=21034: Thu Jun  4 18:49:56 2020

  write: IOPS=11.1k, BW=173MiB/s (182MB/s)(1734MiB/10002msec); 0 zone resets
    clat (usec): min=5, max=88218, avg=2700.66, stdev=2176.33
     lat (usec): min=6, max=88218, avg=2700.98, stdev=2176.36
    clat percentiles (usec):
     |  1.00th=[   10],  5.00th=[   45], 10.00th=[   52], 20.00th=[  816],
     | 30.00th=[ 1696], 40.00th=[ 2311], 50.00th=[ 2737], 60.00th=[ 3130],
     | 70.00th=[ 3556], 80.00th=[ 3982], 90.00th=[ 4883], 95.00th=[ 6063],
     | 99.00th=[ 7373], 99.50th=[ 8291], 99.90th=[18220], 99.95th=[26346],
     | 99.99th=[53740]
   bw (  KiB/s): min= 3552, max=40271, per=3.33%, avg=5913.96, stdev=4550.90, samples=592
   iops        : min=  222, max= 2516, avg=369.60, stdev=284.39, samples=592
  lat (usec)   : 10=1.10%, 20=0.79%, 50=7.09%, 100=5.98%, 250=2.23%
  lat (usec)   : 500=0.92%, 750=1.26%, 1000=3.18%
  lat (msec)   : 2=11.54%, 4=46.17%, 10=19.38%, 20=0.29%, 50=0.07%
  lat (msec)   : 100=0.01%
  cpu          : usr=0.16%, sys=2.21%, ctx=205649, majf=0, minf=0
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued rwts: total=0,110988,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
  WRITE: bw=173MiB/s (182MB/s), 173MiB/s-173MiB/s (182MB/s-182MB/s), io=1734MiB (1818MB), run=10002-10002msec 作者:村雨Mura https://www.bilibili.com/read/cv15021687/ 出处:bilibili

w=153MiB/s    写入速度
w=9782 IOPS    写IOPS指标

IOPS=11.1k    IOPS值
BW=173MiB/s (182MB/s)(1734MiB/10002msec)    指带宽,平均值173,峰值182,1734MB 每10000微秒(10秒内总共走了1734M数据)
bw 小文件传输时的带宽数值

slat=提交延迟,提交该IO请求到kernel所花的时间(不包括kernel处理的时间)
clat=完成延迟, 提交该IO请求到kernel后,处理所花的时间
lat=响应时间,总共花了多少时间
后面是lat测试响应时间的一个分布情况:例如lat (msec)   : 2=11.54%, 4=46.17%, 10=19.38%, 20=0.29%, 50=0.07%,表示在2微秒内有11.54%,4微秒内的有46.17%...以此类推

五、衡量硬盘性能,最直观的就是IOPS和吞吐量。

1、IOPS,每秒处理的IO次数 指存储设备(HDD、SSD、SAN)单位时间内能处理的IO请求数量,对随机读写频繁的应用,如OLTP数据库、图片、是最关键的衡量指标。IOPS数值受读写比例、随机IO、IO大小、队列深度等因数影响。数据库通常访问一系列不连续的数据,根据文件物理位置,需要很多次IO才能完成。所以需要随机IO高的设备。

2、Throughput,吞吐量 指单位时间内可以成功传输的数据数量,传输包括读和写的总和。对于大文件或者流媒体的应用,拥有大量顺序读写,则更关注数据吞吐量。数据吞吐量还受到存储设备接口速度限制,比如IDE、SATA、SAS、FC,SSD使用PCIE Nvme接口最佳,但同时期推出的接口都大于存储设备吞吐量上限。

当每次IO操作的block较小时,如512bytes/4k/8k等,测试的主要是IOPS
当每次IO操作的block较大时,如256k/512k/1M等,测试的主要是吞吐量

六、IOPS和传输速度(吞吐量)的关系:

IOPS和传输速度没有直接关系,不能使用IOPS*块大小=传输速度

在没有缓存的情况下它们共同的决定因素都是对磁盘系统的访问方式以及单个IO的大小。对磁盘进行随机访问时候我们可以利用IOPS来衡量一个磁盘系统的性能,此时的传输速度不会太大

但是当对磁盘进行连续访问时,此时的IOPS已经没有了参考的价值,这个时候限制实际传输速度却是磁盘的最大传输速度

因此在实际的应用当中,只会用IOPS来衡量小IO的随机读写的性能,而当要衡量大IO连续读写的性能的时候就要采用传输速度而不能是IOPS了。

参考

【技术】FIO测硬盘的IOPS、吞吐量