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

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

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

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

PCIe SSD的性能追求阶段二:I/O低延迟

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

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

那么NVMe SSD为保障极低的延迟做了什么?从系统整体的I/O路径来看,NVMe比原来的SATA 多了很多优势。SATA SSD的指令需要从CPU和内核走到南桥,再通过低速(6Gb/s)、低并发(single bit,没有多Lane并发)、高冗余(8Bit/10Bit编码)的SATA总线走到SSD上,再加上SATA 协议层的冗长低效,导致它天生延时就非常高。

而NVMe通过PCIe直接连接到CPU内部,高速(8Gb/s)、高并发(x4或x8 Lane并发)、低冗余(128Bit/130Bit编码)、协议优化交互设计都使得延时大幅降低。当前主流PCIe SSD写延时(4K)都已经降到20微秒以下,Memblaze自研的产品可以做到10微秒左右。这一速度体现在大量应用中,就是顺序写、小带宽、小压力的写等负载都可以得到快速响应。

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

在读延时方面,NVMe SSD没有写延时那么有优势,因为写延时只要把数据落在内存就结束了,但是读请求需要获取Flash上的数据,整个过程的最大延迟也在这个环节上。

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

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

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

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


当谈PCIe SSD的高性能,我们在谈什么(上)
多个应用共用一块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分配方式,可以看这里的例子:


当谈PCIe SSD的高性能,我们在谈什么(上)
通过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→独立的应用


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

其中在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进行寿命管理。

当谈PCIe SSD的高性能,我们在谈什么(上)
Endurance Group保证NVM Set间磨损均衡

本质上Endurance Group带来的变化是允许Namespace可以跨多个Set。为什么要跨多个Set?由于Set把Flash资源进行了隔离,每个Set只拥有一部分的Flash带宽。如果我们再把Set聚合在一起,Flash带宽性能也能重新聚合在一起。这样一来,用户在面对一个有8个Set的SSD时候,可以依据自身带宽等需求选择Set的数量。带宽需求高的应用,就多分配几个Set给它的Namespace,这样性能随着Set数量进行线性增长,灵活配置。

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

本文中提到的命名空间等技术可以在本博客之前的文章中找到。