[转帖]Linux下fio磁盘的性能工具的部署和使用

linux,fio,磁盘,性能,工具,部署,使用 · 浏览次数 : 0

小编点评

**IO效率优化** **设置** * IO单元大小:默认最小值 * read_iolog:记录 io 完成的延时 * write_iolog:记录 io完成的延时 **IO效率优化** * **设置IO深度**:降低队列填充数量,提高效率 * **使用混合读写**:将读写切换时间,提高效率 * **设置IO缓存大小**:降低读写缓存数量,提高效率 * **使用随机IO压力测试**:模拟可重复的测试结果 **IO效率优化** * **设置IO depth**:降低队列填充数量,提高效率 * **使用块大小**:降低读写块大小,提高效率 * **设置块大小范围**:可以根据任务需求设置块大小范围 * **使用高效读写方式**:例如使用mmap或randread * **设置读写缓存大小**:降低读写缓存数量,提高效率 * **使用IO缓存**:降低读写缓存数量,提高效率 **IO效率优化** * **设置IO depth**:降低队列填充数量,提高效率 * **使用块大小**:降低读写块大小,提高效率 * **设置块大小范围**:可以根据任务需求设置块大小范围 * **使用高效读写方式**:例如使用mmap或randread * **设置读写缓存大小**:降低读写缓存数量,提高效率 * **使用IO缓存**:降低读写缓存数量,提高效率

正文

介绍

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_8k
    

    100%随机写:
    ./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_8k

    100%顺序读:
    ./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 参数介绍:

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

        	
        常用参数	含义
        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,pwrite
        	vsync 基本的readv,writev
        	libaio Linux专有的异步IO。Linux仅支持非buffered IO的队列行为。 性能更好,更节省CPU
        	posixaio glibc posix异步IO
        	solarisaio solaris独有的异步IO
        	windowsaio windows独有的异步IO
        	mmap 文件通过内存映射到用户空间,使用memcpy写入和读出数据
        	splice 使用splice和vmsplice在用户空间和内核之间传输数据
        	syslet-rw 使用syslet 系统调用来构造普通的read/write异步IO
        	sg SCSI generic sg v3 io.可以是使用SG_IO ioctl来同步,或是目标是一个sg字符设备,我们使用read和write执行异步IO
        	null 不传输任何数据,只是伪装成这样。主要用于训练使用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.

          文章知识点与官方知识档案匹配,可进一步学习相关知识
          CS入门技能树Linux入门初识Linux26453 人正在系统学习中

          与[转帖]Linux下fio磁盘的性能工具的部署和使用相似的内容:

          [转帖]Linux下fio磁盘的性能工具的部署和使用

          介绍 fio 功能强大的性能测试工具, 具备多线程、报告清晰、多种引擎。 没有任何基础的,建议看完fio介绍!后继续阅读。 接下来,以ubuntu为例展示安装和使用过程。 准备条件 fio 各个版本下载各个os下fio依赖包 libaio依赖库libaio centos 备用链接 安装 安装liba

          [转帖]​Linux开源存储漫谈(2)IO性能测试利器fio

          fio(Flexible I/O Tester)正是非常常用的文件系统和磁盘 I/O 性能基准测试工具。提供了大量的可定制化选项,可以用来测试,裸盘、一个单独的分区或者文件系统在各种场景下的 I/O 性能,包括了不同块大小、不同 I/O 引擎以及是否使用缓存等场景。 ubuntu安装fio非常简单

          [转帖]磁盘测试----fio

          https://www.bbsmax.com/A/WpdKAgmnJV/ 测试前提 我们在进行测试时,都会分清楚: 测试对象:要区分硬盘、SSD、RAID、SAN、云硬盘等,因为它们有不同的特点 测试指标:IOPS和MBPS(吞吐率),下面会具体阐述 测试工具:Linux下常用Fio、dd工具, W

          [转帖]IO测试工具之fio详解

          目前主流的第三方IO测试工具有fio、iometer和Orion,这三种工具各有千秋。 fio在Linux系统下使用比较方便,iometer在window系统下使用比较方便,Orion是oracle的IO测试软件,可在没有安装oracle数据库的情况下模拟oracle数据库场景的读写。 如下是在Li

          [转帖]linux下 安装了中文版本的,造成sqlplus 连接时出现了乱码

          https://blog.51cto.com/u_11529070/3607380 linux下 安装了中文版本的,造成sqlplus 连接时出现了乱码 如图 一开始以为是LANG 变量的问题 后来发现是NLS_LANG的问题 解决方法: export NLS_LANG="AMERICAN_AMER

          [转帖]Linux下Shell的for循环语句 第一类:数字性循环

          #!/bin/bash for((i=1;i<=10;i++)); do echo $(expr $i \* 3 + 1); done #!/bin/bash for i in $(seq 1 10) do echo $(expr $i \* 3 + 1); done #!/bin/bash for

          [转帖]linux下性能测试工具netperf使用

          https://www.shuzhiduo.com/A/MyJxX2VpJn/ 一、功能简介 netperf是一款针对网络性能的测试工具,主要基于TCP或UDP的传输。根据应用的不同,可以进行批量数据传输(bulk data transfer)模式和请求/应答(request/reponse)模式的

          [转帖]Linux下用dd命令测试硬盘的读写速度

          一、测试写速度: time dd if=/dev/zero of=/tmp/test bs=8k count=1000000 测试结果:565 MB/s 二、测试读速度: time dd if=/tmp/test of=/dev/null bs=8k 测试结果:4.7GB/s 三、测试读写速度: t

          [转帖]Linux下 查看 每个进程占用的网络带宽 - NetHogs

          https://www.cnblogs.com/xuyaowen/p/NetHogs.html 今天在服务器上进行测试程序,发现网速占用比较大,但不是我的程序。可能是其他同学在下载或者上传数据,所以需要看到底是哪个进程。 这时候使用 iftop, vnstat 等命令不能看出具体是哪个进程占用,因为

          [转帖]Linux下查看网络流量常用方法

          (1)使用ifconfig查看网络流量 RX是接收流量,TX是发送流量。 (2)使用watch more /proc/net/dev查看网卡流量,默认是以字节显示 watch使用命令: (3)iftop 下载地址:http://www.tcpdump.org/release/libpcap-0.8.