ICCD 2022 Paper 分布式元数据论文阅读笔记整理
问题
基于持久内存(PM)的文件系统需要提供大容量以满足不断增长的应用程序数据量的需求。但由于连接到一个CPU插槽的内存DIMM插槽有限,PM容量仅为数百GB(例如,单个英特尔Optane DC持久内存模块(DCPMM)为128GB/256GB/512GB[1]),因此扩展PM文件系统容量的主要方法是在CPU插槽之间添加多个PM。然而,跨socket访问数据会受到非均匀内存访问(NUMA)架构的影响,由于远程内存访问缓慢和CPU互连(如Intel Ultra Path Interconnect(UPI))的带宽有限,会降低PM文件系统的性能。
挑战
核心问题是难以同时实现:避免远程读写,访存负载均衡,计算负载均衡。
-
在NUMA架构下,PM文件系统可以在任何socket上分配空间。为了减少远程写入,可以采用[15、16]中的首次触摸策略,在运行应用程序线程的本地socket上分配空间和写入数据。然而,首次触摸策略会导致空间利用率和流量热点[17]不平衡,而且无法避免远程读取。也可以通过在所有socket之间分配空间来采用交织策略,这可以均匀地分布数据,并缓解访问热点。但是,交织策略也会导致远程读取和远程写入。
-
PM表现出比DRAM更高的延迟和更低的带宽。因此,现有方法使用基于DRAM的NUMA架构来减少远程访问的,如数据复制[18]和数据迁移[19],但对于PM文件系统来说是昂贵的。也提出了线程迁移来减少NUMA架构下PM文件系统的远程访问[9、15、16、20],但PM的可扩展性很差,迁移线程会增加单个PM上的并发访问,导致CPU负载不平衡[17]。此外,线程迁移成本很高,需要额外的上下文切换并破坏了缓存相关性[19]。
本文方法
本文通过实验表现了NUMA对构建PM文件系统的影响,并提出:(1)完全使PM访问本地化,即使导致远程DRAM访问。远程和混合写以及混合读会导致PM吞吐量显著下降。(2)限制并发PM访问,少量线程即可使PM饱和,增加大量线程会显著降低吞吐量。
提出了NUMA感知PM文件系统NapFS,目标是以低实现成本完全避免远程PM访问并减少PM访问争用。
-
通过数据请求委派来降低远程PM访问。构建每个socket专用IO线程池,仅负责访问本地socket上的数据。读写文件时,应用程序向相应socket的IO线程池发送文件数据请求,由IO线程从本地PM访问数据。为了缓解PM较差的可扩展性,限制了每个线程池中的IO线程数。
-
由于工作负载通常表现出偏斜的访问模式[21],在所有socket上构建了一个全局DRAM缓存,来加速NapFS的整体性能。【很简单的缓存设计,几乎没有任何优化】
-
通过重用现有的单socket PM文件系统(使用NOVA),构建每个socket的本地PM文件系统SockFS,每个SockFS负责持久化属于其本地socket的数据。每个socket的IO线程接收应用程序数据请求后,调用SockFS来持久化数据。对于元数据,选择一个SockFS作为主SockFS,使用主SockFS的私有命名空间维护全局命名空间,应用程序可以调用主SockFS直接执行命名空间操作。并依赖于SockFS的崩溃一致性机制来保证其自身的元数据和数据一致性。
评估结果表明,相比与其他多socketPM文件系统,NapFS将Filebench和RocksDB的吞吐量分别提高了2.2倍和1.0倍。
总结
针对多socket的PM文件系统,现有架构缺少对NUMA架构的优化,导致远程PM读写,访存负载不均衡等问题。本文实验了NUMA架构对PM的影响,提出两个设计原则(1)完全使PM访问本地化,即使导致远程DRAM访问;(2)限制并发PM访问。并设计了NUMA感知PM文件系统NapFS,包括3个技术:(1)通过数据请求委派避免远程PM访问。构建每个socket专用IO线程池,仅负责访问本地socket上的数据。(2)重用单socket PM文件系统(NOVA),构建每个socket的本地PM文件系统,仅负责存储数据,由IO线程调用。使用一个作为主FS,复制全局元数据管理。(3)所有socket上构建全局DRAM缓存,缓存数据和元数据。