吞吐量 10 倍提升!分布式文件系统性能优化创新方案
在高性能计算(HPC)领域,数据存储和 I/O 性能对于应用程序的运行效率至关重要。Buffered I/O 和 Direct I/O 是两种在 HPC 集群中常用的数据访问模式,但它们各自有其局限性。
焱融将带大家一起深入探讨“Combining Buffered I/O and Direct I/O in Distributed File Systems”研究论文中,针对分布式文件系统 I/O 性能瓶颈提出的高效优化策略——AutoIO。
AutoIO,旨在结合 Buffered I/O 和 Direct I/O 的优点,通过动态切换机制来适应不同的 I/O 访问模式和系统状态,其设计和实现考虑了 I/O 请求的大小、文件锁定争用和内存约束等多个因素,使得在不同的工作负载和系统状态下都能选择最合适的 I/O 模式。实验结果表明,AutoIO 在多种基准测试和现实的工作负载中,相比传统的 Lustre 文件系统和其他分布式文件系统显示出显著的性能提升。
HPC 集群存储挑战解析
I/O 性能瓶颈:随着 HPC 应用程序核心数量的扩展,其 I/O 量也相应激增,I/O 性能成为许多应用的性能瓶颈。特别是来自机器学习和人工智能等新的 HPC 应用程序,正在催生新的访问模式,对文件系统的优化造成挑战。
缓存管理开销:文件系统通常将数据和元数据缓存在主存中,以减少存储后端所需的 I/O 数量。然而,Buffered I/O 涉及在内核缓存与应用程序之间的数据移动,开销相当大。此外,当系统内存资源变得紧张时,页面回收机制会释放旧的页面以分配给当前的 I/O 操作,这一过程可能引发高速缓存抖动,进而显著影响性能。
分布式范围锁的管理成本:在并行文件系统中,Buffered I/O 面临的一个额外成本在于管理复杂的分布式范围锁,这是为了支持具有强一致性的客户端缓存所必需的。为了提高文件系统的并发访问效率,如果仅对文件中必要(小)部分进行锁定,则需要频繁地在客户端和锁管理器之间进行远程过程调用( RPCs ),如果采用更广泛的扩展锁,虽然可以减少 RPCs 的数量,但也可能增加因锁撤销消息处理不当而导致的错误锁竞争的风险。
存储系统的扩展性和灵活性:存储系统需具有良好的扩展性,以便在未来轻松扩展存储容量。同时,存储系统需要灵活地适应不同的数据访问模式,包括随机访问和顺序访问。
Direct I/O 的使用限制:Direct I/O 的性能优势是建立在遵循特定的对齐标准之上的。这些对齐标准确保了数据的传输能够直接映射到存储设备的物理块上,避免了不必要的数据拷贝和内核干预,但是这些对齐要求是由底层硬件和操作系统的设计共同决定的。
Buffered I/O 和 Direct I/O:HPC 数据访问模式对比
Buffered I/O 和 Direct I/O 是两种在高性能计算( HPC )集群中常用的数据访问模式,它们各自具有独特的优势和局限性。以下是根据文档内容对这两种 I/O 模式的深入比较:
![](https://static001.geekbang.org/infoq/ca/cae0d62b4ef049a5c4baf8e7d5eb2052.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
两种 I/O 模式的比较
Buffered I/O,作为大多数操作系统的默认模式,主要优势在于其对应用程序的友好性和性能优化。它通过操作系统的页面缓存机制,自动执行数据的预读取和回写操作,这有助于减少对后端存储系统的 I/O 请求次数,尤其是在数据被频繁访问时。此外,Buffered I/O 简化了编程模型,因为它不需要应用程序开发者处理复杂的 I/O 对齐和大小问题。然而,Buffered I/O 的性能可能会受到页面缓存管理开销的影响,特别是在内存资源紧张或缓存命中率差的情况下,缓存抖动可能会显著降低性能。
Direct I/O,允许应用程序绕过操作系统的页面缓存,直接与存储设备交互。这种方法特别适合于大文件的顺序读写操作,因为它避免了数据在用户缓冲区和内核缓存之间的不必要复制,从而降低了 CPU 的利用率,并可能提供更高的吞吐量。Direct I/O 在处理大量数据时,尤其是在内存压力较大或文件锁定争用频繁的场景中,可以减少性能损耗。但是,Direct I/O 要求应用程序满足严格的对齐和大小约束,这可能增加了编程的复杂性,并限制了其在某些情况下的使用。
AutoIO 智能切换 IO 模式,高效应对 HPC 存储挑战
AutoIO 的设计和实现是为了解决高性能计算集群中的数据存储挑战,尤其是在处理大规模并行 I/O 操作时的性能瓶颈问题。AutoIO 的核心在于动态切换 Buffered I/O 和 Direct I/O 模式,以适应不同的 I/O 请求特征和系统状态。这种动态切换的决策不仅基于 I/O 请求的大小,还考虑了文件锁定争用和内存约束等因素。
在实现方面,AutoIO 在 Lustre 文件系统的客户端和服务器端进行了集成。客户端的 AutoIO 决策引擎根据 I/O 请求的大小、系统内存压力、文件锁定状态以及数据访问的局部性来智能选择最合适的 I/O 模式。如果 I/O 请求小于预设的小 I/O 阈值,则使用 Buffered I/O;如果请求大小大于或等于大 I/O 阈值,则使用 Direct I/O。对于介于两个阈值之间的请求,AutoIO 默认使用 Buffered I/O,但在检测到锁争用或内存压力时会切换到 Direct I/O。
![](https://static001.geekbang.org/infoq/cf/cf9396c97fab1129df6c64b2ddd9fc97.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
AutoIO 决策算法
AutoIO 还引入了服务器端自适应锁定机制,以减少在高并发环境下的锁争用问题。此外,它实现了延迟分配技术,通过在数据被刷新到磁盘之前延迟块分配,来减少文件碎片化并提高 I/O 性能。对于 Direct I/O,AutoIO 支持未对齐的 I/O 操作,通过在内核中创建对齐的缓冲区来处理不对齐的用户缓冲区。
为了进一步提高性能,AutoIO 还包括了自适应回写缓存模式,该模式允许 Lustre 服务器在处理小 I/O 请求时切换到 Buffered I/O 模式。这种模式特别适用于对延迟敏感的 I/O 请求,如小文件的读写操作。此外,AutoIO 通过跨文件批处理技术,将多个小文件的脏页合并为一个大的批量 RPC,提高了网络和磁盘效率。
AutoIO 的设计和实现通过一系列微基准测试、宏基准测试和真实世界的高性能计算负载进行了评估。实验结果表明,与原始的 Lustre 版本相比,AutoIO 在现实工作负载中实现了高达 3 倍的吞吐量提升,并且比其他包含不同程度的 Direct I/O 支持的分布式文件系统分别高出 13 倍和 10 倍。这些结果证明了 AutoIO 在提升分布式文件系统 I/O 性能方面的有效性和潜力。
AutoIO 的贡献与性能提升方向
在 HPC 领域,研究人员和工程师们一直在探索提高数据存储和 I/O 性能的方法。相关工作主要集中在避免页面缓存带来的开销、优化分布式锁定管理器以及动态 I/O 路径和模式选择。例如,直接访问存储设备和使用 DAX 接口来绕过页面缓存,都是为了减少内核 I/O 堆栈的开销。
此外,分布式文件系统中的缓存策略研究,如客户端回写缓存和 I/O 缓存中间件,旨在提高数据访问的效率。动态 I/O 路径选择的研究,如 PVFS 中的文件句柄丰富方案和 BPIO 库,都是为了更好地适应应用程序的 I/O 行为。然而,这些方法通常关注于数据放置,而不是在不同 I/O 模式之间进行动态切换。
本文提出的 AutoIO 方法,通过在分布式文件系统中动态切换 Buffered I/O 和 Direct I/O 模式,成功地解决了 HPC 集群中的数据存储挑战。
未来将集中在进一步优化 AutoIO 的性能和适应性。首先,将对不同的 I/O 大小、阈值和文件系统配置进行广泛的性能分析,以细化 AutoIO 的决策过程。其次,计划探索基于机器学习的方法来预测系统状态和 I/O 模式的最佳选择,从而实现更智能的自适应 I/O 路径选择。此外,将研究服务器端的算法,以在回写模式和通写模式之间进行动态切换,进一步考虑服务器的状态和资源可用性。这些研究方向旨在进一步提升 HPC 集群的数据存储性能,满足日益增长的计算需求。
评论