存储系统的核心是软件,在磁盘存储时代,存储系统软件设计的好坏似乎对性能的影响并不是很大,很多存储软件的设计并不会去考虑计算机的体系架构,也不用去关心操作系统调度、内存拷贝等因素带来的性能影响。对于磁盘存储,事情的确是这样的,原因在于磁盘的性能远远低于CPU处理和访存性能。磁盘存储的性能瓶颈点就在于磁盘本身,因此过多的体系结构级别、竞争资源同步的优化,不会对存储性能带来显著优化。

 

在很久以前做过这方面的实践,当时觉得临界区的资源竞争会对IO性能造成影响,因此,对我们做的一套存储虚拟化系统进行锁资源优化。将全局锁细粒度化,将写锁拆分成读写锁。但是,最终的优化效果微乎其微,原因就在于磁盘本身是性能的瓶颈点,CPU根本就不是问题。

 

但是,当存储介质从磁盘发展成NAND,甚至Xpoint之后,情况将发生根本性的变化。如今NVMe SSD已经在互联网应用中非常普及,很多互联网公司都将NVMe SSD作为基本的高性能存储介质,行业用户也开始使用NVMe SSDNVMe SSD具有非常高的性能,一个普通的2.5NVMe SSD,其读性能可以达到3GB/s、写性能超过1GB/sIOPS将近80万。这种盘的性能远远超过了磁盘,甚至SATA/SAS接口的SSD。盘的性能提升之后,存储软件的设计是否需要发生改变呢?

 

这种改变是肯定的,从存储本身的角度去考虑这种改变,比如NVMe SSD是一种半导体存储介质,不存在磁盘的随机访问问题,因此磁盘存储中所做的IO调度算法对SSD失效了,没有用了。SSD存储软件不需要考虑磁盘抖动的问题,这是一种变化;NVMe SSD具有很高的读性能,那么大量的读Cache可以去掉了,不需要大量的读缓存;SSD的故障模型和磁盘存在很大差别,那么在数据可靠性方面的处理不能采用传统RAID来做了,这又是一个非常重要的变化;NVMe SSD虽然具有极高的写性能,但是和顺序写性能相比,随机小写性能差很多,因此,是否要为SSD做特殊的随机小写优化,这是需要为SSD新考虑的一个问题。除了从存储技术本身的角度来考虑,另外需要从计算机体系结构的角度来重新审视一下新介质对存储性能的影响。

 

SSD具有极高性能之后,存储性能的瓶颈点从后端的磁盘慢慢转移到了CPU端、网络端。并且随着存储介质的进一步提升,软件层面的性能影响变成了主因。未来如果软件层面不做深层次的变革,应用将无法发挥高性能存储介质的性能。下图是Intel在今年IDF上的一张演讲图片。从这张图片中来看,未来Xpoint存储介质的90%性能影响是在软件端,硬件端的性能影响只占了10%。这也说明面向高性能存储介质的存储软件技术的将是行业发展的重点。

 

软件对存储性能的影响​_高性能存储


从计算机体系结构的角度来看,大量的中断处理会对存储性能造成影响。如果中断聚集在一个处理器上,那么该处理器将会成为存储性能的瓶颈点。大量中断也将会影响CPU的处理效率,在高速存储中,一个CPU每秒可以进行80万次IO处理,如果系统中存在多块这样的盘,那么中断的数量是相当可观的。因此,在存储设计中需要考虑海量中断的处理方法,具体方法可以借鉴网络,例如网络中的NAPI技术。在IO比较少的时候采用中断处理方式,这样可以保证IO延迟;在IO数量比较多的时候,可以采用查询机制,避免无效的中断处理。

 

如今,X86的体系结构通常都是多核NUMA架构。这种架构对于存储处理而言存在两个需要考虑的问题,一个是NUMA问题;另一个是多核竞争问题。NUMA问题实际上是一个很难解决的问题,IO和内存都需要保证在一个SOCKET域上才可以保证性能最佳,否则将会引入QPI上的数据传输,导致性能不稳定。多核竞争或者临界区的问题是一个非常棘手的高性能存储问题。以前存储设计过程中,一旦遇到竞争问题,会考虑到采用锁保护的方式,这种方式最为简单和明了。但是,传统存储软件中的锁会严重影响存储的性能。有一个数据可以和大家分享,在SCSI存储栈的request queue中,都会存在一个spin lock,该spin lock实现对request queue的临界资源保护。正因为这一把锁会将SCSI设备的IOPS性能限制在50万以内,并且无论增加多少CPU都无济于事,原因就在于CPU都在这把Spin lock上自旋,无法高效执行。所以,对于高性能存储介质,无锁设计将会变得极其关键和重要。提到无锁设计,一方面是存储软件架构的变动,另一方面就是无锁算法的设计。而无锁算法的设计与实现是极其复杂的,传统软件不需要考虑的一些因素,例如内存屏障,都需要仔细斟酌了。所以,高性能存储设计慢慢的变成了高性能计算问题了。在我们设计的FlashRAID中,具有数据保护的功能,在同样的NVMe SSD上构建具有数据保护功能的逻辑卷,和传统的MDRAID相比,性能有大幅度的提升(如下图所示)。FlashRAID性能提升的一个重要因素在于整个软件栈的设计考虑的计算机体系架构问题,很好的处理了资源竞争的问题,将高性能存储介质的性能得以充分发挥。


软件对存储性能的影响​_高性能存储_02


在操作系统层面,也存在很多影响存储性能的问题,例如内存拷贝、下下文切换等问题。如果应用程序运行在用户态,存储软件栈运行在内核态,那么数据在用户态和内核之间频繁穿越,将会导致性能极具下降,并且会消耗宝贵的CPU资源。CPU频繁的在用户态与内核态之间搬运数据,切换寄存器上下文,真正用来处理IO的效率降低,从而导致存储性能降低。所以,Intel提出了SPDK的项目,呼吁大家用SPDK来开发存储软件,提升CPU效率,将CPU用在刀口上,避免无谓的数据搬运、频繁的低效调度。SPDK是在DPDK的基础上发展起来的软件包。SPDK的构成如下图所示,其核心的思想是将所有的软件运行在用户态,通过查询的方式获取IO事件,然后对IO进行处理。


软件对存储性能的影响​_SPDK_03


SPDK本质上是解决了我前面提到的一些问题,例如中断、内存拷贝、上下文切换等。其有一个很重要的假设就是用户态会运行应用,通过SPDK将存储栈都搬到用户态之后,在整个过程中都不需要内核软件的参与,所以,这种设计也就是Bypass Kernel。其实Bypass Kernel不是目的,解决高性能存储中CPU、网络性能瓶颈的问题才是SPDK最为核心的价值。在我们FlashRAID的设计过程中考虑了CPU、网络性能瓶颈问题,实现的软件即可以内核中运行,也可以在用户态运行,并且实现了和SPDK的集成。通过实际测试发现,存储性能与运行环境无关。所以,重要的不是Bypass kernel,而是解决CPU性能瓶颈的问题。

 

在高性能存储介质慢慢普及之后,一个非常重要的问题将摆在用户的面前。如何用好高性能存储介质?尤其在一个系统中存在多块高性能盘时,如何高效使用这些盘?NVMe SSDXpoint盘进一步发展时,这个问题将会变得越来越严重,有理由相信,不久的将来将会出现更多的高性能存储软件产品及创业公司。