Fio工具详解【强大的IO性能压测工具】

这篇具有很好参考价值的文章主要介绍了Fio工具详解【强大的IO性能压测工具】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Fio压测工具操作

fio -name=iouring_test -filename=/mnt/vdd/testfile -iodepth=128 -thread -rw=randread -ioengine=io_uring -sqthread_poll=1 -direct=1 -bs=4k -size=10G -numjobs=1 -runtime=120 -group_reporting

常用参数

[time]

runtime=time

​ 告诉fio在指定的时间段后终止处理。很难确定指定作业将运行多长时间,因此此参数可以方便的将总运行时间限制为给定时间。当省略单位时间,该数值以秒为单位进行解释。

time_based

​ 如果设置,即使文件被完全读取或写入,fio也将在指定的运行期间运行。它会在runtime准许时间内多次循环相同的工作负载。

ramp_time=time

​ 如果设置,fio将在记录任何性能数据之前这段时间内运行指定的工作负载。有助于在记录结果之前,让性能稳定下来,从而最大限度的减少稳定结果所需的运更新时间。请注意,ramp_time被认为是作业的提前信息,因此如果指定了特殊的超时或者运行时间,它将增加总运行时间。当省略单位时,该值以秒为单位。可以减少日志对高速IO的影响。

[I/O tpye]

direct=bool

​ 是否使用 direct io,测试过程不使用OS 自带的buffer,使测试磁盘的结果更真实。Linux读写的时候,内核维护了缓存,数据先写到缓存,后面在后台写到SSD。读的时候也优先读缓存里的数据。这样速度可以加快,但是一旦掉电,缓存里的数据就没有了。所以有一种模式叫做direct io,跳过缓存,直接读写SSD。

rw=randwrite

​ 测试随机写的I/O:

​ 顺序IO是指读写操作的访问地址顺序连接,顺序的操作磁道搜索时间显著减少,因为磁头可以以最小的移动访问下一块。【数据备份和日志记录都是顺序IO业务】

​ 随机IO是指读写操作时间连续,但是访问地址不连续,随机分布在磁盘的地址空间中。产生随机IO的业务有OLTP服务,SQL等。

rw=randrw

​ 测试随机写或者读的IO

rwmixwrite=int

​ 在混合读写模式下,写占用30%。

[Blocks size]

bs=int

​ 单次IO的块文件大小为16k

bsrange=1k-4k,2k-8k,1k-4k

​ 指定数据块的大小范围,可以为读取、写入和修剪指定逗号分割的范围。

size=5G

​ 每个线程读写的数据量是5GB

[Job description]

name=str

​ 一个任务的名字,重复了也没关系。如果fio -name=job1 -name=job2,建立了两个任务,共享-name=job1之前的参数。-name=job1之后的就是job2任务独有的参数。

numjobs=int

​ 创建此作业的指定数量的克隆。每个作业克隆都作为一个独立的线程或者进程产生(执行相同工作的进程或者线程)。每个Job(任务)开1个线程,有多少 -name 就开多少个线程。所以最终线程数 = 任务数 (-name 的数量) * numjiobs。

filename=str

​ 测试文件的名称。指定相对路径或者绝对路径。没有的话会自行创建。

[Threads, processes and job synchronization]

thread

​ Fio默认使用fork创建作业,如果给出此选项,将会以pthread_create(3) 创建作业。使用fork创建线程的开销比较大。

threads=int

​ 指定线程的数量

[I/O engine]

ioengine=<str>

​ str: sync 基本的同步·读写操作,参考fsync和fdatasync

​ str:psync 基于 pread(2) 或者 pwrite(2) 进行IO操作。

​ str:vsync

​ str:pvsync

​ str:pvsync2:

​ str:io_uring 快速的Linux原生异步I/O。支持直接和缓冲IO操作。

​ str:io_uring_cmd 用于传递命令的快速Linux本机异步I/O。

​ str:libaio linux异步I/O。注意:Linux可能只支持具有非缓冲I/O的排队行为(设置为direct=1buffered=0: rbd:通过librbd直接访问CEPH Rados

userspace_reap:[libaio]

​ 通常,在使用libaio引擎的情况下,fio将使用io_getevents(2)系统调用来获取新返回的事件。打开此标志后,将直接从客户空间读取AIO环以获取事件。提高异步IO的收割速度。当轮询至少0个事件时候,收割模式才会启动。(iodepth_batch_complete=0)

[IO depth]

iodepth=int

​ 队列的深度。在异步模式下,CPU不能一直无限的发命令到SSD。比如SSD执行读写如果发生了卡顿,那有可能系统会一直不停的发命令,几千个,甚至几万个,这样一方面SSD扛不住,另一方面这么多命令会很占内存,系统也要挂掉了。

iodepth 技巧

大致把延迟分为两部分,第一部分是读写本身需要的时间ts,第二部分是路上的网络、上下文切换时间tl。

iodepth可降低tl占比,提高ts占比:
iodepth可以批量提交请求,所以可以降低上下文切换的次数。
当ts本身占比很高的时候,那就没有提升的空间了。
如果ts占比较低,通过提高iodepth就可以提升iops。

[Buffers and memory]

lockmem=int

​ 使用mlock(2)固定指定数量的内存。可用于模拟较小的内存量。只使用指定内存进行测试。

zero_buffers

​ 用全零初始化缓冲区。默认值:用随机数据填充缓冲区。

[Target file/device]

nrfiles=int

​ 用于此作业文件数。默认为1.除非文件大小明确指定大小,否则文件大小将是数据量除以nrfiles的大小。文件是为每个线程单独创建的。默认情况下,每个文件的名称中都有一个文件编号。

opendir=str

​ 让fio递归的添加目录下和子目录下的所有文件。

[command line options]

--output=filename

​ 输出日志信息到指定的文件。

--output-format=format

​ 指定输出文件的格式。将日志格式设置为normal、terse、json 或 json+。可以选择多种格式,以逗号分隔。terse 是一种基于 CSV 的格式。json+ 类似于 json,只是它添加了延迟存储桶的完整转储。

[Measurements and reporting]

group_reporting

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

stats=bool

​ 默认情况下,fio收集并显示所有运行的作业的最终输出结果。如果此选项设置为0,则fio将在最终统计输出中忽略它。

write_bw_log=str

​ 如果给定,为此作业编写带宽日志。可以用于存储作业在其生命周期内的宽带数据。

write_lat_log=str

​ 与write_bw_log相同,只是此选项创建 I/O 提交(例如,name_slat.x.log)、完成(例如,name_clat.x.log)和总(例如,name_lat.x.log)延迟文件。有关文件名格式的详细信息,请参阅write_bw_log,并了解数据在文件中的结构,请参阅日志文件格式。

write_hist_log=str

​ 与write_bw_log相同,但改为写入I/O完成延迟直方图(例如 name_hist.x.log)。


fio压测示例

#针对io_uring的fixedufs特性
fio -threads=8 -size=10G -name=test -group_reporting -filename=./io.tmp -runtime=60 --ioengine=io_uring --iodepth=512 --fixedbufs 

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

[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 发出的读写请求数量,以及数量不足的请求
IO laencies 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 磁盘利用率

图像化工具GFIO

yum install gtk2 gtk2-devel gtk2-devel-docs //安装依赖项
git clone git://git.kernel.dk/fio.git
cd fio*
./configure --enable-gfio 
make fio
make gfio
./fio -S
fio:server listening on 0.0.0.0, 8765 //开启服务端

参考 link

1. fio - Flexible I/O tester rev. 3.32 — fio 3.32-43-g0ebd3-dirty documentation
(105条消息) linux FIO命令详解(一):磁盘IO测试工具 fio (并简要介绍iostat工具)_Yannick_J的博客-CSDN博客_fio命令
(105条消息) 【详细齐全】FIO使用方法 及参数解析(文章末尾)_天健胡马灵越鸟的博客-CSDN博客_fio官网
FIO测试工具中的iodepth具体指的是什么? - 知乎 (zhihu.com)
fio - OpenAnolis 龙蜥操作系统开源社区文章来源地址https://www.toymoban.com/news/detail-789457.html

到了这里,关于Fio工具详解【强大的IO性能压测工具】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux性能测试工具 stress,stress-ng,sysbench,fio以及检测dstat

    通过man帮助,可以看到官方对dstat的定义为:多功能系统资源统计生成工具( versatile tool for generating system resource statistics)。在获取的信息上有点类似于top、free、iostat、vmstat等多个工具的合集,官方解释为vmstat、iostat、ifstat等工具的多功能替代品,且添加了许多额外的功能(

    2024年02月05日
    浏览(33)
  • Linux fio测试硬盘性能

    在Linux系统中,测试硬盘的性能一般使用fio工具实现,fio是Flexible I/O Tester的缩写。是一个常受欢迎的、用于测试存储性能的工具,而且还可以模拟多种不同的I/O模式和工作负载。 一般我们要测试一块硬盘的性能,一般需要进行 随机写入测试、随机读取测试、顺序写入测试、

    2024年02月08日
    浏览(37)
  • fio性能测试-环境搭建,功能介绍,测试讲解

    fio性能测试-环境搭建,功能介绍,测试讲解 Fio介绍:FIO(Flexible I/O Tester)是一个用于测试磁盘、文件系统、块设备和网络设备性能的工具。它可以模拟不同类型的I/O负载,包括随机或顺序读写、混合读写、随机或顺序访问等。FIO提供了丰富的选项和参数,可以对测试进行高

    2023年04月13日
    浏览(31)
  • fio工具及使用

    在实际测试中需要对硬盘有较为完整的测试,之前一直使用IOzone,但发现测试结果并不能完全反映出硬盘的整体性能,所以开始使用fio进行测试,fio测试参数过多,现写出我实际中使用的参数,文末附有在其他论坛查看到的较为完整的fio参数解读 FIO是一个非常简单好用的性能

    2024年02月05日
    浏览(34)
  • 手撕测试tcp服务器效率工具——以epoll和io_uring对比为例

    服务器的性能测试主要包括2部分: 并发量。能容纳多大的连接 效率。在不崩坏的情况下能对报文的处理效率。 本文主要进行效率测试,看看基于epoll模型和io_uring模型的tcp服务器,谁的效率更高。 测试思路 客户端(一个或多个)大量地向服务器发送报文,测试服务器的处理

    2024年01月18日
    浏览(88)
  • io_uring笔记

    要求内核linux 5.10 异步四元组:1、init(create)2、commit 3、callback 4、destory fio : 测iops一秒钟读写磁盘的次数 方式 磁盘iops io_uring 11.6k libaio 10.7k psync 5k spdk(内存操作 , 尽可能都放到用户态) 157k io_uring内核api: io uring. setup(); io uring register(); io_ uring_ enter(); liburing接口: io_uring. _

    2024年02月13日
    浏览(32)
  • 使用C++20协程和io_uring优雅地实现异步IO

    距离2020年已经过去很久了,各大编译器对于C++20各项标准的支持也日趋完善,无栈协程也是其中之一,所以我就尝试着拿协程与 io_uring 实现了一下proactor模式,这篇文章用来记录一下我的设计和想法。除此之外,我们能在网络上找到许多优秀的C++20协程的教程以及许多优秀的

    2024年03月27日
    浏览(38)
  • 【探索Linux】—— 强大的命令行工具 P.11(基础IO,文件操作)

    前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的一些知识,也学习了一些Linux的基本操作,也了解并学习了有关Linux开发工具vim 、gcc/g++ 使用、yum工具以及git 命令行提交代码也相信大家都掌握的不错,上一篇文章我们了解了关于进程的地址空间,今

    2024年02月08日
    浏览(40)
  • FIO 安装方法

            yum安装,不同版本的OS会根据仓库里的fio版本来安装         使用异步模式,需要下载libaio         查看fio版本 2.1、进入官网: fio tools 2.2、上传至Linux中,也可以使用wget命令来下载 2.3、安装编译环境gcc 2.4、下载后进行解压,在指定目录安装 注:--prefix   

    2024年02月08日
    浏览(27)
  • 【探索Linux】文件描述符 | 重定向 | 基础IO —— 强大的命令行工具 P.12

    前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的一些知识,也学习了一些Linux的基本操作,也了解并学习了有关Linux开发工具vim 、gcc/g++ 使用、yum工具以及git 命令行提交代码也相信大家都掌握的不错,上一篇文章我们了解了基础IO,文件操作,今天

    2024年02月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包