之前一篇《测给你看!异步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
这里需要zhu\'yi\'de随机读写测试中建议使用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 -runtime=1800 -ramp_time=120 -time_based -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=1800 -ramp_time=120 -time_based -size=400G -group_reporting -norandommap=1
4K随机读/写也达到了超过85万和20万IOPS的效能。
综合来看,xfs档案系统会对NVMe SSD的效能造成一定的影响,而多样的应用则使得NVMe SSD的读写负载更加复杂,所以很难精准评估NVMe SSD在所有应用场景中的效能。本文采用稳态下fio效能测试获取的是NVMe SSD一个具有代表性的效能指标。这样的结果符合NVMe SSD在资料中心中长期执行时的效能状态,只是在实际应用中,还需要视具体场景分析瓶颈所在,才能找到优化的方法。