当谈PCIe SSD的高性能,我们在谈什么(上)

本文作者,Memblaze——Ron

性能一直是PCIe SSD的一大卖点,但是不同的发展阶段PCIe SSD对于性能的追求也各有不同。单纯的高性能峰值早已不是PCIe SSD的唯一追求。那么当我们在谈PCIe SSD的高性能,我们在谈什么?

当谈PCIe SSD的高性能,我们在谈什么

性能一直是PCIe SSD的一大卖点,但是不同的发展阶段PCIe SSD对于性能的追求也各有不同。单纯的高性能峰值早已不是PCIe SSD的唯一追求。那么当我们在谈PCIe SSD的高性能,我们在谈什么?

PCIe SSD的发展阶段一:性能峰值

PCIe SSD最开始追求极致的性能,这个时期从评测到宣讲的各种场合,都在谈顺序读、顺序写、随机读、随机写等负载场景下,PCIe SSD的能力到底能做到多高。

SSD的性能追求阶段二:IO低延迟

随着NVMe标准的PCIe SSD开始普及,NVMe SSD可以达到6GB/s的读和接近4GB/s的写,100万IOPS,这在SATA SSD的时代都是完全不能想象的数字。但是实际上,很少有客户真的能够把NVMe SSD的性能能够利用到极致,这与实际应用的负载模型及压力大小等因素有关,这就带来了PCIe SSD第二个阶段的性能追求——低延迟。

不管是什么样的IO模型,不管是多小的IO请求,每一个IO都必须从硬盘上得到一个最及时的响应,这意味着不管在什么样的应用场景,请求都能够得到最高速的响应,这样才能够体现出在整个系统级是低延时的。

那么NVMe SSD做了什么来做到极低的延迟?从系统的IO整体路径来看,NVMe比原来的SATA多了很多优势,原来的SATA SSD的CPU从芯片和内核要走到南桥,再通过南桥和SATA 的Bus再加上SATA 协议的冗长低效,导致它天生延时就是非常高。NVMe通过PCIe直接连接到CPU内部,就把这些Overhead全部都跳过了。

可以看到主流的硬盘现在4K写的延时都已经降到20微秒以下, Memblaze自己的产品可以做到10微秒左右,这个速度会体现在大量应用中,都可以看到各种顺序写、小带宽、小压力的写都可以得到快速响应。

写延迟时间是从Host写到SSD上内存的时间,企业级SSD都有完善的掉电保护技术保障SSD的数据可以在系统掉电后写到Flash上,数据始终是安全的。消费类SSD没有掉电保护,虽然也可以选择打开盘上的Cache,但是需要考虑掉电时的数据丢失的风险。好在主流OS都提供了一定掉电处理机制,不至于让文件系统彻底崩溃。

在读延时方面,NVMe没有写延时那么有优势,因为写延时只要把数据落在内存就结束了,但是读的话所有每一笔数据都是来自于Flash,这方面最大头的时延其实是在我们的Flash上面。

现在主流的3D TLC Flash已经比2D时代要好了很多了,2D时代MLC还是接近100微秒的读延时,而现在3D Nand有提供各种技术手段把延迟降到50-60微秒的水平,更有极致的产品,例如3D Xpoint和Z-Nand,更加进一步地把Flash上的读延时推进到了10微秒左右的级别。这样的效果,就会使得我们在NVMe SSD上看到的延时效果越来越好,对于用户来说性能感受也就越来越好。

NVMe SSD的性能关注点已从延迟到了QoS

从阶段二的性能追求转向延迟之后,我们又会发现随着硬盘越来越大,一块硬盘4TB、8TB,一个用户他用不到这么大的容量,就会出现两个或多个用户共用一块盘的场景。这时候SSD会面临一些新的挑战,因为当多个应用同时在使用一块硬盘的时候,互相会对对方进行一些干扰。

这样的干扰可能不会体现在IOPS,盘的整体IO性能还是挺高的,但是从每一个用户的角度看来,都会感受到旁边的应用(Noisy Neighbors)影响了自己的正常响应。

多个应用共用一块SSD造成延迟提高(Source: facebook)

在用户的真正场景上,QoS是NVMe SSD发展到第三个阶段要解决的关键问题。在应用共享SSD的时候,应用之间干扰造成延时的巨幅升高。比如其中一个应用程序在用的时候不停在写,这个写的过程就会对另外一个以读为主的应外造成巨大的影响,因为毕竟大家访问的硬盘只有一个。

这个问题怎么解决?我们现在实际上看到了很多解决方案,比如OpenChannel是一个方案,它希望通过对Flash的直接管理能够进行QOS控制。而纯粹为PCIe SSD而生的NVMe 协议,在保障QoS方面也有自己的演进路线。NVMe 1.4中,会有I/O Determinism(下文简称IOD)规范的加入,其中文词义就是I/O的确定性。

IOD的实现手段,是把SSD 分成不同的Set,或者简单理解为逻辑磁盘。具体的Set分配方式,可以看这里的例子:

通过NVM Sets机制对设备进行物理隔离

比如说一个固态硬盘有4通道、8通道、10通道,每个通道上还会有4个、8个、10个LUN,这些LUN可以分别归属到某个Set里,以Set进行管理。同时通过NVMe协议,SSD的LBA空间可以划分成不同的Namespace,可以在新的IOD协议中配置每一个Namespace拥有的Set。这样当用户访问其中一个Namespace,这部分空间是必须要落在一个确定的Flash LUN上面,也就是一个确定的Set上面。

这样的好处很明显,不像磁盘只有一个磁头,盘片在转的时候无论如何只有一个通道能够出数据,而Flash非常不一样,SSD的每片Flash完全可以独立工作,这就推导出:

独立的Flash—— 独立的Set—— 独立的Namespace——独立的应用

在NVMe IOD的设置里面,除了刚才说的Set,还有Endurance Group的概念(如上图),这个可以让SSD进行磨损均衡的管理。如果两个以上NVM Set的Endurance Group ID相同,如图示Set A和Set B(同属Endurance Group Y),磨损均衡可以在NVM Set间进行。如果只有一个NVM Set和Endurance Group ID关联,磨损均衡范围不能跨越该Set,但主机端可以选择跨Set进行寿命管理。

Endurance Group保证NVM Set间磨损均衡

Endurance Group保证NVM Set间磨损均衡

本质上Endurance Group带来的变化是允许Namespace可以跨多个Set。为什么要跨多个Set?后面会讲到Set的使用由于它把Flash进行了隔离,也会带来了一定的带宽损失。如果我们再把Set聚合在一起,应用获得的性能其实可以根据Set的数量线性增长。相当于用户在面对一个有8个、16个Set的SSD时候,需要有多高的带宽就多选几个Set,需要更好的响应就把每个Namespace放在单独的Set上,这些性能全部都是随着你的Set数量进行线性增长,灵活配置。

基于NVM Set的IOD技术使得NVMe SSD在多个应用共用一块SSD时,拥有更好的QoS表现,在下篇文章中,我们将通过两个验证试验对IOD的效果进行详细解读。

举报
评论 0