文件系统是访问存储的一种常用方式,目前常用的文件系统都是针对磁盘的特性进行设计的。例如,为了解决磁盘随机小数据访问的问题,在文件系统层面引入了Page cache机制,利用内存缓存对这种访问进行加速。大多数业务都会存在数据局部性,因此,通过这种Page cache机制可以很好的提升文件系统的性能。另外,文件系统的数据布局也会考虑磁盘的特性,元数据聚合存放在一起,这样可以高效的实现元数据的存放,避免磁盘抖动。如下图描述,包括文件系统在内的存储软件栈在各个层次都会对磁盘抖动问题进行优化。

 

wKioL1fn6tHQvY3kAACb6EZzsPM720.jpg


NVMe SSD替换磁盘的过程中,我们发现传统文件系统在很多方面表现的不尽人意,导致系统性能变差,无法充分发挥NVMe SSD的性能。其中主要原因有如下两点:


1,  传统存储软件栈采用堆叠式的方式,并且存在较多层级。每个层级封装成一个模块,构成了所谓的“模块化设计”。在面向磁盘的存储系统中,这种设计方式非常好,带来的价值是存储软件栈设计与实现的灵活性。用户需要增加一个功能的时候,可以在软件栈中堆叠一个模块,非常的高效,软件功能与质量可以得到很好的控制。但是,在面向高性能介质的存储系统中,存储盘已经不再是性能瓶颈点的主因,存储软件栈本身变成了严重的性能瓶颈点。而传统的软件栈在设计与实现的时候根本没有考虑自身的瓶颈问题、软件的效率问题,根本没有考虑如何高效使用CPU的问题。从而导致传统软件栈使得处理器的运行效率极低,成了性能瓶颈的主要因素。尤其最近几年处理器往多核化方向发展,基于“存储是IO密集型应用”为指导思想的存储软件栈,很少采用多核并发处理的设计思想,因此无法发挥多核化带来的价值。高性能存储介质恰恰需要多处理器的支持,性能的发挥需要得益于多处理器的能力。在这一点上,传统软件栈的设计存在天然缺陷,其主要原因还是没有考虑到IO性能瓶颈点的转移,所以,存储软件栈在背负较重的情况下,自身成为瓶颈点,性能低下在所难免。


wKiom1fn6tKB_37gAACmLEDbbqE611.jpg


2,  包括文件系统在内的传统存储软件栈的设计是面向磁盘介质的,磁盘介质与高性能NVMe SSD相比存在截然不同的特性。对于NVMe SSD而言不存在随机访问性能抖动的问题;但是会存在业务IO影响写放大的问题,以及个别SSD存在写后读性能极差等问题。面向磁盘设计的一些机制对SSD而言没有价值,并且在有些应用场景下会极大的影响整体性能。例如似乎可以增加随机访问性能的Page cache,在NVMe SSD上会对业务性能造成影响。在随机访问的情况下,Page cache的命中率比较低,并且会不断的在SSD与内存之间进行page页的换入换出,这种频繁的换入换出操作会增加大量的无用操作,在软件设计存在竞争锁的情况下,文件系统的性能表现会大打折扣。


在高性能介质上,我们对比测试了裸盘与文件系统之间的性能。下图对比了4KB8KB在随机访问情况下的性能。从图中可以看出,在4KB8KB随机读情况下,文件系统的性能要远远低于裸盘性能。此时我们发现文件系统在忙于Page Cache的换入换出操作。在4KB8KB随机写情况下,两者性能接近。


wKioL1fn6tLQ5U7RAABnV9Z-k6o584.jpg

64KB128KB大压力数据访问情况下,文件系统与裸盘的性能接近,如下图所示:


wKiom1fn6tLxVT9GAABuDyVf3_g243.jpg

从测试与分析的结果可以看出,Ext4文件系统在随机访问方面性能损失较大,在其他方面两者的性能相近。因此,Page cache等策略在SSD上起到的效果基本没有,可以忽略。此外,我们也可以体会到传统软件栈不仅没有优化高性能存储介质,反而带来了性能以及寿命等方面的影响。所以,SSD在数据中心等应用中大规模使用时,存储软件栈需要做深层次变革。