fio 存储性能测试

测试环境

硬件环境
CPU Intel(R) Xeon(R) Gold 5120 CPU @ 2.20GHz * 4 (逻辑cpu112核)
内存 256GB
磁盘 数普DS5760,单块10TB 7200RPM NL-SAS磁盘,划分3个RAID6 lun ,通过56GB InfiniBand网络挂载到操作系统
软件环境
操作系统 CentOS Linux release 7.5.1804
测试软件 fio-3.1

友情提示:性能测试建议直接通过写裸盘的方式进行测试(systemrescuecd+fio),会得到较为真实的数据。但直接测试裸盘会破坏文件系统结构,导致数据丢失,请在测试前确认磁盘中数据已备份;

dd 测试

首先使用dd简单的测试一下写入速度
dd if=/dev/zero of=/opt/file1 bs=1M count=102400

1
2
3
4
# dd if=/dev/zero of=/opt/file1 bs=1M count=102400
102400+0 records in
102400+0 records out
107374182400 bytes (107 GB) copied, 70.5689 s, 1.5 GB/s

fio安装

为了看到更详细,更精准的存储性能,我们选用fio作为测试工具;
fio 是测试 IOPS 的非常好的工具,用来对硬件进行压力测试和验证,支持 19种不同的 I/O 引擎,包括: sync,mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio 等等。
它支持 Linux 、FreeBSD 、NetBSD、 OpenBSD、 OS X、 OpenSolaris、 AIX、 HP-UX、 Android 以及 Windows操作系统。

硬盘性能指标

顺序读写(bw吞吐量,常用单位为 MB/s):文件在硬盘上存储位置是连续的。
随机读写(iops磁盘的每秒读写次数,常用单位为次):在硬盘上随机位置读写数据,默认4KB

fio安装

yum -y install epel-release
yum -y install fio

fio命令格式

fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=randrw -ioengine=psync -bs=16k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=test

fio参数详解

filename: 指定文件 (设备) 的名称。可以通过冒号分割同时指定多个文件,如 filename=/dev/sda:/dev/sdb。
name: 指定 job 的名字,在命令行中表示新启动一个 job。
direct: bool 类型,如果设置成 true (1),表示不使用 io buffer。
iodepth: 如果 ioengine 采用异步方式,该参数表示一批提交保持的 io 单元数。该参数可参考文章“Fio 压测工具和 io 队列深度理解和误区”。
http://blog.yufeng.info/archives/2104
ioengine: I/O 引擎,现在 fio 支持 19 种 ioengine。默认值是 sync 同步阻塞 I/O,libaio 是 Linux 的 native 异步 I/O。关于同步异步,阻塞和非阻塞模型可以参考文章“使用异步 I/O 大大提高应用程序的性能”。
http://www.ibm.com/developerworks/cn/linux/l-async/
rw: I/O 模式,顺序读(read)、顺序写(write)、随机读(randread)、随机写(randwrite)、随机读写(randrw)。
rwmixread: 随机读写模式中读占比,默认为50%
bs: I/O block 大小,默认是 4k。
bsrange:指定数据块的大小范围
size: 指定 job 处理的文件的大小。
numjobs: 指定 job 的线程数。
runtime: 指定在多少秒后停止进程。如果未指定该参数,fio 将执行至指定的文件读写完全完成。
time_based: 如果在 runtime 指定的时间还没到时文件就被读写完成,将继续重复知道 runtime 时间结束。
group_reporting: 当同时指定了 numjobs 了时,输出结果按组显示。

fio测试结果

我们需要根据自己业务场景来看待测试结果,如果是数据库业务的话,对随机读写要求比较高。如果是视频业务的话,对顺序读要求比较高。
为了确认不同参数对测试结果的影响有多大,我这里针对ioengine、iodepth、numjobs和bs参数进行了单独测试,测试结果如下:
0
从测试结果来看,我们可以得出以下结论:

  • 在同步模式(psync)和异步模式(libaio)下测试,在顺序写的时候同步模式iops会低于异步模式,其他基本无差异
  • 队列深度(iodepth)对测试影响不大,网上说法是一般设置32个
  • 线程数(numjobs)对测试效果影响较大,建议设置为逻辑cpu核数
  • 文件块大小(bs)可以看到块越小,iops越高

fio详细测试过程

测试iodepth

fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=16k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testiodepth-read-1
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 16 -thread -rw=read -ioengine=psync -bs=16k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testiodepth-read-16
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=read -ioengine=psync -bs=16k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testiodepth-read-32
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=16k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testiodepth-write-1
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 16 -thread -rw=write -ioengine=psync -bs=16k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testiodepth-write-16
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=write -ioengine=psync -bs=16k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testiodepth-write-32
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=16k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testiodepth-randread-1
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 16 -thread -rw=randread -ioengine=psync -bs=16k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testiodepth-randread-16
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=randread -ioengine=psync -bs=16k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testiodepth-randread-32
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testiodepth-randwrite-1
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 16 -thread -rw=randwrite -ioengine=psync -bs=16k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testiodepth-randwrite-16
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=randwrite -ioengine=psync -bs=16k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testiodepth-randwrite-32
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testiodepth-randrw-1
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 16 -thread -rw=randrw -ioengine=psync -bs=16k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testiodepth-randrw-16
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=randrw -ioengine=psync -bs=16k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testiodepth-randrw-32

测试ioengine(psync/libaio)

fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=read -ioengine=libaio -bs=16k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testlibaio-randread
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=write -ioengine=libaio -bs=16k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testlibaio-write
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=randread -ioengine=libaio -bs=16k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testlibaio-randread
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=randwrite -ioengine=libaio -bs=16k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testlibaio-randwrite
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=randrw -ioengine=libaio -bs=16k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testlibaio-randrw

测试numjobs 1/30/112

fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=read -ioengine=psync -bs=16k -size=200G -numjobs=1 -runtime=300 -group_reporting -name=testnumjobs-read-1
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=read -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=300 -group_reporting -name=testnumjobs-read-30
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=write -ioengine=psync -bs=16k -size=200G -numjobs=1 -runtime=300 -group_reporting -name=testnumjobs-write-1
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=write -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=300 -group_reporting -name=testnumjobs-write-30
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=randread -ioengine=psync -bs=16k -size=200G -numjobs=1 -runtime=300 -group_reporting -name=testnumjobs-randread-1
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=randread -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=300 -group_reporting -name=testnumjobs-randread-30
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=randwrite -ioengine=psync -bs=16k -size=200G -numjobs=1 -runtime=300 -group_reporting -name=testnumjobs-randwrite-1
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=randwrite -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=300 -group_reporting -name=testnumjobs-randwrite-30
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=randrw -ioengine=psync -bs=16k -size=200G -numjobs=1 -runtime=300 -group_reporting -name=testnumjobs-randrw-1
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=randrw -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=300 -group_reporting -name=testnumjobs-randrw-30

测试bs

fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=read -ioengine=psync -bs=64k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testbs-read-64
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=read -ioengine=psync -bs=1024k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testbs-read-1024
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=write -ioengine=psync -bs=64k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testbs-write-64
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=write -ioengine=psync -bs=1024k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testbs-write-1024
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=randread -ioengine=psync -bs=64k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testbs-randread-64
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=randread -ioengine=psync -bs=1024k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testbs-randread-1024
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=randwrite -ioengine=psync -bs=64k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testbs-randwrite-64
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=randwrite -ioengine=psync -bs=1024k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testbs-randwrite-1024
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=randrw -ioengine=psync -bs=64k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testbs-randrw-64
fio -filename=/dev/mapper/mpatha -direct=1 -iodepth 32 -thread -rw=randrw -ioengine=psync -bs=1024k -size=200G -numjobs=112 -runtime=300 -group_reporting -name=testbs-randrw-1024
参考链接:https://wsgzao.github.io/post/fio/
https://linux.cn/article-9912-1.html
http://www.178pt.com/204.html
http://blog.yufeng.info/archives/741

独学无友,孤陋寡闻;学习记录,欢迎拍砖!