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

相关文章

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1