vlambda博客
学习文章列表

磁盘性能测试工具fio

1.磁盘性能测试工具FIO

FIO是常见的磁盘性能测试工具,使用 FIO 时,建议配合使用 libaio 的 I/O 引擎进行测试。

一般使用以下指标衡量硬盘的性能:

IOPS:每秒读/写次数,单位为次(计数)。存储设备的底层驱动类型决定了不同的 IOPS。

吞吐量:每秒的读写数据量,单位为MB/s。

时延:I/O 操作的发送时间到接收确认所经过的时间,单位为秒。


2.测试建议与注意事项

l建议在空闲的、未保存重要数据的硬盘上进行 FIO 测试,并在测试完后重新制作被测硬盘的文件系统。

l测试硬盘性能时,建议直接测试裸数据盘(如 /dev/vdb)。

l测试文件系统性能时,推荐指定具体文件测试(如 /data/file)。

l请不要在系统盘上进行 FIO 测试,避免损坏系统重要文件。

l为避免底层文件系统元数据损坏导致数据损坏,请不要在业务数据盘上进行测试。


参数说明:

参数名

说明

取值样例


bs

每次请求的块大小。取值包括4k、8k及16k等


4k

 

ioengine


I/O 引擎。推荐使用 Linux 的异步 I/O 引擎。


libaio


direct


指定 direct 模式。

True(1)表示指定 O_DIRECT 标识符,忽略 I/O 缓存,数据直写。

False(0)表示不指定 O_DIRECT 标识符。

默认为 True(1)。


1

rw


读写模式。取值包括顺序读(read)、顺序写(write)、随机读

(randread)、随机写(randwrite)、混合随机读写(randrw)和混合

顺序读写(rw,readwrite)。


read


time_based


指定采用时间模式。无需设置该参数值,只要 FIO 基于时间来运行。


N/A


runtime


指定测试时长,即 FIO 运行时长


600


refill_buffers


FIO 将在每次提交时重新填充 I/O 缓冲区。默认设置是仅在初始时填充并重

用该数据。


N/A


norandommap


在进行随机 I/O 时,FIO 将覆盖文件的每个块。若给出此参数,则将选择新

的偏移量而不查看 I/O 历史记录。


N/A


randrepeat


本随机序列是否可重复,True(1)表示随机序列可重复,False(0)表示随

机序列不可重复。默认为 True(1)。


0

group_reporting


多个 job 并发时,打印整个 group 的统计值。


N/A


name


job 的名称。


fio-read


size


I/O 测试的寻址空间。


100GB


filename


测试对象,即待测试的磁盘设备名称。


/dev/sdb


zero_buffers 

用0初始化系统buffer


nrfiles=8

每个进程生成文件的数量






3.常见测试方案

3.1读性能测试用例

普通模式:

#4k随机读

$ fio --bs=4k --ioengine=libaio --iodepth=128 --direct=1 --rw=randwrite --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb

#8k随机读

$ fio --bs=8k --ioengine=libaio --iodepth=128 --direct=1 --rw=randwrite --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb

#64k随机读

$ fio --bs=64k --ioengine=libaio --iodepth=128 --direct=1 --rw=randwrite --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb

#1M随机读

$ fio --bs=1m --ioengine=libaio --iodepth=128 --direct=1 --rw=randwrite --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb


3.2写性能测试用例

普通模式:

#4k随机写

$ fio --bs=4k --ioengine=libaio --iodepth=128 --direct=1 --rw=randwrite --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb

#8k随机写

$ fio --bs=8k --ioengine=libaio --iodepth=128 --direct=1 --rw=randwrite --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb

#64k随机写

$ fio --bs=64k --ioengine=libaio --iodepth=128 --direct=1 --rw=randwrite --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb

#1M随机写

$ fio --bs=1m --ioengine=libaio --iodepth=128 --direct=1 --rw=randwrite --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb


3.3吞吐测试用例

4M顺序写

$ fio --bs=4m --ioengine=libaio --iodepth=128 --direct=1 --rw=write --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb

#4M顺序读

$ fio --bs=4m --ioengine=libaio --iodepth=128 --direct=1 --rw=read --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb


3.4 混合读写测试用例

普通模式:

#4k随机读写 70%读30%写

$ fio --bs=4k --ioengine=libaio --iodepth=128 --direct=1 --rw=randrw –rwmixread=70  --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb

#4k随机读写 70%写30%读

$ fio --bs=4k --ioengine=libaio --iodepth=128 --direct=1 --rw=randrw –rwmixread=30  --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb

#4k随机读写 50%读50%写

$ fio --bs=4k --ioengine=libaio --iodepth=128 --direct=1 --rw=randrw –rwmixread=50  --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb

#64k随机读写 70%读30%写

$ fio --bs=64k --ioengine=libaio --iodepth=128 --direct=1 --rw=randrw –rwmixread=70  --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb

#64k随机读写 70%写30%读

$ fio --bs=64k --ioengine=libaio --iodepth=128 --direct=1 --rw=randrw –rwmixread=30  --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb

#64k随机读写 50%读50%写

$ fio --bs=64k --ioengine=libaio --iodepth=128 --direct=1 --rw=randrw –rwmixread=50  --time_based --runtime=300 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-write --size=1G --filename=/dev/vdb




4.云硬盘测试方案

4.1时延性能测试用例

bs = 4k iodepth = 1:随机读/写测试,能反映硬盘的时延性能
执行以下命令,测试硬盘的随机读时延


fio -bs=4k -ioengine=libaio -iodepth=1 -direct=1 -rw=randread -time_based -runtime=600  -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-randread-lat --size=10G -filename=/dev/vdb

执行以下命令,测试硬盘的随机写时延。


fio -bs=4k -ioengine=libaio -iodepth=1 -direct=1 -rw=randwrite -time_based -runtime=600  -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-randwrite-lat --size=10G -filename=/dev/vdb




执行以下命令,测试 SSD 云硬盘的随机混合读写时延性能。


fio --bs=4k --ioengine=libaio --iodepth=1 --direct=1 --rw=randrw --time_based --runtime=100 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-read --size=1G --filename=/dev/vdb


测试结果如下图所示:


4.2吞吐性能测试用例


bs = 128k iodepth = 32:顺序读/写测试,能反映硬盘的吞吐性能
执行以下命令,测试硬盘的顺序读吞吐带宽。

fio -bs=128k -ioengine=libaio -iodepth=32 -direct=1 -rw=read -time_based -runtime=600  -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-read-throughput --size=10G -filename=/dev/vdb



执行以下命令,测试硬盘的顺序写吞吐带宽。

fio -bs=128k -ioengine=libaio -iodepth=32 -direct=1 -rw=write -time_based -runtime=600  -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-write-throughput --size=10G -filename=/dev/vdb


执行以下命令,测试 SSD 云硬盘的顺序读吞吐性能。

fio --bs=128k --ioengine=libaio --iodepth=32 --direct=1 --rw=read --time_based --runtime=100 --refill_buffers --norandommap --randrepeat=0 --group_reporting --name=fio-rw --size=1G --filename=/dev/vdb


测试结果如下图所示



4.3 IOPS性能测试用例


bs = 4k iodepth = 32:随机读/写测试,能反映硬盘的 IOPS 性能
执行以下命令,测试硬盘的随机读 IOPS。


fio -bs=4k -ioengine=libaio -iodepth=32 -direct=1 -rw=randread -time_based -runtime=600  -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-randread-iops --size=10G -filename=/dev/vdb


执行以下命令,测试硬盘的随机写 IOPS。

fio -bs=4k -ioengine=libaio -iodepth=32 -direct=1 -rw=randwrite -time_based -runtime=600  -refill_buffers -norandommap -randrepeat=0 -group_reporting -name=fio-randwrite-iops --size=10G -filename=/dev/vdb


测试 SSD 云硬盘的随机读 IOPS 性能。如下图所示: