关键词:
网络栈
存储栈
持久性内存
内存管理
I/O性能优化
摘要:
在互联网与大数据的时代,网络与存储常常处于密不可分的应用场景中。从直接面向终端消费者的云盘、视频社交媒体平台,到数据中心内部的分布式对象存储、块存储和文件系统服务,将网络数据进行存储,亦或将存储的数据发送到网络,这样的应用场景可谓无处不在。在此应用场景下,日益增长的用户数量、数据规模以及服务质量要求推动着网络与存储硬件性能的不断提升。尤其是持久性内存的出现,将存储设备的访存性能提升到了可与主存相比的水准。然而将网络数据进行存储的过程中,还存在着软件开销。数据依次经过网卡驱动、内核网络栈、用户态缓存、内核存储栈和存储设备驱动,这些环节都由软件处理。这条I/O路径很长,且存在多次中断处理、系统调用、数据拷贝开销,带来的延迟可能高达数十μs,相较于新型网络与存储设备不到10μs级别的延迟,已成为新的性能瓶颈。针对这个问题,虽然目前已有许多研究,并提出了包括内核旁路、硬件卸载、内核存储栈优化等多种优化方案。但是这些方案未能将网络栈与存储栈融合为一个整体进行优化,未能充分发挥持久性内存对于双栈融合的关键性作用,同时在CPU资源消耗、易用性、灵活性和扩展性等方面也存在进一步改善的空间。为了改善现有优化方案的上述问题,本文提出了一种工作于内核态的双栈融合高性能数据处理框架Fusion Stk。该框架利用持久性内存将网络栈和存储栈缓存合二为一,实现了双栈整体优化。在此基础上,该框架允许用户将延迟敏感的关键路径操作卸载到处理网络数据包的软中断上下文中,在方便地利用内核现有基础设施的同时,最大程度缩短I/O路径,降低操作延迟。然而,持久性内存的引入让Fusion Stk的内存管理在编程模型、故障一致性保证、分配释放操作性能等方面面临新的挑战。为此本文还提出了一种新的持久性内存堆管理方案Fusion PM,能够在不改变当前内核内存管理相关接口,不降低内存分配释放操作性能的前提下,保证持久性内存管理的故障一致性。最后,本文基于该框架实现了一个高性能块存储服务应用原型Fusion Blk,并与基于传统网络栈和存储栈的实现进行了性能对比测试和结果分析。测试结果显示Fusion Blk的随机写操作的平均软件处理延迟为16.584μs,远低于传统实现的51.542μs,并且随机写带宽可达到测试环境下网卡接收带宽上限。