一、 FIO简介

FIO 是一个多线程IO生成工具,可以生成多种IO模式(随机、顺序、读、写四大类),用来测试磁盘设备的性能。GFIO是FIO的图形监测工具,它提供了图形界面的参数配置,和性能监测图像。

在github上的链接为 https://github.com/axboe/fio

二、 FIO安装

1. yum安装

yum -y install fio.x86_64

2. 源码安装

yum -y install libaio* gcc wget make
  • 安装gfio:基于gdk实现,是其图形界面版(可选)
yum -y install libgtk2.0-dev
  • 解压FIO压缩包,进入FIO目录编译安装

  1. ./configure --enable-gfio #如果希望不支持gfio,只需去掉后面的--enable-gfio参数
  2. make
  3. make install
  • 设置环境变量

  1. vi .bash_profile
  2. PATH=$PATH:$HOME/bin:/usr/local/bin
  3. source .bash_profile

三、 常用参数


  1. filename=/dev/emcpowerb 支持文件系统或者裸设备,-filename=/dev/sda2或-filename=/dev/sdb
  2. direct=1 测试过程绕过机器自带的buffer,使测试结果更真实
  3. rw=randwread 测试随机读的I/O
  4. rw=randwrite 测试随机写的I/O
  5. rw=randrw 测试随机混合写和读的I/O
  6. rw=read 测试顺序读的I/O
  7. rw=write 测试顺序写的I/O
  8. rw=rw 测试顺序混合写和读的I/O
  9. bs=4k 单次io的块文件大小为4k
  10. bsrange=512-2048 同上,提定数据块的大小范围
  11. size=5g 本次的测试文件大小为5g,以每次4k的io进行测试
  12. numjobs=30 本次的测试线程为30
  13. runtime=1000 测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止
  14. ioengine=psync io引擎使用pync方式,如果要使用libaio引擎,需要yum install libaio-devel包
  15. rwmixwrite=30 在混合读写的模式下,写占30%
  16. group_reporting 关于显示结果的,汇总每个进程的信息
  17. 此外
  18. lockmem=1g 只使用1g内存进行测试
  19. zero_buffers 用0初始化系统buffer
  20. nrfiles=8 每个进程生成文件的数量

四、 常用测试场景

1. 命令行测试

  • 100%随机,100%读,4K
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
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
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
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
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提供了不同场景的压测参数文件,修改其中配置然后直接执行即可。https://github.com/axboe/fio/tree/master/examples

fio examples/ssd-test.fio

上面这个参数文件用于测试ssd性能,参数文件内容如下:

其中每一个[]代表一个测试分组,会为每组分别进行测试(比如下面有5组)。


  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

下面是一个模拟MySQL数据库的压测配置文件


  1. # QPS: 40000(10 cores)
  2. # Dataset: 200G
  3. # R/W: 8/2
  4. # ThreadPool Num: 64
  5. # IO ThreadNum: 32
  6. [global]
  7. runtime=86400
  8. time_based
  9. group_reporting
  10. directory=/your_dir
  11. ioscheduler=deadline
  12. refill_buffers
  13. [mysql-binlog]
  14. filename=test-mysql-bin.log
  15. bsrange=512-1024
  16. ioengine=sync
  17. rw=write
  18. size=24G
  19. sync=1
  20. rw=write
  21. overwrite=1
  22. fsync=100
  23. rate_iops=64
  24. invalidate=1
  25. numjobs=64
  26. [innodb-data]
  27. filename=test-innodb.dat
  28. bs=16K
  29. ioengine=psync
  30. rw=randrw
  31. size=200G
  32. direct=1
  33. rwmixread=80
  34. numjobs=32
  35. thinktime=600
  36. thinktime_spin=200
  37. thinktime_blocks=2
  38. [innodb-trxlog]
  39. filename=test-innodb.log
  40. bsrange=512-2048
  41. ioengine=sync
  42. rw=write
  43. size=2G
  44. fsync=1
  45. overwrite=1
  46. rate_iops=64
  47. invalidate=1
  48. numjobs=64

五、 测试结果解读

测试输出结果如下


  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(Number of ticks we kept the disk busy), in_queue=9105836(花费在队列上的总共时间), util=100.00%(磁盘利用率)

输出参数介绍(详情参考 Fio Output Explained

  • io=执行了多少M的IO
  • bw=平均IO带宽(吞吐量)
  • iops=IOPS
  • runt=线程运行时间
  • slat=提交延迟,提交该IO请求到kernel所花的时间(不包括kernel处理的时间)
  • clat=完成延迟, 提交该IO请求到kernel后,处理所花的时间
  • lat=响应时间
  • bw=带宽
  • cpu=利用率
  • IO depths=io队列
  • IO submit=单个IO提交要提交的IO数
  • IO complete=Like the above submit number, but for completions instead.
  • IO issued=The number of read/write requests issued, and how many of them were short.
  • IO latencies=IO完延迟的分布
  • io=总共执行了多少size的IO
  • aggrb=group总带宽
  • minb=最小平均带宽
  • maxb=最大平均带宽
  • mint=group中线程的最短运行时间
  • maxt=group中线程的最长运行时间
  • ios=所有group总共执行的IO数
  • merge=总共发生的IO合并数
  • ticks=Number of ticks we kept the disk busy
  • io_queue=花费在队列上的总共时间
  • util=磁盘利用率

六、 测试建议

  • 使用顺序IO和较大的blocksize测试吞吐量和延迟
  • 使用随机IO和较小的blocksize测试IOPS和延迟
  • 在配置numjobs和iodeph前,建议深入了解应用采用的是同步IO还是异步IO(是多进程并发IO还是一次提交一批IO请求)

备注

  • 磁盘的 IOPS,也就是在一秒内,磁盘进行多少次 I/O 读写。
  • 磁盘的吞吐量,也就是每秒磁盘 I/O 的流量,即磁盘写入加上读出的数据的大小。
  • 每秒 I/O 吞吐量= IOPS* 平均 I/O SIZE。

七、 简单自动压测脚本


  1. #!/bin/sh
  2. # fiotest.sh
  3. # bs=4k,1M size=100M,1G type=read,randread,write,randrw,rw 各压测三次,取平均值
  4. bs_list=(4k 1M)
  5. size_list=(100M 1G)
  6. type_list=(read randread write randrw rw)
  7. for v_bs in {0..1} #bs_list
  8. do
  9. for v_size in {0..1} #size_list
  10. do
  11. for v_type in {0..4} #type_list
  12. do
  13. for v_runtime in {0..2} #runtime
  14. do
  15. logfile=fio_${bs_list[$v_bs]}_${size_list[$v_size]}_${type_list[$v_type]}_$v_runtime.txt
  16. echo -e "test $v_runtime started\n" > $logfile
  17. echo -e "started time `date`\n" >> $logfile
  18. fio --filename=/data/testfile1 --direct=1 --bs=${bs_list[$v_bs]} --size=${size_list[$v_size]} --rw=${type_list[$v_type]} --ioengine=libaio --iodepth=128 --numjobs=1 --time_based --group_reporting --runtime=60 --name=$logfile >> $logfile
  19. echo -e "\nfinished time `date`" >> $logfile
  20. echo -e "\ntest $v_runtime finished" >> $logfile
  21. sleep 5
  22. done #runtime
  23. sleep 60
  24. done #type_list
  25. done #size_list
  26. done #bs_list

八、 输出结果解析命令

我们一般记录框里的值

读IO提交延迟

cat fio_* |grep -A 3 read |grep clat > read.tmp

写IO提交延迟

cat fio_* |grep -A 3 write |grep clat > write.tmp

带宽与iops

cat fio_* |grep bw|grep iops|grep read > r_iops.tmp

cat fio_* |grep bw|grep iops|grep write > w_iops.tmp

直方图信息(记录最大比例)

cat -n fio_* | grep 'lat (' | grep -v min > histos.tmp

参考

FIO使用说明_半遮雨的博客-CSDN博客_fio util结果100%

https://github.com/axboe/fio

IO测试工具之fio详解 - raykuan - 博客园

Fio模拟Mysql服务器IO压力脚本 | 系统技术非业余研究

磁盘性能评价指标—IOPS和吞吐量_风云龙儿的博客-CSDN博客_海波龙磁盘吞吐量多少

</article>

[转帖]FIO 存储性能压测的更多相关文章

  1. 软件性能测试分析与调优实践之路-JMeter对RPC服务的性能压测分析与调优-手稿节选

    一.JMeter 如何通过自定义Sample来压测RPC服务 RPC(Remote Procedure Call)俗称远程过程调用,是常用的一种高效的服务调用方式,也是性能压测时经常遇到的一种服务调用 ...

  2. MySQL 性能压测工具-sysbench,从入门到自定义测试项

    sysbench是一个开源的.基于LuaJIT(LuaJIT 是 Lua 的即时编译器,可将代码直接翻译成机器码,性能比原生 lua 要高) 的.可自定义脚本的多线程基准测试工具,也是目前用得最多的 ...

  3. 性能压测诡异的Requests/second 响应刺尖问题

    最近一段时间都在忙着转java项目最后的冲刺,前期的coding翻代码.debug.fixbug都逐渐收尾,进入上线前的性能压测. 虽然不是大促前的性能压测要求,但是为了安全起见,需要摸个底心里有个数 ...

  4. jmeter系列-如何实现像loadrunner一样,多个并发用户先通过登录初始化,然后做并发的接口性能压测

    自动转开发后,就很少关注性能测试方面的东西,最近在帮朋友做一个性能压测,由于朋友那边的公司比较小,环境比较简单,而且是对http服务进行的压测,所以最终 选用了jmeter来实现这个压测. 如下就是我 ...

  5. 性能压测,SQL查询异常

    早上测试对性能压测,发现取sequence服务大量超时报错,查询线上的监控SQL: 大量这个查询,我在DeviceID和Isdelete上建有复合索引,应该很快,而且我测试了一下,取值,执行效率很高, ...

  6. jmeter性能压测瓶颈排查-网络带宽

    问题: 有一台机器做性能压测的时候,无论开多少个线程,QPS一直压不上去,而服务器和数据库的性能指标(主要是CPU和内存)一直维持在很低的水平. 希望帮忙排查一下原因. 过去看了下进行压测的接口代码, ...

  7. 性能压测中的SLA,你知道吗?

    本文是<Performance Test Together>(简称PTT)系列专题分享的第6期,该专题将从性能压测的设计.实现.执行.监控.问题定位和分析.应用场景等多个纬度对性能压测的全 ...

  8. 并发模式与 RPS 模式之争,性能压测领域的星球大战

    本文是<如何做好性能压测>系列专题分享的第四期,该专题将从性能压测的设计.实现.执行.监控.问题定位和分析.应用场景等多个纬度对性能压测的全过程进行拆解,以帮助大家构建完整的性能压测的理论 ...

  9. [SCF+wetest+jmeter]简单云性能压测工具使用方案

    前言 压测太难?局域网压力无法判断服务器网络指标?无法产生非常大的并发量?云性能太贵? 也许我们可以把各种简单的工具拼起来进行压力测试! 准备 https://cloud.tencent.com/pr ...

  10. EMQ X 系统调优和性能压测

    前言 如果使用 EMQ 来承载百万级别的用户连接可以吗?毕竟在 MQTT 官方介绍上说 EMQ X 可以处理千万并发客户端,而 EMQ X 自己官方称 4.x 版本 MQTT 连接压力测试一台 8 核 ...

随机推荐

  1. Quartz.Net系列(一):Windows任务计划程序

    1.使用此电脑=>管理  系统工具=>任务计划程序=>任务计划程序库=>创建任务  创建任务  触发器  操作  条件=>去掉只有在计算机使用交流电源时才启动此任务 创建 ...

  2. 神经网络基础篇:向量化(Vectorization)

    向量化 向量化是非常基础的去除代码中for循环的艺术,在深度学习安全领域.深度学习实践中,会经常发现自己训练大数据集,因为深度学习算法处理大数据集效果很棒,所以的代码运行速度非常重要,否则如果在大数据 ...

  3. GaussDB(DWS)云原生数仓技术解析

    摘要:本文主要介绍GaussDB(DWS)云原生数仓架构.产品能力,帮助开发者快速了解GaussDB(DWS)云原生数仓相关信息与能力. 本文分享自华为云社区<直播回顾 | GaussDB(DW ...

  4. 知道Python中的字符串是什么吗?

    摘要:本文将告诉您Python中的字符串是什么,并向您简要介绍有关该概念的所有知识. 本文将介绍以下内容: 如何创建一个字符串? 如何从字符串访问字符? 格式化字符串 因此,让我们开始吧. 什么是Py ...

  5. CNCF Serverless工作流社区携手华为云FunctionGraph,开拓Serverless编排新时代

    摘要:华为云以CNCF Serverless Workflow 规范为标准,联合2012实验室华为元戎团队共同打造了华为云FunctionGraph Workflow,为用户提供函数流管理功能,并支持 ...

  6. PPT 商务PPT 如何展示你的产品

    PPT 商务PPT 如何展示你的产品 如何优雅的展示产品 如何展示互联网产品 直接产品截图,比较生硬,简单粗暴 使用场景+样机 放一个电脑或手机的外壳 如何展示产品 如何展示现实中的产品 多角度剪裁 ...

  7. 基于BaseHTTPRequestHandler的HTTP服务器基础实现

    1. BaseHTTPRequestHandler介绍 BaseHTTPRequestHandler是Python中的一个基类,属于http.server模块,用于处理HTTP请求的基本功能.它提供了 ...

  8. 柔性上肢康复机器人研究中的VR技术

    上肢康复机器人用于对脑卒中患者进行上肢康复治疗,能够维持和扩大患者关节活动度.增强肌肉力和协调性,以防止肌肉萎缩.关节痉挛等各类症状的出现,最终重建肢体功能,以便回归正常生活.现有的上肢康复机器人训练 ...

  9. 记录一次Java内存泄露分析过程

    版权说明: 本文章版权归本人及博客园共同所有,转载请在文章前标明原文出处( https://www.cnblogs.com/mikevictor07/p/13032635.html ),以下内容为个人 ...

  10. Kafka--简介,部署

    kafka官网:https://kafka.apache.org/documentation/ 本文kafka版本:3.1.0 一.简介 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消 ...