FIO

什么是FIO

可以在文件上工作,也可以在块上工作 与dd作用相似
FIO可以显示各种IO性能

FIO安装方法

git下载安装

git clone https://github.com/axboe/fio.git
# cd fio/
# ./configure
# make
# make install

yum命令

yum install fio

fio的使用

常见参数

filename

filename=/dev/emcpowerb
支持文件系统或者裸设备,-filename=/dev/sda2或-filename=/dev/sdb

direct

direct=1
测试过程绕过机器自带的buffer,使测试结果更真实

rw

rw=randwread
测试随机读的I/O
rw=randwrite
测试随机写的I/O
rw=randrw
测试随机混合写和读的I/O
rw=read
测试顺序读的I/O
rw=write
测试顺序写的I/O
rw=rw
测试顺序混合写和读的I/O

bs

bs=4k
单次io的块文件大小为4k

bsrange

bsrange=512-2048
同上,提定数据块的大小范

size

size=5g
本次的测试文件大小为5g,以每次4k的io进行测试

numjobs

numjobs=30
本次的测试线程为30

runtime

runtime=1000
试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止

name

name=jobname
测试的任务名字

ioengine

ioengine=psync
io引擎使用pync方式,如果要使用libaio引擎,需要yum install libaio-devel

libaio

libaio是linux本地异步IO

rwmixwrite

rwmixwrite=30
在混合读写的模式下,写占30%

group_reporting

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

thread

thread
使用pthread_create创建线程,开销比fork创建进程小

iodepth

iodepth=8
队列深度为8 详解看下面链接blog.csdn.net/qq_40442753/article/details/109848776

lockmem

lockmem=1g
只使用1g内存进行测试

zero_buffers

zero_buffers
用0初始化系统buffer

nrfiles

nrfiles=8
个进程生成文件的数量

磁盘读写常用测试点

  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%随机写)

fio测试顺序写

向/dev/sda 使用顺序写入1100GB块大小2M 使用标准输入 队列深度为8 线程为1 结果输出到/tmp/100S100W 任务名为100S100W 使用异步io引擎

 fio -output=/tmp/100S100W -name=100S100W -filename=/dev/sda -ioengine=libaio -direct=1 -blocksize=2M -size=1100GB -rw=write -iodepth=8 -numjobs=1

参数解释
-output 输出运行结果到/tmp/100s100w
-name 测试名100S00W
-filename 测试的文件名 /dev/sda
-ioengine=libaio io引擎使用 libaio引擎,需要yum install libaio-devel包
-direct=1 测试过程绕过机器自带的buffer,使测试结果更真实
-blocksize=2M 测试块大小2M
-size=1100GB 测试总大小1100GB
-rw=write 测试顺序写
-iodepth=8 测试队列深度
-numjobs=1 每个任务开一个线程

--output-format 输出格式有三个参数:normal terse json 默认是normal,在自动化脚本中使用terse或者json会方便些
为什么要测试不同大小的块大小

为了测试不同大小的写入情况,需要测试出小文件的存储性能以及大文件的存储性能

fio随机测试随机写

向/dev/sdb /dev/sdc /dev/sdd 随机写入1100GB块大小2M 使用标准输入运行时间1800s(半小时) 队列深度为8 线程为1 结果输出到/tmp/100S100W 任务名为100S100W 使用异步io引擎 日志格式为bw_log

fio -output=/tmp/100R100W -name=100R100W -write_bw_log=bw_log -filename=/dev/sdb:/dev/sdc:/dev/sdd  -ioengine=libaio -direct=1 -blocksize=2M -size=1100GB -runtime=1800 -rw=randwrite -iodepth=8 -numjobs=1 

参数解释:
-output输出结果到/tmp/100R100W
-name 任务名100R100W
-write_bw_log=bw_log 日志个bw_log
-filename=/dev/sdb:/dev/sdc:/dev/sdd 测试文件/dev/sdb:/dev/sdc:/dev/sdd 不同文件用:隔开
-runtime=1800 运行时间1800s,如果程序执行超过1800s就停止 一般是预测时间,,在不知道测试设备时,要写入大文件时可能耗时特别长,在超时没写完时候退出也可以拿到性能指标
-ioengine=libaio io引擎
-direct=1 直接写u人
-blocksize=2M 块大小2M
-size=3356GB 总写入大小3356GB
-rw=randwrite 随机写
-iodepth=8 队列深度8
-numjobs=1 每个线程运行1个任务

fio测试顺序读

向/dev/sda顺序读取 读取块大小2M 测试时间为1800s 输出日志是/tmp/100S100W 任务名称100S100W 使用标准输入 使用异步io 文件深度为8 线程数1

fio -output=/tmp/100S100W -name=100S100W -filename=/dev/sda -ioengine=libaio -direct=1 -blocksize=2M  –runtime=1800 -rw=read -iodepth=8 -numjobs=1

fio测试随机读

向/dev/sdb /dev/sdc /dev/sdd 随机读取 读取块大小2M 测试时间为1800s 输出日志是/tmp/100S100Wsdbsdcsdd 任务名称100S100W 使用标准输入 使用异步io 文件深度为32 线程数1 开启bw_log lat_log日志记录

fio -output=/tmp/100S100Wsdbsdcsdd -name=100S100W -write_bw_log=bw_log -write_lat_log=lat_log -filename=/dev/sdb:/dev/sdc:/dev/sdd -ioengine=libaio -direct=1 -blocksize=2M -runtime=1800 -rw=randread -iodepth=32 -numjobs=1

fio混合随机读写

向/dev/sdb /dev/sdc /dev/sdd 混合随机读取 读取或写入块大小2M 读取占比70 写入占比30 测试时间为1800s 输出日志是/tmp/100S100W 任务名称100S100W 使用标准输入 使用异步io 文件深度为32 线程数1 开启bw_log lat_log日志记录

fio -output=/tmp/100S100W -name=100S100W -filename=/dev/sdb:/dev/sdc:/dev/sdd -ioengine=libaio -direct=1 -blocksize=2M -runtime=300 -rw=randrw -rwmixread=70 -rwmixwrite=30 -iodepth=32 -numjobs=1

监控磁盘io命令

监控磁盘IO命令:

iostat –mx 1

iostat的安装方法:yum install sysstat
参考:blog.csdn.net/MrSate/article/details/104421383

avg-cpu: %user %nice %system %iowait %steal %idle
12.74 0.00 8.95 0.04 0.00 78.27
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util
sda 0.18 10.05 0.31 7.67 0.01 0.07 18.77 0.00 0.28 0.14 0.11
sdb 0.69 0.10 15.74 11.21 0.17 2.45 190.77 0.34 12.10 0.23 0.63
sdc 0.43 0.06 9.58 5.94 0.13 1.20 176.32 0.03 1.70 0.16 0.25

rrqm/s

rrqm/s
每秒合并读操作的次数

wrqm/s

wrqm/s
每秒合并写操作的次数

r/s

r/s
每秒读操作的次数

w/s

w/s
每秒写操作的次数

rMB/s

rMB/s
每秒读取的MB字节数

wMB/s

wMB/s
每秒写入MB字节数

avgrq-sz

avgrq-sz
每个IO的平均扇区(512字节)数 块大小

avgqu-sz

avgqu-sz
平均未完成的IO请求数量

await

await
平均每个IO所需要的时间

svctm

已经废弃, 没有实际参考价值

%util

%util
工作时间或者繁忙时间占总时间的百分比

fio测试结果参数说明

io=执行了多少M的IO
bw=平均IO带宽
iops=IOPS每秒执行了多少次IO操作(读写都算内)吞吐量单位是MB,而IOPS是次数,在测试小文件时候要频繁打开(文件响应时间),会导致数值低,这个值比重大
runt=线程运行时间
slat=提交延迟
clat=完成延迟
lat=响应时间
文件响应时间:是用户从下放请求到,处理请求所响应时间,单位一般是ms,单个文件不好测试,一般用多个文件一起测试
bw=带宽
cpu=利用率
IO depths=io队列
IO submit=单个IO提交要提交的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=磁盘利用率
样例:
在这里插入图片描述

在这里插入图片描述

任务的名称是perf
groupid=0 进程组 0
jobs=1 线程 1
err=0 错误数 0
pid=2992 进程号 2992
在这里插入图片描述

写入测试结果
在这里插入图片描述

最快响应时间min
最慢响应时间max
平均响应时间avg
在这里插入图片描述

bw带宽
在这里插入图片描述

lat:
2ms响应占0.01%
1ms站0.01%

合并起来求平均值得出响应时间

在这里插入图片描述

CPU:
用户占用情况 系统占用情况

在这里插入图片描述

深度设置看所设置参数,图中参数设置深度为5 所以深度4之后的文件分布情况都是0%

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐