精华内容
下载资源
问答
  • Fio

    2018-11-29 14:11:56
    运行Fio fio语法如下: fio [options] [jobfile] ... [jobfile] jobfile用于描述fio运行任务的参数设置。一条fio命令中可以执行多个jobfile文件。fio将会逐条执行这些文件,这与在jobfile文件中内部参数区使用...

    运行Fio

    fio语法如下:

    fio [options] [jobfile] ... [jobfile]
    

    jobfile用于描述fio运行任务的参数设置。一条fio命令中可以执行多个jobfile文件。fio将会逐条执行这些文件,这与在jobfile文件中内部参数区使用stonewall参数是一样的。

    如果在job文件中仅仅包含一个job,那么可以仅仅在命令行设置参数即可。命令行参数与job控制全局参数的job参数是一样的。比如,job文件参数iodepth=2,那么对应的命令行选项可以是iodepth 2或者iodepth=2.

    fio --iodepth 2 or fio -iodepth=2

    ; -- start job file --
    [global]
    rw=randread
    size=128m
    [random-writers]
    ioengine=libaio

    也可以使用命令行给出多个job输入,对于每个fio看到的--name,那么fio将以name为名开启一个新的job。跟在--name后面的命令行输入仅适用于name job,直到新的--name输入为止。
    fio --name name1 [parameter] --name name2 [parameter] ... --name nameN [parameter]

    fio如何工作

    让fio模拟想要IO工作负荷的第一步就是编写描述特定setup的job文件。一份job文件可以包含任意数目的线程或者文件。job文件的典型布局:global区域用于定义共享参数,一个或者多个job区域描述job各自需要的参数。当运行时,fio解析job文件,按照job文件描述建立系统任务。如果把一份job自上来下分解开来,大致包含如下基本参数:

    • IO类型
      主要用于定义对文件操作的模式,比如我们可以对文件顺序读取,或者我们也可以进行随机写操作,亦或者读写混杂,顺序与随机混杂以及进行缓冲IO还是直接(raw)IO。
    • 块大小
      定义了我们在进行IO操作的块大小。它可以单个数值也可以一系列块大小。
    • IO大小
      定义了我们打算读或者写的数据量。
    • IO引擎
      定义了我们如何操作IO。我们可以是存储器映射到文件,也可以是常规读写,或使用splice, async IO,甚至是SG(SCSI generic sg)。
    • IO深度
      如果IO引擎是async,IO深度用于定于我们想要维持的队列深度。
    • 目标文件/设备
      定义了我们想把工作负荷分摊到多少文件上。
    • 线程,进程和job同步
      定义了我们需要把工作负荷分摊到多少进程或线程上。

    上述基本参数可以定义一个工作负荷,此外,还有其他参数可以用来修改job运转的其他因素。

    命令行选项


    --debug=type
    使能各种fio动作的详细跟踪类型,type可以是"all",即跟踪fio的所有类型跟踪;也可以是某一个或多个特定类型的组合(用逗号作为分隔符)。
    比如:
    --debug=file,mem 使能文件和存储器调试
    额外的可得的日志选项:

    • process:转储与进程相关的信息
    • file:转储跟文件动作的信息
    • io:转储与IO队列相关的信息
    • mem:转储memory分配相关的信息
    • blktrace:转储与blktrace设置相关的信息
    • verify:转储跟IO验证相关的信息
    • all:开启所有debug选项
    • random:转储与随机偏移生成的信息
    • parse:转储与选项匹配和解析相关的信息
    • diskutil:转储与磁盘利用率更新相关的信息
    • job:x:转储与job x相关的信息
    • mutex:转储与互斥锁开启和关闭ops相关的信息
    • profile:转储与profile扩展相关的信息
    • time:转储与内部时间保持相关的信息
    • rate:转储与IO切换频率相关的信息
    • compress:转储与日志压缩和解压缩的信息
    • ?或者help:显示可用的debug选项

    --parse-only:仅仅解析选项,并不启动任何IO

    --merge-blktrace-only:仅仅合并blktraces,并不启动任何IO

    --output=filename:写输入到filename指定的文件中

    --output-format=format:报告格式可以设置为正常,简洁,json或json+,也可以选定多个格式,选项之间用逗号作为分隔符。简洁模式使用CSV格式,json+ is like json, except it adds a full dump of the latency buckets.

    --bandwidth-log:产生聚合带宽日志

    --minimal:以CSV和分号分隔符格式打印统计信息

    --append-terse:以被弃用,不建议使用
    --terse-version=version:设置简洁模式版本输出格式(默认为3,可选:2,4,5)
    --version:打印版本信息,然后退出
    --help

    Job文件格式

    job文件的格式是经典的初始化文件格式,由方括号包围的名字定义了job名字。job名字可以是任何ascii名字,除了global(它有特殊的含义)。紧随job名字后面的是零个或多个参数序列,每行一个参数,参数用于定义job的行为。如果某一行的第一个字符是";“或”#",那么这一行被认为是注释行。

    global区域([global])用于设置文件中job的默认值。job可以改写global区域的参数,一个job文件可以包含多个global区域。job仅仅受位于自己之上的global区域影响。

    展开全文
  • fio

    2018-10-29 11:24:00
    一、安装http://freshmeat.sourceforge.net/projects/fio上下载fio-2.1.10.tar.gz,版本包见附件解压tar -xvf fio-3.3.tar.gzcd fio-3.3 执行命令:./configuremakemake install 安装libaio-develyum install ...

    一、安装
    http://freshmeat.sourceforge.net/projects/fio上下载fio-2.1.10.tar.gz,版本包见附件
    解压
    tar  -xvf  fio-3.3.tar.gz
    cd  fio-3.3

    执行命令:
    ./configure
    make
    make install

    安装libaio-devel
    yum install libaio-devel

    重新执行:
    #./configure
    #make
    #make install

    直接执行fio测试。
    #fio -ioengine=libaio -filename=fiofile -bs=20k -direct=1 -iodepth=4 -thread -size=300g -rw=randwrite -name=20k_randwrite -numjobs=2 -group_reporting
    如果有报错:是因为没装libaio-devel

    检查libaio和rbd是否存在,存在表示已经安装了libaio和rdb,下面可以看到所有引擎
    [root@ceph1 home]# fio --enghelp
    Available IO engines:
    cpuio
    mmap
    sync
    psync
    vsync
    pvsync
    null
    net
    netsplice
    libaio
    posixaio
    falloc
    e4defrag
    splice
    rbd
    sg
    binject
    二、fio引擎介绍
    参考网址:
    http://blog.yufeng.info/archives/677
    ioengine=str
    Defines how the job issues I/O. The following types are defined:
    sync
    Basic read(2) or write(2) I/O. fseek(2) is used to position the I/O location.
    psync
    Basic pread(2) or pwrite(2) I/O.
    vsync
    Basic readv(2) or writev(2) I/O. Will emulate queuing by coalescing adjacents IOs into a single submission.
    libaio
    Linux native asynchronous I/O. This ioengine defines engine specific options.
    posixaio
    POSIX asynchronous I/O using aio_read(3) and aio_write(3).
    solarisaio
    Solaris native asynchronous I/O.
    windowsaio
    Windows native asynchronous I/O.
    mmap
    File is memory mapped with mmap(2) and data copied using memcpy(3).
    splice
    splice(2) is used to transfer the data and vmsplice(2) to transfer data from user-space to the kernel.
    syslet-rw
    Use the syslet system calls to make regular read/write asynchronous.
    sg
    SCSI generic sg v3 I/O. May be either synchronous using the SG_IO ioctl, or if the target is an sg character device, we use read(2) and write(2) for asynchronous I/O.
    null
    Doesn’t transfer any data, just pretends to. Mainly used to exercise fio itself and for debugging and testing purposes.
    net
    Transfer over the network. The protocol to be used can be defined with the protocol parameter. Depending on the protocol, filename, hostname, port, or listen must be specified. This ioengine defines engine specific options.
    netsplice
    Like net, but uses splice(2) and vmsplice(2) to map data and send/receive. This ioengine defines engine specific options.
    cpuio
    Doesn’t transfer any data, but burns CPU cycles according to cpuload and cpucycles parameters.
    guasi
    The GUASI I/O engine is the Generic Userspace Asynchronous Syscall Interface approach to asycnronous I/O.

    个别中文解释:
    默认值是sync同步阻塞I/O,
    libaio是Linux的native异步I/O
    io引擎使用pync方式
    sync:采用read,write,使用fseek定位读写位置。
    psync:采用pread、pwrite进行文件读写操作
    vsync:采用readv(2) orwritev(2)进行文件读写操作
    三、各引擎使用方法
    1、fio-vsync:
    vsync:采用readv(2) orwritev(2)进行文件读写操作
    fio -filename=/mnt/data/112.log -direct=1 -iodepth 1 -thread -rw=randread -ioengine=vsync -bs=4k -size=1G -numjobs=64 -runtime=10 -group_reporting -name=file

    2、sync:采用read,write,使用fseek定位读写位置。同步阻塞I/O,
    fio -filename=/mnt/data/111.log -ioengine=sync -direct=1 -rw=randwrite -bs=8k -size=1G -numjobs=8 -runtime=10-group_reporting -name=fio_test

    3、psync对磁盘进行读写(lsblk),如下查出来就是/dev/vdb
    [root@host111 data]# lsblk
    NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
    vda 252:0 0 75G 0 disk
    ├─vda1 252:1 0 200M 0 part /boot
    └─vda2 252:2 0 74.8G 0 part
    ├─systemvg-swaplv (dm-0) 253:0 0 10G 0 lvm [SWAP]
    ├─systemvg-rootlv (dm-1) 253:1 0 8G 0 lvm /
    ├─systemvg-homelv (dm-2) 253:2 0 2G 0 lvm /home
    ├─systemvg-varlv (dm-3) 253:3 0 6G 0 lvm /var
    ├─systemvg-tmplv (dm-4) 253:4 0 2G 0 lvm /tmp
    ├─systemvg-optlv (dm-5) 253:5 0 30G 0 lvm /opt
    └─systemvg-usrlv (dm-6) 253:6 0 10G 0 lvm /usr
    vdb 252:16 0 100G 0 disk /mysql
    vdc 252:32 0 500G 0 disk /mnt/data

    或者对一个文件进行写:
    fio -filename=/mnt/data/112.log -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=4k -size=1G -numjobs=64 -runtime=10 -group_reporting -name=file

    4、posixaio:glibc POSIX asynchronous I/O using aio_read(3) and aio_write(3).
    fio -name=/mnt/data/11.log -direct=0 -iodepth=96 -rw=randread -ioengine=posixaio -bs=4k -size=1G -numjobs=64 -runtime=10 -group_reporting

    5、libaio:Linux native asynchronous I/O.Linux的native异步I/O
    fio -filename=/mnt/data/112.log -direct=1 -iodepth 1 -thread -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=64 -runtime=10 -group_reporting -name=file

    6、mmap:File is memory mapped with mmap(2) and data copied using memcpy(3).
    fio -filename=/mnt/data/112.log -direct=1 -iodepth 1 -thread -rw=randread -ioengine=mmap -bs=4k -size=1G -numjobs=64 -runtime=10 -group_reporting -name=file

    7、splice: splice(2) is used to transfer the data and vmsplice(2) to transfer data from user-space to the kernel.
    fio -filename=/mnt/data/112.log -direct=1 -iodepth 1 -thread -rw=randread -ioengine=splice -bs=4k -size=1G -numjobs=64 -runtime=10 -group_reporting -name=file

    8、falloc
    fio -filename=/mnt/data/112.log -direct=1 -iodepth 1 -thread -rw=randread -ioengine=falloc -bs=4k -size=1G -numjobs=64 -runtime=10 -group_reporting -name=file

    9、pvsync:
    fio -filename=/mnt/data/112.log -direct=1 -iodepth 1 -thread -rw=randread -ioengine=pvsync -bs=4k -size=1G -numjobs=64 -runtime=10 -group_reporting -name=file

    引擎参照:没有举例的可能执行有问题,或者是针对块存储的
    binject:只针对block devices
    sg:针对块
    splice
    e4defrag:Option inplace: missing long option name
    falloc
    posixaio
    libaio
    net:fio: network IO can't be random
    netsplice
    null
    sync
    psync
    vsync
    pvsync
    mmap
    cpuio
    syslet-rw

    使用配置文件执行:
    参考:https://segmentfault.com/a/1190000003880571
    如下为rdb测试的配置文件:执行:fio 256k-randread.fio
    [root@host111 fio_cfg]# vi 256k-randread.fio
    [randread-256k]
    description="randread test with block size of 256k-test-poolimages1"
    ioengine=rbd
    clientname=admin
    pool=test-pool
    rbdname=test-poolimages1
    iodepth=8
    runtime=300
    rw=randread
    bs=256k
    numjobs=1
    size=5g
    #write_iops_log=write_iops
    #log_avg_msec=1000
    #filename=/data/osd.0/1.txt
    write_bw_log=rw
    write_lat_log=rw
    write_iops_log=rw

    [randread-256k]
    description="randread test with block size of 256k-test-poolimages2"
    ioengine=rbd
    clientname=admin
    pool=test-pool
    rbdname=test-poolimages2
    iodepth=8
    runtime=300
    rw=randread
    bs=256k
    numjobs=1
    size=5g
    #write_iops_log=write_iops
    #log_avg_msec=1000
    #filename=/data/osd.0/1.txt
    write_bw_log=rw
    write_lat_log=rw
    write_iops_log=rw
    四、补充
    1、安装插件:
    yum install gnuplot

    2.输出bw,lat和iops数据并画图
    fio安装完后自带有一个高级脚本fio_generate_plots能够根据fio输出的数据进行画图。操作流程如下:
    fio的输出日志主要包含三种:bw,lat和iops,设置这三种的参数如下:
    write_bw_log=rw
    w
    write_lat_log=rw
    w
    write_iops_log=rw


    如:fio -filename=/mnt/data/112.log -direct=1 -iodepth 1 -thread -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=10 -group_reporting -name=file -write_bw_log=rww -write_lat_log=rww -write_iops_log=rw
    最后生成:
    [root@host111 fio_cfg]# ls
    psync randrw.fio read.fio rw_iops.1.log rww_clat.1.log rww_slat.1.log
    randread.fio randwrite.fio rw.fio rww_bw.1.log rww_lat.1.log write.fio
    需要将$1.log改为*.log
    [root@host111 fio_cfg]# mv rw_iops.1.log rw_iops.log
    [root@host111 fio_cfg]# mv rww_bw.1.log rww_bw.log
    [root@host111 fio_cfg]# mv rww_clat.1.log rww_clat.log
    [root@host111 fio_cfg]# mv rww_lat.1.log rww_lat.log
    [root@host111 fio_cfg]# mv rww_slat.1.log rww_slat.log
    [root@host111 fio_cfg]# ls
    psync randrw.fio read.fio rw_iops.log rww_clat.log rww_slat.log
    randread.fio randwrite.fio rw.fio rww_bw.log rww_lat.log write.fio

    或者使用下面脚本进行修改:
    这里需要强调的一点是,后面接的参数rw,是输出日志文件名的prefix,如最终会生成的日志文件如下:
    rw_iops.log

    rw_clat.log

    rw_slat.log

    rw_lat.log

    rw_bw.log


    这个参数在后面画图的时候也要用到。
    for i in clat lat slat bw iops;do mv rbd_$i.1.log rbd_$i.log;done

    3、画图
    前提是还需要安装好gnuplot,然后使用下面的命令即可自动画图:
    root@ubuntu:/tmp> fio_generate_plots bw


    发现没有,fio_generate_plots接受的唯一参数就是这个日志文件名的prefix。
    本例中生成的图片文件有:
    bw-bw.svg 
    bw-clat.svg 
    bw-iops.svg 
    bw-lat.svg 
    bw-slat.svg

    下载到本地,需要用谷歌浏览器才能打开,图片软件打不开

    转载于:https://www.cnblogs.com/AgainstTheWind/p/9869643.html

    展开全文
  • FIO

    2018-10-17 16:02:16
    FIO相关知识汇总 置顶 2018年10月17日 14:16:53 Rudy,Zhao 阅读数:41 <span class="tags-box artic-tag-box&...

    1.安装

    a.下载地址:http://freshmeat.sourceforge.net/projects/fio/
    b.安装两个插件
    #yum install libaio*
    #yum install zilb*
    c.编译安装
    #tar -xvf fio-2.1.10.tar.gz
    #cd fio-2.1.10
    #./configure
    #make
    #make install

    2.fio执行脚本顺序

    1)Secure erase the drive
    2)Prefill the drive with Sequential Write (128K Sequential Write QD=32 / size=100% with loops=1 / numjobs=1)
    3)128K 100% Sequential Write (ramp_time=60sec / runtime=2h / QD=32 / numjobs=1)
    4)128K 100% Sequential Read (ramp_time=60sec / runtime=2h / QD=32 / numjobs=1)
    5)Prefill the drive with randwrite (4K randwrite QD=32 / runtime=3hr / numjobs=1)
    6)4K 100% Random Read (ramp_time=60sec / runtime=2h / QD=32 / numjobs=1)
    7) 4K 100% Random Write (ramp_time=60sec / runtime=2h / QD=32 / numjobs=1)
    注意事项:
    a.硬盘应直接主板,但如通过Raid Card连接应将硬盘设置为JBOD。
    b.硬盘测试前一定要进行安全擦除。
    c.顺序读、顺序写前可以不添加稳态处理。
    d.随机读、随机写前一定要有randwrite 2h左右的稳态处理,如果没有添加会影响Random write。下图就是在随机读写前未加稳态处理时,rand_write iops的图
    在这里插入图片描述
    e.测试时间runime的值应不低于1h,如果时间很短没有测试实际意义。

    3.执行脚本,以SATA接口硬盘为例:

    #!/bin/bash
    #Script of precondition:128K IOPS
    fio --ioengine=libaio --direct=1 --thread --norandommap --filename=/dev/sda --name=init_seq --output=init_seq1.log --rw=write --bs=128k --numjobs=1 --iodepth=32 --loops=1
    

    #128k Seq Write
    fio --ioengine=libaio --randrepeat=0 --norandommap --thread --direct=1 --group_reporting --name=mytest --ramp_time=60 --runtime=7200 --time_based --numjobs=1 --iodepth=32 --filename=/dev/sda --rw=write --bs=128k --output=128K_seqW.log --log_avg_msec=1000 --write_iops_log=128K_seqW_iops.log --write_lat_log=128K_seqW_lat.log --write_bw_log=128K_seqW_bw.log
    #128k Seq Read
    fio --ioengine=libaio --randrepeat=0 --norandommap --thread --direct=1 --group_reporting --name=mytest --ramp_time=60 --runtime=7200 --time_based --numjobs=1 --iodepth=32 --filename=/dev/sda --rw=read --bs=128k --output=128K_seqR.log --log_avg_msec=1000 --write_iops_log=128K_seqR_iops.log --write_lat_log=128K_seqR_lat.log --write_bw_log=128K_seqR_bw.log

    #randwrite prepare
    fio --ioengine=libaio --direct=1 --thread --norandommap --filename=/dev/sda --name=init_seq --output=init_seq2.log --rw=randwrite --bs=4k --numjobs=1 --iodepth=32 --loops=2 #about 2h

    #4k Random Read
    fio --ioengine=libaio --randrepeat=0 --norandommap --thread --direct=1 --group_reporting --name=mytest --ramp_time=60 --runtime=7200 --time_based --numjobs=1 --iodepth=32 --filename=/dev/sda --rw=randread --bs=4k --output=4K_randR.log --log_avg_msec=1000 --write_iops_log=4K_randR_iops.log --write_lat_log=4K_randR_lat.log
    #4k Random Write
    fio --ioengine=libaio --randrepeat=0 --norandommap --thread --direct=1 --group_reporting --name=mytest --ramp_time=60 --runtime=7200 --time_based --numjobs=1 --iodepth=32 --filename=/dev/sda --rw=randwrite --bs=4k --output=4K_randW.log --log_avg_msec=1000 --write_iops_log=4K_randW_iops.log --write_lat_log=4K_randW_lat.log

    4.数据分析

    顺序读、顺序写主要看BW,随机读、随机写主要看IOPS.

    5.fio常用参数详解

    a.loops=int
    重复运行某个job多次,默认是1。
    loops与runtime是两个不能同时存在的两个参数,loops主要是定义硬盘执行的圈数,而runtime只是定义fio执行的时间。
    b.time_based
    如果设置的话,即使file已被完全读写或写完,也要执行完runtime规定的时间。它是通过循环执行相同的负载来实现的,与runtime相对应。
    c.ramp_time=time
    设定在记录任何性能信息之前要运行特定负载的时间。这个用来等性能稳定后,再记录日志结果,因此可以减少生成稳定的结果需要的运行时间。
    d.randrepeat=bool
    对于随机IO负载,配置生成器的种子,使得路径是可以预估的,使得每次重复执行生成的序列是一样的。

    如果无–randrepeat=0这个参数不会影响seqread,但会影响seqwrite,randwrite,randread.

    在这里插入图片描述
    e.norandommap
    一般情况下,fio在做随机IO时,将会覆盖文件的每一个block.如果这个选项设置的话,fio将只是获取一个新的随机offset,而不会查询过去的历史。这意味着一些块可能没有读或写,一些块可能要读/写很多次。在个选项与verify=互斥,并只有多个块大小(bsrange=)正在使用,因为fio只会记录完整的块的重写。
    f.thread
    fio默认会使用fork()创建job,如果这个选项设置的话,fio将使用pthread_create来创建线程。
    在这里插入图片描述
    g.direct=bool
    direct=1 测试过程绕过机器自带的buffer。使测试结果更真实。
    h.group_reporting
    如果‘numjobs’设置的话,我们感兴趣的可能是打印group的统计值,而不是一个单独的job。这在‘numjobs’的值很大时,一般是设置为true的,可以减少输出的信息量。如果‘group_reporting’设置的话,fio将会显示最终的per-groupreport而不是每一个job都会显示。
    i.numjobs=int
    创建特定数目的job副本。可能是创建大量的线程/进程来执行同一件事。我们将这样一系列的job,看作一个特定的group。

    参考:https://www.itzhoulin.com/2015/12/24/fio-man-guide/

    展开全文
  • Fio was originally written to save me the hassle of writing special test case programs when I wanted to test a specific workload, either for performance reasons or to find/reproduce a bug. The process...
  • FIO详解

    万次阅读 2018-10-17 14:16:53
    fio - Flexible IO Tester 1.安装 a.下载地址:http://freshmeat.sourceforge.net/projects/fio/ b.安装两个插件 #yum install libaio* #yum install zilb* c.编译安装 #tar -xvf fio-2.1.10.tar.gz #cd fio-2.1.10 ...

    fio - Flexible IO Tester

    一、服务器配置:

    由于我们想通过fio得到SSD真实的参数信息,因此我们需要服务器BIOS一些参数的配合,以便能更好的体现硬盘的性能。
    在这里插入图片描述
    以华为1288HV5为例:
    在这里插入图片描述

    二、fio

    1.安装

    a.下载地址:http://freshmeat.sourceforge.net/projects/fio/
    b.安装两个插件
    #yum install libaio*
    #yum install zlib*
    c.编译安装
    #tar -xvf fio-2.1.10.tar.gz
    #cd fio-2.1.10
    #./configure
    #make
    #make install

    备注:
    最新的fio可以在https://github.com/axboe/fio进行下载,但可能会由于系统自带的gcc版本较低导致无法顺利安装。
    升级gcc后即可顺利安装。升级gcc请参考:https://blog.csdn.net/weixin_40343504/article/details/107843661

    2.fio执行脚本顺序

    1)Secure erase the drive
    2)Prefill the drive with Sequential Write (128K Sequential Write QD=32 / size=100% with loops=2 / numjobs=1)
    3)128K 100% Sequential Write (ramp_time=60sec / runtime=2h / QD=32 / numjobs=1)
    4)128K 100% Sequential Read (ramp_time=60sec / runtime=2h / QD=32 / numjobs=1)

    5)Prefill the drive with randwrite (128K randwrite QD=32 / runtime=3hr / numjobs=1)
    6) 4K 100% Random Write (ramp_time=60sec / runtime=2h / QD=32 / numjobs=1)
    7)4K 100% Random Read (ramp_time=60sec / runtime=2h / QD=32 / numjobs=1)

    注意事项:
    a.硬盘应直连主板这样测出来的数据更加真实,但如SATA通过Raid Card连接应将硬盘设置为JBOD。
    b.硬盘测试前一定要进行安全擦除。
    c.顺序读、顺序写前可以不添加稳态处理。
    d.随机读、随机写前一定要有randwrite 2h(这个时间与硬盘容量大小有关,4T以下设置2个小时应该没有问题)左右的稳态处理,如果没有添加会影响Random write。下图就是在随机读写前未加稳态处理时,rand_write iops的图
    在这里插入图片描述
    e.测试时间runime的值应尽量不低于1h,如果时间很短没有测试实际意义。

    3.执行脚本,以SATA接口硬盘为例:

    ./SATA.sh sdb

    #**************************Script of precondition*************************#
    echo "$DEV precondition seq write ready"
    date
    fio --ioengine=libaio --direct=1 --thread --norandommap --filename=/dev/"$DEV" --name="$DEV"_init_seq --output="$DEV"_init_seq.log --rw=write --bs=128k --numjobs=1 --iodepth=128 --loops=2
    
    #**************************Script of seq*************************#
    for WL2 in write read
    do
    	for jobs2 in 1
    	do
    		for QD2 in 128
    		do
    			for runt2 in 1800
    			do
    				for block2 in 128k
    				do
    
    echo "$DEV rw_${WL2}  bs_${block2} nujobs_${jobs2} QD_${QD2} test      "
    date
    issdcm -drive_index 0 -smart >"$DEV"_${block2}_${WL2}_${jobs2}_${QD2}_smart.log
    fio --ioengine=libaio --randrepeat=0 --norandommap --thread --direct=1 --group_reporting --name=mytest --ramp_time=60 --runtime=${runt2} --time_based --numjobs=${jobs2} --iodepth=${QD2} --filename=/dev/"$DEV" --rw=${WL2} --bs=${block2} --output="$DEV"_${block2}_${WL2}_${jobs2}_${QD2}.log --log_avg_msec=1000 --write_iops_log="$DEV"_${block2}_${WL2}_${jobs2}_${QD2}_iops --write_lat_log="$DEV"_${block2}_${WL2}_${jobs2}_${QD2}_lat --write_bw_log="$DEV"_${block2}_${WL2}_${jobs2}_${QD2}_bw
    				done
    			done
    		done
    	done
    done
    #**************************Script of precondition*************************#
    echo "$DEV precondition random write ready"
    date
    fio --ioengine=libaio --direct=1 --thread --norandommap --filename=/dev/"$DEV" --name="$DEV"_init_random --output="$DEV"_init2_random.log --rw=randwrite --bs=128k --numjobs=4 --iodepth=64 --time_based --ramp_time=60 --runtime=7200
    #**************************Script of random*************************#
    for WL in randwrite randread
    do
    	for jobs in 4
    	do
    		for QD in 64
    		do
    			for runt in 1800
    			do
    				for block in 8k 4k
    				do	
    			
    echo "$DEV rw_${WL} bs_${block} nujobs_${jobs} QD_${QD} test    "
    date
    issdcm -drive_index 0 -smart >"$DEV"_${block}_${WL}_${jobs}_${QD}_smart.log
    fio --ioengine=libaio --randrepeat=0 --norandommap --thread --direct=1 --group_reporting --name=mytest --ramp_time=60 --runtime=${runt} --time_based --numjobs=${jobs} --iodepth=${QD} --filename=/dev/"$DEV" --rw=${WL} --bs=${block} --output="$DEV"_${block}_${WL}_${jobs}_${QD}.log --log_avg_msec=1000 --write_iops_log="$DEV"_${block}_${WL}_${jobs}_${QD}_iops --write_lat_log="$DEV"_${block}_${WL}_${jobs}_${QD}_lat
    				done
    			done
    		done
    	done
    done
    
    #**************************Script of randrw*************************#
    for WL1 in randrw
    do
    	for jobs1 in 4
    	do
    		for QD1 in 64
    		do
    			for runt1 in 1800
    			do
    				for block1 in 8k 4k
    				do	
    			
    echo "$DEV rw_${WL1}  bs_${block1} nujobs_${jobs1} QD_${QD1} test    "
    date
    issdcm -drive_index 0 -smart >"$DEV"_${block1}_${WL1}_${jobs1}_${QD1}_smart.log
    fio --ioengine=libaio --randrepeat=0 --norandommap --thread --direct=1 --group_reporting --name=mytest --ramp_time=60 --runtime=${runt1} --time_based --numjobs=${jobs1} --iodepth=${QD1} --filename=/dev/"$DEV" --rw=${WL1} --rwmixread=70 --bs=${block1} --output="$DEV"_${block1}_${WL1}_${jobs1}_${QD1}.log --log_avg_msec=1000 --write_iops_log="$DEV"_${block1}_${WL1}_${jobs1}_${QD1}_iops --write_lat_log="$DEV"_${block1}_${WL1}_${jobs1}_${QD1}_lat
    				done
    			done
    		done
    	done
    done
    
    

    4.数据分析

    顺序读、顺序写主要看BW,随机读、随机写主要看IOPS.
    1)怎么看lat分布?

    bw (KB  /s): min=   71, max=  251, per=0.36%, avg=154.84, stdev=18.29
    
        lat (usec) :   2= 0.01%,   4=0.01%,  10=0.01%,   20=0.01%, 50=51.41%
        lat (usec) : 100=48.53%, 250=0.06%, 500=0.01%, 1000=0.01%
        lat (msec) :   2= 0.01%,   4=0.01%,  10=0.01%,   20=0.01%
    

    这组数据表示latency的分布,说明了51.41%的request延迟小于50微秒,48.53%的延迟小于100微秒(但是大于50微秒),以此类推
    其他待续:
    参考:https://blog.csdn.net/feilianbb/article/details/50497845

    2)fio log收集
    请参考<利用Python3.4+收集fio测试结果>
    https://blog.csdn.net/weixin_40343504/article/details/97886537

    5.fio常用参数详解

    a.loops=int
    重复运行某个job多次,默认是1。
    loops与runtime是两个不能同时存在的两个参数,loops主要是定义硬盘执行的圈数,而runtime只是定义fio执行的时间。
    b.time_based
    如果设置的话,即使file已被完全读写或写完,也要执行完runtime规定的时间。它是通过循环执行相同的负载来实现的,与runtime相对应。
    c.ramp_time=time
    设定在记录任何性能信息之前要运行特定负载的时间。这个用来等性能稳定后,再记录日志结果,因此可以减少生成稳定的结果需要的运行时间。
    d.randrepeat=bool
    对于随机IO负载,配置生成器的种子,使得路径是可以预估的,使得每次重复执行生成的序列是一样的。

    如果无–randrepeat=0这个参数不会影响seqread,但会影响seqwrite,randwrite,randread.

    在这里插入图片描述
    e.norandommap
    一般情况下,fio在做随机IO时,将会覆盖文件的每一个block.如果这个选项设置的话,fio将只是获取一个新的随机offset,而不会查询过去的历史。这意味着一些块可能没有读或写,一些块可能要读/写很多次。在个选项与verify=互斥,并只有多个块大小(bsrange=)正在使用,因为fio只会记录完整的块的重写。
    f.thread
    fio默认会使用fork()创建job,如果这个选项设置的话,fio将使用pthread_create来创建线程。
    在这里插入图片描述
    g.direct=bool
    direct=1 测试过程绕过机器自带的buffer。使测试结果更真实。
    h.group_reporting
    如果‘numjobs’设置的话,我们感兴趣的可能是打印group的统计值,而不是一个单独的job。这在‘numjobs’的值很大时,一般是设置为true的,可以减少输出的信息量。如果‘group_reporting’设置的话,fio将会显示最终的per-groupreport而不是每一个job都会显示。
    i.numjobs=int
    创建特定数目的job副本。可能是创建大量的线程/进程来执行同一件事。我们将这样一系列的job,看作一个特定的group。

    参考:https://www.itzhoulin.com/2015/12/24/fio-man-guide/

    展开全文
  • fio安装,通过本文档,在生产环境中,磁盘I/O如何进行压测,掌握fio压测方法与如何书写fio压测报告
  • fio-readthfdasf

    2021-02-08 15:36:00
    fio-readthfdasf
  • fio-工作负载 fio 工作负载的集合。
  • Fio enhancements

    2020-12-09 01:18:31
    <ul><li>Wait for fio server VMs to be up before starting fio tests</li><li>Fix blocksizes in example CRs - solves issues for me</li></ul>该提问来源于开源项目:cloud-bulldozer/benchmark-operator...
  • 使用Docsy Jekyll的FIO Devhup入门 该网站是由。可以在找到文档。 FIO开发人员中心入门 网站布局: FIO-DEVHUB |-- _data (The yaml data used by the site) |-- _docs (The documentation pages) |-- _...
  • fio 压测

    2020-02-11 19:22:27
    os: centos 7.4 版本 # cat /etc/centos-release CentOS Linux release 7.4.1708 (Core) fio # yum install -y fio libaio libaio-devel # which fio /usr/bin/fio ...fio [options] [job optio...
  • fio calc

    2020-12-04 16:37:30
    <div><p>Property calculator for <code>fio, resolves #273 <p>examples: <p>Calculating an area as <code>new_area</code> property using shapely <pre><code> $ fio cat tests/data/coutwildrnp.shp | fio ...
  • fio_tests 用于自动化 fio 测试的 Python 脚本
  • Fio p

    2020-12-08 22:43:14
    <div><p>This adds fio parameters to result.json, so they can be imported into ES. This will allow the pbench dashboard to better organize results for comparisons.</p><p>该提问来源于开源项目:...
  • grav-plugin-fioFio银行帐户的GRAV插件

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,860
精华内容 744
关键字:

fio