提交成功
返回列表

测给你看!异步 I/O 模式下 NVMe SSD 性能有多高

2019 / 06 / 03
0

在早期NVMe的讨论话题中,常常将之与AHCI协议进行对比,在支持的队列深度、并发进程数以及消耗时钟周期数等方面,NVMe吊打了AHCI:

 

NVMe与AHCI协议对比(来源:sata-io.org)

 

SATA的发展可以追溯到上世纪80年代的IDE/ATA,在HDD时代,是硬盘主流的存储接口。SATA Express采用AHCI协议将硬盘映射成一个PCIe设备以提高系统性能。但是第三代SATA的带宽也只有6Gb/s,无法充分释放闪存的性能。当SSD接口由SATA被PCIe取代之后,一个量身定制的存储接口协议诞生是必然,这就是NVMe。(更多细节可以看文末相关阅读文章)

 

PCIe和NVMe组合提高了SSD的性能上限,一块SATA SSD无论如何带宽也不会突破1GB/s以及稳定的微秒级延迟。是否能达到这个上限,就需要看SSD本身的软硬件设计水平了。

 

NVMe SSD的高性能可以直接反映到测试基准测试的结果上,需要注意的是测试NVMe SSD的特点是遇强则强,需要高压力方可看到性能效果。接下来就是用fio通过几组测试来解读NVMe SSD的性能优势。当然,这些测试也将为系统性能优化提供理论基础。

 

在写fio脚本之前,还需要注意同步I/O和异步I/O的概念,这也是本文测试压力模型中的重要变量。同步I/O是指系统的一个线程一次只能发出一个I/O,等待内核处理完成才返回结果,系统再发下一个I/O。异步I/O模式是系统的线程不停的发I/O直到达到设置的队列深度上限,此期间,线程SSD通知会通过中断或者轮询等方式告诉CPU,CPU来调用该命令的回调函数来处理结果。原生的异步I/O技术以Linux下的libaio和Windows下的windowsaio较为常见。

 

测试环境:

服务器:I620-G30 

内存:64GB

操作系统:centos7

测试软件:fio

NVMe SSD:PBlaze5 910 7.68TB

 

依据同步I/O和异步I/O的原理,我们可以总结出几个结论。

 

同步模式下增加I/O队列深度并不能得到更高的性能,因为其机制只能1次发1个I/O。而通过增加线程数才可以获得更大的压力;

 

异步I/O模式可以通过调整队列深度提升压力,例如同步模式下32个线程并发和异步I/O模式下1个线程32队列深度的测试结果应当相同,而且通过提高线程数异步I/O模式可以进一步提高压力;

 

对于高性能的NVMe SSD,使用异步I/O模式更容易获得高性能收益。

 

使用fio可以方便的选择I/O引擎并对并发进程数和队列深度等参数进行设置。接下来就是验证上面的三个观点。验证测试前,我们需要先进行预处理,全盘顺序写2遍然后随机写4个小时,命令如下:

 

 

1.使用同步io模式测试,并取得了IOPS的值。

 

 

我们改变下iodepth和numjobs,测几组不同的值对比。

 

 

可以看到当相同的numjobs参数下,SSD的IOPS性能处于同一水平,只有改并发进程数会改变性能。这验证了我们前文中的第一个观点,接下来我们将测试的重点放在异步IO模式下的测试。

 

本次系列测试均为4K随机读测试,numbjobs(并发进程数)和iodepth(队列深度)是各测试的两个主要变量,可以说两者的乘积决定了各组测试的压力大小。而psync(同步IO模式)和libaio(异步IO模式)决定了大于1的iodepth是否有效。

 

 

2、 异步I/O、队列深度:64、并发线程数:8

 

 

测试结果如下(IOPS:1007.5k):

 

 

我们同样获取了libaio模式下的多组数据,如下表:

 

 

如下图可以看到,numjobs和iodepth组合下压力越大,性能也越高。最终在512(numjobs*iodepth)时达到了PBlaze5的性能峰值。

 

 

不同的介质、不同的接口和协议规范对于测试以及采购、配置、优化和升级的各项工作有着重要意义,也是以更低的成本获取更高性能的前提。Memblaze一直致力于帮助用户构建高性能、高能源效率的存储系统,针对数据库等典型应用场景还有着更为定制化的方案。