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

相关文章

如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件

《如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件》本文介绍了如何使用Docker部署FTP服务器和Nginx,并通过HTTP访问FTP中的文件,通过将FTP数据目录挂载到N... 目录docker部署FTP和Nginx并通过HTTP访问FTP里的文件1. 部署 FTP 服务器 (

MySQL 日期时间格式化函数 DATE_FORMAT() 的使用示例详解

《MySQL日期时间格式化函数DATE_FORMAT()的使用示例详解》`DATE_FORMAT()`是MySQL中用于格式化日期时间的函数,本文详细介绍了其语法、格式化字符串的含义以及常见日期... 目录一、DATE_FORMAT()语法二、格式化字符串详解三、常见日期时间格式组合四、业务场景五、总结一、

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

mysql线上查询之前要性能调优的技巧及示例

《mysql线上查询之前要性能调优的技巧及示例》文章介绍了查询优化的几种方法,包括使用索引、避免不必要的列和行、有效的JOIN策略、子查询和派生表的优化、查询提示和优化器提示等,这些方法可以帮助提高数... 目录避免不必要的列和行使用有效的JOIN策略使用子查询和派生表时要小心使用查询提示和优化器提示其他常

Python中配置文件的全面解析与使用

《Python中配置文件的全面解析与使用》在Python开发中,配置文件扮演着举足轻重的角色,它们允许开发者在不修改代码的情况下调整应用程序的行为,下面我们就来看看常见Python配置文件格式的使用吧... 目录一、INI配置文件二、YAML配置文件三、jsON配置文件四、TOML配置文件五、XML配置文件

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

Ubuntu 22.04 服务器安装部署(nginx+postgresql)

《Ubuntu22.04服务器安装部署(nginx+postgresql)》Ubuntu22.04LTS是迄今为止最好的Ubuntu版本之一,很多linux的应用服务器都是选择的这个版本... 目录是什么让 Ubuntu 22.04 LTS 变得安全?更新了安全包linux 内核改进一、部署环境二、安装系统

MySQL InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

《MySQLInnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据》mysql的ibdata文件被误删、被恶意修改,没有从库和备份数据的情况下的数据恢复,不能保证数据库所有表数据... 参考:mysql Innodb表空间卸载、迁移、装载的使用方法注意!此方法只适用于innodb_fi

JAVA集成本地部署的DeepSeek的图文教程

《JAVA集成本地部署的DeepSeek的图文教程》本文主要介绍了JAVA集成本地部署的DeepSeek的图文教程,包含配置环境变量及下载DeepSeek-R1模型并启动,具有一定的参考价值,感兴趣的... 目录一、下载部署DeepSeek1.下载ollama2.下载DeepSeek-R1模型并启动 二、J

Python中conda虚拟环境创建及使用小结

《Python中conda虚拟环境创建及使用小结》本文主要介绍了Python中conda虚拟环境创建及使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录0.前言1.Miniconda安装2.conda本地基本操作3.创建conda虚拟环境4.激活c