由于公司要部署一套Ceph环境,趁任务并不太着急,在部署之前先对HDD和SSD进行周密的测试,以便和部署之后的Ceph服务能力(RBD、CephFS、NFS的性能)进行对比。
本文的目的是解答如下几个问题:
- fio工具的参数到底该如何选择,比如:多长时间的
runtime
更经济?bs
对测试结果有何影响?numjobs
和iodepth
应该设置多少? - 正儿八经了解一下HDD和SSD的性能。
本文有不少数据和图表,希望能够为有同样疑惑的朋友提供有益参考。(请阅读时注意BW的单位)
测试过程日志:https://github.com/get-set/fio-bench-disks-ceph/tree/master/disks
测试HDD性能
磁盘的配置如下:
- 磁盘为7200转3.5寸SAS机械硬盘;
- 根据部署Ceph的官方推荐配置,每块磁盘以RAID0单盘挂在RAID卡下,RAID卡为H730 mini(拥有1G缓存),具体配置:
- 开启预读(read-ahead);
- 开启写回(write-back),有电池;
- 关闭磁盘缓存(disk-cache)。
注:
- 为了加快测试速度,以下测试是在两台服务器上测试的,比如有可能随机写在第一台的/dev/sdd上测试,而随机读就是在另一台的/dev/sde上测试。但是确保针对所测试参数的同一类型的IO操作的所有参数变化都是在同一块硬盘上进行的,所以请只关注各参数内的纵向测试结果即可。
- RAID卡有缓存,由于是为后续部署和测试Ceph做前期测试,因此以下关于磁盘的测试结果是有RAID缓存加持的,请酌情参考。
FIO参数对HDD测试的影响
1. runtime(测试时长)
一、测试目的
了解能够得到客观性能结果的最短时间,以便为后续的测试节省时间。
二、测试内容
测试4k随机读写和64k顺序读写的过程中,不同的runtime所得到的测试结果,观察从多长时间开始就可以得到稳定的测试结果。
为了观察
util
值(磁盘利用率),将读写分别测试。
测试脚本fio.conf
:
[global]
ioengine=libaio # 异步IO
direct=1 # 排除OS的IO缓存机制的影响
size=5g # 每个fio进程/线程的最大读写
lockmem=1G # 锁定所使用的内存大小
directory=/mnt/sdd # XFS格式的磁盘,未直接用裸盘
iodepth=1 # 队列深度1(后续有关于参数的测试)
numjobs=1 # 同时开启的fio进程/线程数为1
rw=randread # 每次测试修改该值:randread/read/randwrite/write
bs=4k # 每次测试修改该值:rand对应4k,seq对应64k
[job]
runtime=10 # 本次测试runtime:10 20 30 40 50 60 90
测试命令:
mkdir -p logs/{runtime.4k_randread,runtime.4k_randwrite,runtime.64k_read,runtime.64k_write}
# 修改不同的rw和bs值,然后执行4次如下命令(注意修改tee输出的log目录)
for runtime in 10 20 30 40 50 60 90; do sed -i "/^runtime/c runtime=${runtime}" fio.conf && fio fio.conf | tee logs/runtime.4k_randread/${runtime}.log && sleep 10s; done
测试结果(IOPS和BW):
对于4k_randread
、64k_read
和64_write
的IOPS
和BW
值的观察可以基本看出,从30s之后,测试结果基本趋于稳定;而4k_randwrite
看不到明显的稳定区间。
再观察磁盘利用率:
通过观察util
的值,发现不同的测试方法大约都能够在30秒之后得到比较稳定的结果。对于随机读来说,似乎随着时间的延长而越来越乏力,与性能结果类似。
三、测试结论
对于随机读写和顺序读写的测试来说,runtime达到30-40秒即可得到相对客观的结果,保险起见也可以时间更长。
2. bs(块大小)
一、测试目的
观察不同的块大小对读写性能的影响。
二、测试内容
测试随机读写和顺序读写的过程中,不同的bs所得到的测试结果。
为了观察
util
值(磁盘利用率),将读写分别测试。
测试脚本fio.conf
:
[global]
ioengine=libaio # 异步IO
direct=1 # 排除OS的IO缓存机制的影响
size=5g # 每个fio进程/线程的最大读写
lockmem=1G # 锁定所使用的内存大小
runtime=30 # 根据上面的结论以后采用30值
directory=/mnt/sdd # XFS格式的磁盘,未直接用裸盘
iodepth=1 # 队列深度1(后续有关于参数的测试)
numjobs=1 # 同时开启的fio进程/线程数为1
rw=randread # 每次测试修改该值:randread/read/randwrite/write
[job]
bs=4k # 本次测试bs:1k 2k 4k .. 64m
测试命令:
mkdir -p logs/{bs.r