提交成功
返回列表

XFS 为例 讨论 NVMe SSD 测试注意事项

2019 / 07 / 03
2

之前一篇《测给你看!异步I/O模式下NVMe SSD性能有多高》文章,介绍了同步I/O和异步I/O模式下NVMe SSD性能的差异,更高性能的存储设备也需要更高的压力才能显示其性能优势。在真实的企业系统中,NVMe SSD更多见于经由文件系统被应用使用。相较于裸盘性能的测试,文件系统环境中的NVMe SSD测试更为复杂,也更有价值,本文也将对NVMe SSD在文件系统场景中测试需要注意的问题进行解读。

 

测试环境:

服务器:浪潮 NF5280M5

CPU:Intel(R) Xeon(R) Gold 5115

操作系统:CentOS 7.4

测试工具:FIO 3.13

被测NVMe SSD产品:PBlaze5 C916 NVMe SSD(3.2T)

文件系统:xfs

 

在测试之前我们会将被测的PBlaze5 NVMe SSD格式化为xfs文件系统。测试工具使用了fio,因此解读也与fio的测试流程和结果保持一致。测试内容包含128K顺序读写负载下的吞吐量和4k随机读写负载下的IOPS。

 

今天的文件系统是多样的,有ext2、ext3、ext4以及centos7开始默认使用的xfs文件系统,也有ceph、HDFS等分布式文件系统,各种文件系统各有特点,测试也不能一概而论,在此只以XFS做为代表进行说明。此外每轮测试都会包含预处理和正式的测试两部分,并均通过fio完成。

 

 

128K顺序读/写测试

 

首先使用fio执行一个128k顺序读命令。

 

fio -name=test -thread -ioengine=libaio -direct=1 -directory=/nvme0n1 -rw=read -bs=128K -numjobs=1 -iodepth=256 -size=3200G  -group_reporting

 

命令开始执行就可以看到测试文件写盘(Laying out IO file)的状态。文件写完成之后才会开始正式的读测试,并记录结果,这与写测试的流程不一样,下文会提到。接下来进行顺序写预处理。

 

fio -name=test -thread -ioengine=libaio -direct=1 -directory=/nvme0n1 -rw=write -bs=128K -numjobs=1 -iodepth=256 -runtime=10800 -time_based -size=3200G  -group_reporting

 

全盘顺序写三个小时。

 

Attenion:预处理很重要。经过长时间的擦写,NVMe SSD的GC等功能会被触发,这时也更接近于盘在生产环境中的真实性能,测试过程中一定要保证NVMe SSD被写满的状态否则会造成性能偏高的现象,预处理的作用也在于此在刚才顺序预处理中完成Laying out IO file过程便可以看作对盘的预处理。至此执行的两条命令都会对NVMe SSD进行大规模的写,预处理工作也随之完成。

 

接下来是正式的128K顺序读/写性能测试。首先是顺序读测试:

 

fio -name=test -thread -ioengine=libaio -direct=1 -directory=/nvme0n1 -rw=read -bs=128K -numjobs=1 -iodepth=256 -runtime=600 -time_based -size=3200G  -group_reporting

 

完成读测试之后就是顺序写测试:

 

fio -name=test -thread -ioengine=libaio -direct=1 -directory=/nvme0n1 -rw=write -bs=128K -numjobs=1 -iodepth=256 -runtime=600 -time_based -size=3200G  -group_reporting

 

 

从结果来看xfs对读带宽造成的影响大于对写带宽的影响。在此还需要强调下fio读和写性能测量的差异,在此我们运行了两次fio,如下图:

 

 

 

 

fio读测试

 

fio写测试

 

执行fio语句开始文件系统测试时会看到Laying out IO file过程,过程中会创建测试文件进行文件系统元数据分配。在进行读测试中Laying out IO file过程的性能表现是不会合入整体性能测试结果的,但是写测试中Laying out过程会合入整体性能测试结果,此时SSD的性能是一边Laying out,一边写数据的性能,会与稳态下的写性能有差异,所以还是建议通过预处理的方式让盘达到稳态进行测试。

 

 

4K随机读/写测试

 

随机读写测试仍然首先使用fio创建测试文件完成文件系统布局:

 

fio -name=test -thread -ioengine=libaio -direct=1 -directory=/nvme0n1 -rw=randread -bs=4K -numjobs=8 -iodepth=64 -size=400G  -group_reporting -norandommap=1

 

随机写预处理:

 

fio -name=test -thread -ioengine=libaio -direct=1 -directory=/nvme0n1 -rw=randwrite -bs=4K -numjobs=8 -iodepth=64 -runtime=10800 -ramp_time=120 -time_based -size=400G  -group_reporting -norandommap=1

 

Attenion:随机读写测试中建议使用directory指定测试目录。因为使用directory时会根据fio设置的测试线程数量创建相应个数的测试文件。如果使用namefile指定测试文件只会创建一个测试文件不能完全发挥出NVMe SSD的性能。

 

接下来进行4K随机读IOPS性能测试:

 

fio -name=test -thread -ioengine=libaio -direct=1 -directory=/nvme0n1 -rw=randread -bs=4K -numjobs=8 -iodepth=64 -size=400G  -group_reporting -norandommap=1

 

随机写测试:

 

fio -name=test -thread -ioengine=libaio -direct=1 -directory=/nvme0n1 -rw=write -bs=128K -numjobs=1 -iodepth=256 -runtime=10800 -time_based -size=3200G  -group_reporting

 

 

4K随机读/写也达到了超过85万和20万IOPS的性能。

 

综合来看,xfs文件系统会对NVMe SSD的性能造成一定的影响,而多样的应用则使得NVMe SSD的读写负载更加复杂,所以很难准确评估NVMe SSD在所有应用场景中的性能。本文采用稳态下fio性能测试获取的是NVMe SSD一个具有代表性的性能指标。这样的结果符合NVMe SSD在数据中心中长期运行时的性能状态,只是在实际应用中,还需要视具体场景分析瓶颈所在,才能找到优化的方法。