ISPA 2009 Paper 分布式元数据论文阅读笔记整理
问题
计算科学需求导致了越来越大的并行计算机和对应的存储系统。此环境中使用的并行文件系统越来越专业化,以牺牲其他潜在工作负载为代价,为大型I/O操作提取尽可能高的性能。
但许多应用程序的自然I/O模式会导致生成许多小文件。例如,国家能源研究科学计算中心2007年的研究表明,该系统包含1300多万个文件,其中99%的文件低于64MB,43%的文件低于64 KB[1]。太平洋西北国家实验室2007年的研究表明,在该系统上的1200万个文件中,94%的文件低于64 MB,58%的文件低于64KB[2]。使得当前大规模的并行文件系统不能很好地服务于这些应用程序。
挑战
访问并行文件系统上的大量小文件将I/O挑战从提供高聚合I/O吞吐量转移到支持高并发元数据访问率。用于提高文件系统元数据速率的最常见技术是客户端缓存。然而,HPC系统有大量的多核处理器,每个核只有少量的本地RAM,这些系统上的应用程序通常使用大部分内存,几乎没有留下缓存空间。此外,保持一致性和从故障中恢复的传统技术并不是为这种规模的使用而设计的。
本文方法
本文描述了在并行文件系统中为超大规模系统优化小文件访问的五种技术,并在并行虚拟文件系统(PVFS)中实现。
两个测试平台上进行系统评估,与使用16384个内核的领先计算平台上的基线PVFS配置相比,小文件创建率提高了905%,小文件统计率提高了1106%,小文件删除率提高了727%。
服务器驱动的文件预处理
现有文件创建方法有两个限制:必须发送n+3条消息来创建一个在n个对象上分条的文件,操作的延迟限制了客户端创建文件的速率,同时会产生大量的消息流量。其次,这些操作的延迟都不会对客户端隐藏,必须等待所有这些操作完成后才能更新元数据,必须等待元数据更新完成后才能创建目录项。
通过预创建文件系统对象解决了这两个问题。每个MDS都使用一个特殊的批创建操作来抢先联系IOS,并生成一组数据对象,用于后续文件创建。客户端使用增强创建操作来请求MDS同时执行PVFS文件创建的前三个步骤:分配本地元数据对象,将预分配的数据对象与新文件关联,并填写分发函数。然后,客户端执行目录条目插入。当MDS上预分配对象的列表不足时,它会使用批创建操作在后台重新填充列表。
预创建方法的最终结果是客户端只发送两条消息,而且由于本地I/O的数量和预创建对象的消息数量都很小,因此开销很低。此外,创建对象所花费的时间对客户端是隐藏的。
文件填充
如果一个文件的大小不超过一个条带的大小,那么除了第一个数据对象之外,其他所有数据对象都将保持为空。在这种情况下,分配这些对象无意义。其次,这些对象使文件大小的计算复杂化。PVFS不跟踪MDS上的文件大小,客户端需要与IOSE通信以收集部分文件大小,并使用这些数据来计算最终文件大小。
当MDS接收到增强创建操作时,服务器分配一个本地元数据对象和一个本地数据对象来保存第一条数据,然后填充分发函数,用指示文件已填充的属性标记文件。它将新的元数据对象句柄返回给创建目录项的客户端。在这一点上,我们有一个“填充”的PVFS文件,它是一个只分配了一个数据对象的文件,并且该对象与元数据对象分配在同一服务器上。
填充有两个主要影响。首先,显著减少了创建的数据对象的数量(只要文件保持较小),这样可以减少预创建消息的数量。此外,stat操作不再需要来自额外服务器的信息来获取小文件的文件大小,从而大大减少了统计数据收集过程中的通信。
元数据提交合并
PVFS通过要求在客户端收到完成通知之前将修改元数据的操作提交到存储中来确保磁盘上的元数据一致性。PVFS对Berkeley DB的脏页进行刷新(调用sync()),有效地序列化元数据写入。
为了在不同的工作负载下同时实现降低延迟和提升吞吐量,PVFS MDS在低器负载下每次操作都执行磁盘刷新,并随着并发修改操作数量的增加而动态合并刷新操作,从而在密集的元数据工作负载下降低刷新频率并提高服务器吞吐量。
采用操作队列进行控制,根据队列大小衡量负载密集程度,低于阈值直接刷新,高于阈值则合并刷新。
读取和写入的EagerI/O
MPI实现为移动不同大小的消息提供了不同的机制,通常至少提供两种模式:大消息的Rendezvous模式和小消息的Eager模式。在Rendezvous模式下,接收器必须在发送数据之前做出确认,以确保接收器上有空间容纳传入数据。在Eager模式下,发送方立即将数据推送到接收方,从而最大限度地减少延迟。
目录访问的POSIX扩展
在大多数情况下,目录读取之后是对目录中每个项的stat操作,但POSIX接口强制将目录读取与统计信息收集分离,并强制将每个stat操作单独执行。
提出一个新的调用readdirplus,允许将目录读取请求与对目录中每个对象的统计信息的请求结合起来。首先执行readdir请求来收集对象列表;接下来将listattr请求发送到持有相关对象的MDS(每个服务器一个请求),获取目录和填充文件的所有元数据,以及条带文件的相关数据对象;最后,将第二轮listattr请求发送到具有相关对象的IOS(每个服务器一个请求),以获得用于计算文件大小的对象大小。
总结
针对用于HPC应用的并行虚拟文件系统(PVFS),许多应用程序的自然I/O模式会生成许多小文件,但现有并行文件系统不能很好地支持小I/O访问。本文提出5个技术:(1)文件预处理:创建文件前提前生成数据对象,减少通信的消息数量。(2)文件填充:对小文件进行填充,显著减少了创建的数据对象的数量,同时stat操作不再需要额外获取小文件的文件大小,减少了数据收集的通信。(3)元数据提交合并:采用操作队列进行控制,根据队列大小衡量负载密集程度,低于阈值直接刷新,高于阈值则合并刷新。(4)两种I/O模式:大I/O接收器必须在发送数据之前做出确认,以确保有足够空间;小I/O发送方立即将数据发送到接收方,从而减少延迟。(5)readdirplus扩展,通过readdirplus调用将目录读取请求与对目录中对象统计请求合并。