fio 使用总结

近期进行存储分布式存储性能测试,选择fio进行测试性能,fio测试工具支持同步(pread/pwrite)和异步(libaio)FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,包括:sync,mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio 等等。 
fio 官网地址:http://freshmeat.net/projects/fio/

一,FIO安装 
yum install fio -y

二,测试案例介绍:
##############################  同步i/o   ##################################################################3
#同步i/o、顺序读:
fio -filename=/dev/rbd2 -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=50G -numjobs=30 -runtime=1000 -group_reporting -name=read-psync >read-psync.txt

#同步i/o、顺序写:
fio -filename=/dev/rbd2 -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=50G -numjobs=30 -runtime=1000 -group_reporting -name=write-psync >write-psync.txt

#同步i/o、顺序混合读写:
fio -filename=/dev/rbd2 -direct=1 -iodepth 1 -thread -rw=readwrite -rwmixread=50 -ioengine=psync -bs=16k -size=50G -numjobs=30 -runtime=1000 -group_reporting -name=>rw-readwrite-psync.txt

#同步i/o、随机读: 
fio -filename=/dev/rbd2 -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=16k -size=50G -numjobs=30 -runtime=1000 -group_reporting -name=randread-psync >randread-psync.txt

#同步i/o、随机写: 
fio -filename=/dev/rbd2 -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=50G -numjobs=30 -runtime=1000 -group_reporting -name=randwrite-psync >randwrite-psync.txt

#同步i/o、随机混合读写: 
fio -filename=/dev/rbd2 -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=50 -ioengine=psync -bs=16k -size=50G -numjobs=30 -runtime=100 -group_reporting -ioscheduler=noop -name=randrw-psync >randrw-psync.txt

##############################  异步 i/o   ##################################################################3

#异步 i/o、顺序读: 
fio -filename=/dev/rbd2 -direct=1 -iodepth 1 -thread -rw=read -ioengine=libaio -bs=16k -size=50G -numjobs=30 -runtime=1000 -group_reporting -name=read-libaio >read-libaio.txt

#异步 i/o、顺序写:
fio -filename=/dev/rbd2 -direct=1 -iodepth 1 -thread -rw=write -ioengine=libaio -bs=16k -size=50G -numjobs=30 -runtime=1000 -group_reporting -name=write-libaio >write-libaio.txt

#异步 i/o、顺序混合读写:
fio -filename=/dev/rbd2 -direct=1 -iodepth 1 -thread -rw=readwrite -rwmixread=50 -ioengine=libaio -bs=16k -size=50G -numjobs=30 -runtime=1000 -group_reporting -name=rw-readwrite-libaio >rw-readwrite-psync.txt

#异步 i/o、随机读: 
fio -filename=/dev/rbd2 -direct=1 -iodepth 1 -thread -rw=randread -ioengine=libaio -bs=16k -size=50G -numjobs=30 -runtime=1000 -group_reporting -name=randread-libaio >randread-libaio.txt

#异步 i/o、随机写: 
fio -filename=/dev/rbd2 -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=libaio -bs=16k -size=50G -numjobs=30 -runtime=1000 -group_reporting -name=randwrite-libaio >randwrite-libaio.txt

#异步 i/o、随机混合读写: 
fio -filename=/dev/rbd2 -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=50 -ioengine=libaio -bs=16k -size=50G -numjobs=30 -runtime=100 -group_reporting -ioscheduler=noop -name=randrw-libaio >randrw-libaio.txt

说明: 
filename=/dev/rbd2 测试文件名称,需要测试的盘的某目录。 
direct=1 测试过程绕过机器自带的buffer。使测试结果更真实。 
}
read 顺序读
write 顺序写
randwrite 随机写
randread 随机读
rw,readwrite 顺序混合读写
randrw 随机混合读写
}
bs=16k 单次io的块文件大小为16k 
bsrange=512-2048 同上,提定数据块的大小范围 
size=5g 本次的测试文件大小为5g,以每次4k的io进行测试。 
numjobs=30 本次的测试线程为30. 
runtime=1000 测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止。 
ioengine=psync io引擎使用pync方式 
rwmixread=30  在混合读写的模式下,读占30% ,默认%50,两个参数同时使用,后者覆盖第一
rwmixwrite=30 在混合读写的模式下,写占30% ,默认%50
group_reporting 关于显示结果的,汇总每个进程的信息。 
lockmem=1g 只使用1g内存进行测试。 
zero_buffers 用0初始化系统buffer。 
nrfiles=8 每个进程生成文件的数量。 
ioscheduler 尝试切换设备托管文件指定的I / O调度器。
psync  同步i/o测试
libaio  异步i/o测试
libaio的读写过程简单说来就是你发出一个读写请求,然后你可以开始做其他事情,当读写过程结束时libaio会通知你你的这次请求已经完成

iodepth_low=int
Low watermark indicating when to start filling the queue again. Default: iodepth.

direct=bool
If true, use non-buffered I/O (usually O_DIRECT). Default: false.

fsync=int
How many I/Os to perform before issuing an fsync(2) of dirty data. If 0, don’t sync. Default: 0.

这几个参数在libaio的引擎下的作用,文档写的挺明白,但容我再罗嗦下IO请求的流程:

libaio引擎会用这个iodepth值来调用io_setup准备个可以一次提交iodepth个IO的上下文,同时申请个io请求队列用于保持IO。
 在压测进行的时候,系统会生成特定的IO请求,往io请求队列里面扔,当队列里面的IO个数达到iodepth_batch值的时候,就调用io_submit批次提交请求,然后开始调用io_getevents开始收割已经完成的IO。 
 每次收割多少呢?由于收割的时候,超时时间设置为0,所以有多少已完成就算多少,最多可以收割iodepth_batch_complete值个。随着收割,IO队列里面的IO数就少了,那么需要补充新的IO。 
 什么时候补充呢?当IO数目降到iodepth_low值的时候,就重新填充,保证OS可以看到至少iodepth_low数目的io在电梯口排队着。

结果总结:
例如:
read : io(测试了1G的数据)=1024.0MB, bw(带宽)=139643KB/s, iops(每秒钟的IO数)=136 , runt(总运行时间)=  7509msec

ioengine.list.txt
read
write
readwrite
randread
randwrite
randrw

二,测试案例介绍:
[[email protected] cephtest]# more fio-test.sh 
#!/bin/sh
FILENAME=/dev/rbd2
#RW=$(cat ioengine.list.txt)
PIOENGINE=psync
LIOENGINE=libaio
BS=16k
SIZE=1G
NUMJOBS=30
RUNTIME=1000
NAME=$PIOENGINE.$(date +%Y%m%d)
NAME1=$LIOENGINE.$(date +%Y%m%d)

echo "###########$(date)###########同步i/o########################################" >iotest.result.$NAME.txt
for i in $(cat ./ioengine.list.txt);do 
echo ------$i.$NAME--begin--$(date)----- >>iotest.result.$NAME.txt;
fio -filename=$FILENAME -direct=1 -iodepth 1 -thread -rw=$i -ioengine=$IOENGINE -bs=$BS -size=$SIZE -numjobs=$NUMJOBS -runtime=$RUNTIME -group_reporting -name=$i.$NAME >>iotest.result.$NAME.txt;
echo ------$i.$NAME--end---$(date)----- >>iotest.result.$NAME.txt;
echo "" >>iotest.result.$NAME.txt;
echo "" >>iotest.result.$NAME.txt;
done

echo "###########$(date)###########异步i/o########################################" >iotest.result.$NAME1.txt
for i in $(cat ./ioengine.list.txt);do 
echo ------$i.$NAME--begin--$(date)----- >>iotest.result.$NAME1.txt;
fio -filename=$FILENAME -direct=1 -iodepth 1 -thread -rw=$i -ioengine=$LIOENGINE -bs=$BS -size=$SIZE -numjobs=$NUMJOBS -runtime=$RUNTIME -group_reporting -name=$i.$NAME >>iotest.result.$NAME1.txt;
echo ------$i.$NAME--end---$(date)----- >>iotest.result.$NAME1.txt;
echo "" >>iotest.result.$NAME1.txt;
echo "" >>iotest.result.$NAME1.txt;
done

#############################################################
#以顺序读写,随机读写分类  sum_psync  sum_libaio
###以块大小分类     4k 8k ...
###以读写方式分类    read write ...

[[email protected] caipengtao]# cat bs.txt 
4k
8k
16k
32k
64k

[[email protected] caipengtao]# cat rw.txt 
read
write
randread
randwrite

[[email protected] caipengtao]# cat iotest.sh 
#!/bin/sh
file=‘/rbdtest1/1.txt‘
t=‘ -size=1M -numjobs=30 -runtime=5 -group_reporting ‘
for i in `cat bs.txt`
do
        for j in `cat rw.txt`
        do
                fio -filename=$file -direct=1 -iodepth 1 -thread -rw=$j -ioengine=psync -bs=$i $t -name=$i.$j >> sum_psync.txt
                echo ‘############################‘ >> sum_psync.txt
                echo ‘############################‘ >> sum_psync.txt
                rm -rf $file
        done
done

for i in `cat bs.txt`
do
      fio -filename=$file -direct=1 -iodepth 1 -thread -rw=readwrite -rwmixread=1 -ioengine=psync -bs=$i $t -name=$i.readwrite >>sum_psync.txt
                echo ‘############################‘ >> sum_psync.txt
                echo ‘############################‘ >> sum_psync.txt
      rm -rf $file
done

for i in `cat bs.txt`
do
      fio -filename=$file -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=1 -ioengine=psync -bs=$i $t -name=$i.randrw >>sum_psync.txt
                echo ‘############################‘ >> sum_psync.txt
                echo ‘############################‘ >> sum_psync.txt
      rm -rf $file
done

for i in `cat bs.txt`
do
        for j in `cat rw.txt`
        do
                fio -filename=$file -direct=1 -iodepth 1 -thread -rw=$j -ioengine=libaio -bs=$i $t -name=$i.$j >>sum_libaio.txt
                echo ‘############################‘ >> sum_libaio.txt
                echo ‘############################‘ >> sum_libaio.txt
                rm -rf $file
        done
done

for i in `cat bs.txt`
do
fio -filename=$file -direct=1 -iodepth 1 -thread -rw=readwrite -rwmixread=1 -ioengine=libaio -bs=$i $t -name=$i.readwrite >>sum_libaio.txt
                echo ‘############################‘ >> sum_libaio.txt
                echo ‘############################‘ >> sum_libaio.txt
      rm -rf $file
done

for i in `cat bs.txt`
do
      fio -filename=$file -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=1 -ioengine=libaio -bs=$i $t -name=$i.randrw >>sum_libaio.txt
                echo ‘############################‘ >> sum_libaio.txt
                echo ‘############################‘ >> sum_libaio.txt
      rm -rf $file
done

echo ‘ceph iotest ok‘|mail -s ‘ceph test‘ [email protected]

时间: 2024-11-13 19:30:45

fio 使用总结的相关文章

用FIO测试存储性能

fio,又称为Flexible IO Tester,是Jens Axboe编写的测试程序.Jens是Linux Kernel中blockIO subsystem的维护者.所以这个工具的权威性是毋庸置疑的.它支持的操作系统非常多,包含linux, windows, AIX, HPUX, freeBSD等. FIO的功能非常强劲,这里只介绍最常用的基本功能. FIO官方网站是:http://freecode.com/projects/fio Window是安装文件下载网站:http://bluest

使用fio测试磁盘I/O性能报告

浪潮存储服务器SA5212 I/O基准性能测试报告 1.测试目的 本次测试针对的是浪潮存储服务器SA5212的I/O基准性能,测试维度主要分为磁盘RAID5和RAID10下的读写吞吐量,包括顺序读写,随机读写 2.服务器软硬件环境 系统环境:Centos 7.2 硬件资源:系统盘4*500G SSD,RAID10:存储磁盘12*6T SATA,7200转 3.测试工具 fio - Flexible IO Tester 主要参数说明: filename=/dev/sdb   #测试文件名称,通常选

文件操作ofstream,open,close,ifstream,fin,按照行来读取数据, fstream,iosin iosout,fio.seekg(),文件写入和文件读写,文件拷贝和文件

 1.ofstream,open,close 写入文件 #include<iostream> #include<fstream> using namespace std; //通过ofstream的方式实现写入文件 open,close void main() { ofstream fout;  //ofstream输出文件 fout.open("E:\\1.txt");//打开文件 fout << "1234abcdef";

使用fio测试磁盘I/O性能

简介: fio是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,包括:sync,mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio 等等. 安装fio: 官网网站:http://brick.kernel.dk/snaps/ wget http://brick.kernel.dk/snaps/fio-2.2.10.tar.gz (从官网下载fio的tar

IO测试工具之fio详解

目前主流的第三方IO测试工具有fio.iometer和Orion,这三种工具各有千秋. fio在Linux系统下使用比较方便,iometer在window系统下使用比较方便,Orion是oracle的IO测试软件,可在没有安装oracle数据库的情况下模拟oracle数据库场景的读写. 如下是在Linux系统上采用fio工具来对SAN存储进行的IO测试. 1.安装fio 在fio官网下载fio-2.1.10.tar文件,解压后./configure.make.make install之后就可以使

文件操作ofstream,open,close,ifstream,fin,依照行来读取数据, fstream,iosin iosout,fio.seekg(),文件写入和文件读写,文件拷贝和文件

 1.ofstream,open,close 写入文件 #include<iostream> #include<fstream> using namespace std; //通过ofstream的方式实现写入文件 open,close void main() { ofstream fout;  //ofstream输出文件 fout.open("E:\\1.txt");//打开文件 fout << "1234abcdef";

FIO是测试IOPS

FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,包括:sync,mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio 等等. 安装 下载地址 wget http://brick.kernel.dk/snaps/fio-2.1.10.tar.gz centos yun install libaio-devel -y debian apt-get i

Linux下 fio磁盘压测笔记

专业的测试磁盘IO性能的软件: 1.fio [推荐使用] 2.iometer fio的使用: 参考博客: http://lilinji.blog.51cto.com/5441000/1569623 https://linux.die.net/man/1/fio http://elf8848.iteye.com/blog/2168876   [讲的比较好] 注意,我先使用yum安装的fio,测试时候报错,建议使用最新版的fio工具编译安装.方法如下: yum install libaio liba

使用FIO对SATA、SSD和PCIe Flash进行测试

首先声明,同事做的实验 使用fio对SATA.SSD.PCIE进行了测试 测试说明: 1.测试命名   sync_write_4k_32 sync表示测试方式,可以是sync或者libaio,sync就是发起IO请求等待IO完成后,此thread继续发起IO请求,实现并发采用fio发起多线程实现:libaio,异步IO,thread发起IO请求后,IO请求进行IO队列,此模式为了实现并发多测试,采用控制iodepth实现 write:为测试IO请求方法,包括write.read.rw.randw