Linux下fio磁盘的性能工具的部署和使用

2023-12-27 10:32

本文主要是介绍Linux下fio磁盘的性能工具的部署和使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

介绍

fio 功能强大的性能测试工具, 具备多线程、报告清晰、多种引擎。

没有任何基础的,建议看完fio介绍!后继续阅读。

接下来,以ubuntu为例展示安装和使用过程。

准备条件

  1. fio 各个版本下载
  2. 各个os下fio依赖包 libaio
  3. 依赖库libaio centos 备用链接

安装

  1. 安装libaio

    将下载好的libaio,deb包赋予执行权限;
    执行dpkg -i libaio-xxx.deb就好了
    然后开始安装fio

  2. 安装fio

    将下载好的fio包解压;或者…

wget https://github.com/axboe/fio/archive/fio-2.1.10.tar.gz
./configure && make -j 100 && make install

完成后执行fio会看到类似以下界面就说明安装好了。

fio1

使用

使用方法很多、大家直接搜下看细节。
以下做一些常用功能的简单介绍。

  • 常用功能
100%随机读:
./fio -filename=/opt/testio -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=8k -size=10G -numjobs=50 -runtime=60 -group_reporting -name=rand_100read_8k100%随机写:
./fio -filename=/opt/testio -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=8k -size=10G -numjobs=50 -runtime=60 -group_reporting -name=rand_100write_8k100%顺序读:
./fio -filename=/opt/testio -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=8k -size=10G -numjobs=50 -runtime=60 -group_reporting -name=seq_100read_8k  100%顺序写:
./fio -filename=/opt/testio -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=8k -size=10G -numjobs=50 -runtime=60 -group_reporting -name=seq_100write_8k
  • 按比例随机读写测试
fio --name=text --ioengine=libaio --bs=4k --direct=1 --thread --norandommap --filename=/home/test.bin --rw=randrw --rwmixread=75 --iodepth=1 --numjobs=1 --size=50G --runtime=3000

fio

参考

  • fio-github
  • 无敌-各个os的依赖包下载地址
  • fio官网
  • 华为云官网FIO

fio 参数介绍:

这一部分很长,就放最后了,建议选择性查阅。

	
常用参数	含义
name	任务的名称
description	对任务内容的描述,等同于注释,job文件中注释使用“;”或者“#”
directory	目录名称,用于存储文件
filename	FIO制作文件通常是根据任务名称、线程数量以及文件数量决定。如果想在一个或多个任务中共享文件,应该为每个任务都定于某个文件,这样能覆盖自行产生的文件。多个文件名称可以通过“:”隔开,如果一个任务产生两个工作文件如/dev/sda和/dev/sdb,则filename参数可以设置为filename=/dev/sda:/dev/sdb
nrfiles	某个任务的文件数量,默认值是1。如果定义某个任务的文件大小为1K,且nrfiles等于5的话,则该任务产生5个200字节的文件。
size	这个job IO总共要传输的数据的大小。FIO将会执行到所有的数据传输完成,除非设定了运行时间(‘runtime’选项)。除非有特定的‘nrfiles’选项和‘filesize’选项被设置,fio将会在job定义的文件中平分这个大小。如果这个值不设置的话,fio将会使用这个文件或设备的总大小。如果这些文件不存在的话,size选项一定要给出。也可以给出一个1到100的百分比。e.g. size=20%,fio将会使用给定的文件或设备的20%的空间。
filesize	单个文件的大小,其值可以是一个范围。
ioengine	sync 基本的read,write.lseek用来作定位psync 基本的pread,pwritevsync 基本的readv,writevlibaio Linux专有的异步IO。Linux仅支持非buffered IO的队列行为。 性能更好,更节省CPUposixaio glibc posix异步IOsolarisaio solaris独有的异步IOwindowsaio windows独有的异步IOmmap 文件通过内存映射到用户空间,使用memcpy写入和读出数据splice 使用splice和vmsplice在用户空间和内核之间传输数据syslet-rw 使用syslet 系统调用来构造普通的read/write异步IOsg SCSI generic sg v3 io.可以是使用SG_IO ioctl来同步,或是目标是一个sg字符设备,我们使用read和write执行异步IOnull 不传输任何数据,只是伪装成这样。主要用于训练使用fio,或是基本debug/test的目的。net 根据给定的host:port通过网络传输数据。根据具体的协议,hostname,port,listen,filename这些选项将被用来说明建立哪种连接,协议选项将决定哪种协议被使用。netsplice 像net,但是使用splic/vmsplice来映射数据和发送/接收数据。cpuio 不传输任何的数据,但是要根据cpuload=和cpucycle=选项占用CPU周期.e.g. cpuload=85将使用job不做任何的实际IO,但要占用85%的CPU周期。在SMP机器上,使用numjobs=<no_of_cpu>来获取需要的CPU,因为cpuload仅会载入单个CPU,然后占用需要的比例。guasi GUASI IO引擎是一般的用于异步IO的用户空间异步系统调用接口rdma RDMA I/O引擎支持RDMA内存语义(RDMA_WRITE/RDMA_READ)和通道主义(Send/Recv)用于InfiniBand,RoCE和iWARP协议external 指明要调用一个外部的IO引擎(二进制文件)。e.g. ioengine=external:/tmp/foo.o将载入/tmp下的foo.o这个IO引擎
bs	单次IO的block size,默认为4k。如果是单个值的话,将会对读写都生效。如果是一个逗号,再跟一个int值的话,则是仅对于写有效。也就是说,格式可以是bs=read_end_write或是bs=read,write。e.g. bs=4k,8k读使用4k的块,写使用8k的块。e.g.bs=,8k将使得写采用8k的块,读采用默认的值。
rw	"支持顺序读(read)、顺序写(write)、随机读(randread)、随机写(randwrite)、顺序混合读写(readwrite)or(rw)以及随机混合读写(randrw)。
混合读写时的比例为1:1,读写倒换时间是0.5秒。"FIO也可以设置offset偏移量,例如在rw=randread:8k 但是然并卵
rwmixread	混合读写时,读所占的比例。默认50,需要与rw=randrw 或者 rw=rw 同时使用
rwmixwrite	混合读写时,写所占的比例。默认50,需要与rw=randrw 或者 rw=rw 同时使用
iodepth	设置io engine是异步方式,队列的深度;当其他条件相同是,异步的深度大的任务相对可以获得更好的带宽、IOPS以及IO延时。
numjobs	创建多个相同的任务。通常用来创建大量的进程或者线程做同一件事情,将这样一系列的job,看作一个特定的group
norandommap	正常情况下,fio在进行随机IO测试的时候会覆盖文件的每一个io块。如果设置norandommap参数的话,则fio不会根据以往的io操作而直接得到一个新的随机偏移量。即某些块可能没有被读取,某些块可能读取过多次。
direct	true,则标明采用non-buffered io.同O_DIRECT效果一样。ZFS和Solaris不支持direct io,在windows同步IO引擎不支持direct io
runtime	告诉fio多少秒后终止处理。很难判定某个任务会执行多长时间,所以这个参数可以方便的将总共运行的时间设置成指定时间。
ramp_time	设置测试预热时间
time_based	与runtime参数搭配使用,使得测试执行时间以runtime优先级最高
startdelay	延迟启动FIO测试,默认单位是秒.(配合job文件测试时使用)只有在job文件包含几个jobs时才有效,是为了将某个job延时几秒后执行。
group_reporting	与numjobs参数搭配使用,测试完成后输出所有线程/进程的测试结果之和
rate	"限制job的带宽。
e.g.rate=500k,限制读和写到500k/s
e.g.rate=1m,500k,限制读到1MB/s,限制写到500KB/s
e.g.rate=,500k , 限制写到500kb/s
e.g.rate=500k, 限制读到500KB/s"
ratemin	告诉fio尽最大能力来保证这个最小的带宽,如果不能满足这个需要,将会导致程序退出。
rate_iops	将带宽限制到固定数目的IOPS,基本上同rate一样,只是独立于带宽,如果job是指定了一个block size范围,而不是一个固定的值的话,最小blocksize将会作为标准。
rate_iops_min	如果fio进行io操作的是,没有达到要求的最小级别的IOPS,任务退出;
prio	设置job的优先级,linux将这个值限制在0-7之间,0是最高的。
thinktime	上一个IO完成之后,拖延x毫秒,然后跳到下一个。可以用来访真应用进行的处理。
thinktime_spin	只有在thinktime设置时才有效,在为了sleep完thinktime规定的时间之前,假装花费CPU时间来做一些与数据接收有关的事情。
thinktime_blocks	只有在thinktime设置时才有效,控制在等等‘thinktime’的时间内产生多少个block,如果没有设置的话,这个值将是1,每次block后,都会将等待‘thinktime’us
blockalign=int,ba=int	配置随机io的对齐边界。默认是与blocksize的配置一致,对于direct_io,最小为512b,因为它与依赖的硬件块大小,对于使用文件的随机map来说,这个选项不起作用。
blocksize_range=irange,bsrange=irange	不再采用单一的块大小,而是定义一个范围,fio将采用混合io块大小.IO单元大小一般是给定最小值的备数。同时应用于读写,当然也可以通过‘,’来隔开分别配置读写。sync	
thread 	默认fio使用fork函数创建任务,但是如果thread参数设置了后,fio会使用pthread_create创建线程。
write_iolog	将执行的io模式记录到指定的文件中
read_iolog	打开一个iolog文件,然后按照该文件中包含的io模式重复进行测试
write_bw_log	记录任务的带宽,用于存储在任务生命周期内的带宽数据。fio_generate_plots 脚本使用gunplot将这些文件文件转换成图形。
write_lat_log	存储io完成的延时
lockmem	占用内存,模拟只有少量内存。
cpumask	设置当前的工作和某个CPU相关联。设置job使用的CPU.给出的参数是一个掩码来设置job可以运行的CPU。所以,如果要允许CPU在1和5上的话,可以通过10进制数来设置(1<<1 | 1<<5),或是34。查看sched_setaffinity的man page。它可能并不是支持所有的操作系统和kernel版本。This option doesn’t work well for a higher CPU count than what you can store in an integer mask, so it can only control cpus 1-32. For boxes with larger CPU counts, use cpus_allowed
cpus_allowed	功能同cpumask一样,但是允许通过一段文本来设置允许的CPU。e.g.上面的例子可是这样写cpus_allowed=1,5。这个选项允许设置一个CPU范围,如cpus_allowed=1,5,8-15
cpuload	如果任务是属于CPU 负载测试,则设置CPU的占用率达到某个值。
cpuchunks	设置某段时间内cpu的占用率为某个值。单位为毫秒。
iodepth_batch	每次提交的io数量,默认是iodepth,但是可以设置小于iodepth,甚至设置为1也行。
iodepth_low	如果iodepth_low设置了,则当iodepth填充队列后,下次以iodepth_low大小填充队列。
randrepeat	对于随机IO压力测试,使得ioengine以可预见的方式执行,这样测试结果是可重复的。其值为0或者为1
buffered	如果direct设置为真,则使用缓冲io方式,否则使用非缓冲方式。
rwmixcycle	混合读写切换的时间为每500毫秒切换一次。即0.5秒
unlink	将任务文件unlink,默认为假。当重复执行某个任务的时候,使用unlink节约重复创建文件而浪费的时间。
loops	重复执行该任务的次数,默认为1。可以让某个任务重复执行多次,则可设置该参数
verify	写入文件的时候,fio可以验证文件内容。支持md5、crc校验
prioclass	设置优先级等级。
nice	根据给定的nice值来运行这个job
overwrite	如果是true的话,写一个文件的话,将会覆盖已经存在的数据。如果文件不存在的话,它将会在写阶段开始的时候创建这个文件。
invalidate	Invalidate the buffer/page cache parts for this file prior to starting io. Defaults to true.

这篇关于Linux下fio磁盘的性能工具的部署和使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/542829

相关文章

Python按照24个实用大方向精选的上千种工具库汇总整理

《Python按照24个实用大方向精选的上千种工具库汇总整理》本文整理了Python生态中近千个库,涵盖数据处理、图像处理、网络开发、Web框架、人工智能、科学计算、GUI工具、测试框架、环境管理等多... 目录1、数据处理文本处理特殊文本处理html/XML 解析文件处理配置文件处理文档相关日志管理日期和

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结