fio基础

介绍

fio是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,包括: - sync - mmap - libaio - posixaio - SG v3 - splice - null - network - syslet - guasi - solarisaio - ...

安装

yum安装

1
2
3
$ yum install libaio-devel fio -y
$ fio -v
fio-2.2.8

手动安装

1
2
3
4
5
6
7
$ yum install libaio-devel -y
$ cd /usr/local/
$ wget http://brick.kernel.dk/snaps/fio-3.5.tar.gz
$ tar -zxvf fio-3.5.tar.gz
$ cd fio-3.5
$ make $ make install
$ fio -v

参数说明

filename

指定文件(设备)的名称。可以通过冒号分割同时指定多个文件,如filename=/dev/sda:/dev/sdb。

directory

设置filename的路径前缀。在后面的基准测试中,采用这种方式来指定设备。

name

指定job的名字,在命令行中表示新启动一个job。

direct:

bool类型,如果设置成true (1),表示不使用io buffer。

ioengine

I/O引擎,现在fio支持19种ioengine。默认值是sync同步阻塞I/O,libaio是Linux的native异步I/O。

关于同步异步,阻塞和非阻塞模型可以参考使用异步 I/O 大大提高应用程序的性能

iodepth

如果ioengine采用异步方式,该参数表示一批提交保持的io单元数。

该参数可参考Fio压测工具和io队列深度理解和误区

rw

I/O模式,随机读写,顺序读写等等。

bs

I/O block大小,默认是4k。

size

指定job处理的文件的大小。

numjobs

指定job的克隆数(线程)。

time_based

如果在runtime指定的时间还没到时文件就被读写完成,将继续重复直到runtime时间结束。

runtime

指定在多少秒后停止进程。如果未指定该参数,fio将执行至指定的文件读写完全完成。

group_reporting

当同时指定了numjobs了时,输出结果按组显示。

命令行参数示例

顺序读

1
$ fio -filename=/dev/sdb -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest

顺序写

1
$ fio -filename=/dev/sdb -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest

随机读

1
$ fio -filename=/dev/sdb -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest

随机写

1
$ fio -filename=/dev/sdb -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000 -group_reporting -name=mytest

混合随机读写

1
$ fio -filename=/dev/sdb -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=100 -group_reporting -name=mytest -ioscheduler=noop

测试bandwidth(带宽)

1
$ fio -filename=tstfile -size=10G -direct=1 -ioengine=libaio -thread -bs=512k -rw=write -iodepth=64 -iodepth_batch_submit=8 -iodepth_batch_complete=8 -name=write-bw-tst

测试iops(磁盘的每秒读写次数)

1
$ fio -filename=tstfile -size=10G -direct=1 -ioengine=libaio -thread -bs=4k -rw=randwrite -iodepth=64 -runtime=300 -iodepth_batch=1 -iodepth_batch_complete=1 -name=randwrite-iops-tst

配置文件测试示例

配置说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
filename=/dev/sdb    #测试文件名称,通常选择需要测试的盘的data目录
direct=1 #测试过程绕过机器自带的buffer。使测试结果更真实
rw=randwrite #测试随机写的I/O
rw=randrw #测试随机写和读的I/O
bs=16k #单次io的块文件大小为16k
bsrange=512-2048 #同上,指定数据块的大小范围
size=5G #本次的测试文件大小为5g,以每次4k的io进行测试
numjobs=30 #本次的测试线程为30个
runtime=1000 #测试时间1000秒,如果不写则一直将5g文件分4k每次写完为止
ioengine=psync #io引擎使用psync方式
rwmixwrite=30 #在混合读写的模式下,写占30%
group_reporting #关于显示结果的,汇总每个进程的信息
lockmem=1G #只使用1g内存进行测试
zero_buffers #用0初始化系统buffer
nrfiles=8 #每个进程生成文件的数量

配置fio.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
[global]
ioengine=libaio
iodepth=128
time_based
direct=1
thread=1
group_reporting
randrepeat=0
norandommap
numjobs=32
timeout=6000
runtime=120

[randread-4k]
rw=randread
bs=4k
filename=/dev/sdb
rwmixread=100
stonewall

[randwrite-4k]
rw=randwrite
bs=4k
filename=/dev/sdb
stonewall

[read-512k]
rw=read
bs=512k
filename=/dev/sdb
stonewall

[write-512k]
rw=write
bs=512k
filename=/dev/sdb
stonewall

ps:“/dev/sdb”是目标测试磁盘的设备名称。

开始测试

1
$ fio fio.conf

性能指标

bw

磁盘的吞吐量,这个是顺序读写考察的重点。

iops

磁盘的每秒读写次数,这个是随机读写考察的重点。

顺序读写 (吞吐量,常用单位为MB/s)

文件在硬盘上存储位置是连续的。 适用场景:

  • 大文件拷贝(比如视频音乐) 速度即使很高,对数据库性能也没有参考价值。

4K随机读写 (IOPS,常用单位为次)

在硬盘上随机位置读写数据,每次4KB。 适用场景: - 操作系统运行 - 软件运行 - 数据库

坚持原创技术分享,您的支持将鼓励我继续创作!
0%