之前一篇《测给你看!异步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,最常见的测试场景也最容易说明问题。
在测试之前我们会将被测的PBlaze5 NVMe SSD格式化为xfs文件系统。测试工具使用了fio,因此解读也与fio的测试流程和结果保持一致。测试内容包含128K顺序读写负载下的吞吐量和4k随机读写负载下的IOPS,最常见的测试场景也最容易说明问题。
首先使用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
全盘顺序写三个小时。
Attention
预处理很重要。经过长时间的擦写,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,一边写数据的性能,会与稳态下的写性能有差异,所以还是推荐通过预处理的方式让盘达到稳态进行测试。
随机读写测试仍然首先使用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
综合来看,xfs文件系统会对NVMe SSD的性能造成一定的影响,而多样的应用则使得NVMe SSD的读写负载更加复杂,所以很难精准评估NVMe SSD在所有应用场景中的性能。本文采用稳态下fio性能测试获取的是NVMe SSD一个具有代表性的性能指标。这样的结果符合NVMe SSD在数据中心中长期运行时的性能状态,只是在实际应用中,还需要视具体场景分析瓶颈所在,才能找到优化的方法。