Lustre 开发社区如何将 ZFS 作为 Lustre 后端文件系统进行推进
有几个正在集成到开源 Lustre 中的开源项目,旨在提高可靠性、灵活性和性能,使 ZFS 中内置的企业级功能与 Lustre 对齐,并增强简化 Lustre 在 ZFS 上部署的功能。
点击此处注册并下载免费的 Intel® Parallel Studio XE 30天试用版
Lustre 是全球十大最快超级计算机中九个都在使用的高性能并行文件系统,它在企业 IT 领域越来越受欢迎。Lustre 的流行不仅是作为科学和技术计算的存储基础,而且还是企业融合技术和办公基础设施的核心(参见意大利银行)。此外,开源开发者社区在 Zetta 文件系统 (ZFS) 上对 Lustre 的持续改进正在加强 Lustre 作为企业解决方案的地位。
Lustre 长期以来一直支持 ZFS。然而,有几个正在集成到开源 Lustre 中的开源项目,旨在提高可靠性、灵活性和性能,使 ZFS 中内置的企业级功能与 Lustre 对齐,并增强简化 Lustre 在 ZFS 上部署的功能。
RAIDZ3 重建速度提升 80 倍
RAIDZ 是 ZFS 软件 RAID 的实现。它有三个恢复级别:RAIDZ1 最多可以恢复一个硬盘故障;RAIDZ2 最多可以恢复两个硬盘故障;RAIDZ3 最多可以恢复三个硬盘故障。RAIDZ1 和 RAIDZ2 类似于 RAID5 和 RAID6。
RAIDZ 覆盖级别决定了奇偶校验生成和驱动器重建计算的处理需求,从最简单的 RAIDZ1 到最复杂的 RAIDZ3。RAIDZ 使用三个方程,分别称为 P、Q 和 R。P 用于 RAIDZ1;P 和 Q 用于 RAIDZ2,P、Q 和 R 用于 RAIDZ3。[1] 重建是计算量最大的操作,因为处理量取决于有多少驱动器发生故障。对于 RAIDZ3,三个驱动器故障需要对每个存储块的 P、Q 和 R 的不同组合进行七次计算才能重建数据。这些是伽罗瓦域上的方程。伽罗瓦域中的操作必须进行仿真,这是算法向量化的主要领域。
Gvozden Nešković 与 Gesellschaft fuer Schwerionenforschung (GSI) 和 Facility for Antiproton and Ion Research (FAIR) 合作,已向 ZFS 主分支提交了一个补丁,该补丁添加了一个用于对所有三个 RAIDZ 级别的 RAIDZ 奇偶校验生成和重建进行向量化的框架。“代码基于二进制伽罗瓦域的向量扩展,”Nešković 表示。“这是具有 256 个元素的有限域数学。”他必须首先重写并优化必要的方程以对其进行向量化。
虽然 RAIDZ1 方程不需要重写,因为它使用无进位加法(通过向量 XOR 操作完成),但他对 RAIDZ2 和 RAIDZ3 方程的重写允许使用向量操作进行计算。“现代多核 CPU 没有内置的伽罗瓦域乘法指令,”Nešković 先生说,“所以我必须修改和优化操作,以利用当今 CPU 中的向量指令集。”
这些方程可以直接使用计算密集型矩阵求逆方法求解,这在 RAIDZ3 重建的原始实现中完成,或者可以使用综合征进行优化,这在 RAIDZ2 重建的原始实现中完成。Nešković 先生在 RAIDZ2 和 RAIDZ3 中都使用了综合征以加快计算速度。
在他的新代码在基准测试中运行时,使用英特尔® AVX2 指令集在英特尔® 处理器(例如英特尔® 至强® E5 v4 家族处理器)上,RAIDZ3 三硬盘重建的速度提升了 80 倍以上。Nešković 先生的工作涵盖了优化所有方程和使用综合征实现新结构。下表显示了与原始未优化代码相比的速度提升结果,该结果是在标量处理器上运行其优化版本的原始代码,并在支持 SSE 和英特尔 AVX2 的处理器上运行向量化操作。
在火焰图(下图)中,RAIDZ3 奇偶校验生成(或 PQR 奇偶校验)处理时间的减少很容易看出。使用 Fletcher4 算法进行校验和处理时间作为参考(它们在原始代码和改进代码中花费相同的时间),我们可以看到 Nešković 先生的工作为 RAIDZ 计算时间带来了显著的改进。
“我贡献了一个用于 RAIDZ 奇偶校验操作的通用框架,它允许轻松集成向量指令。我以此为基础实现了 x86 的 SSE 和 AVX2 变体。同一框架正在用作其他平台的基础,”他评论道。
“加速 RAIDZ 对 GSI 意味着我们可以将更少的内核用于奇偶校验和重建处理。如果我们可以在大型服务器上只使用一个内核进行 RAIDZ 处理,我们就可以将内核解放出来用于其他工作,并减少对更多服务器的需求。这节省了使用 RAIDZ 作为高可用性和可靠性的 ZFS 后端文件系统来构建和运行 Lustre 集群的成本,”Nešković 补充道。他在 Lustre 用户组 (LUG) 上关于其工作的演讲可以在此处找到;视频在此处。
创建 Lustre 快照
ZFS 的一个有价值的功能是创建文件系统在特定时刻捕获的可挂载、只读快照。这创建了 Lustre 文件系统的全局视图,可用于多种目的,从恢复文件到创建备份,再到使用户能够随时间查看数据差异等等。到目前为止,ZFS 快照的访问权限并未内置于 Lustre 中。但是,英特尔高性能数据部门 (Intel HPDD) 的范勇正在为带有 ZFS 后端文件系统的 Lustre 添加 ZFS 快照功能。他们的项目创建了几个新的命令行,可从 Lustre 控制台访问,这些命令行又在 Lustre 和 ZFS 环境中执行例程。
创建快照的过程非常快,因为它利用了写入时复制文件系统,而不是复制整个文件系统的数据。快照过程的核心是创建一个全局写入屏障,该屏障等待现有事务完成并阻止新事务在创建快照时启动。“创建快照很快,”范勇说。“设置系统来完成这项工作很耗时,因为我们必须在整个池中创建全局写入屏障。”
屏障通过逐个锁定每个元数据目标 (MDT) 上的事务来冻结文件系统,从而在快照期间阻止对元数据的任何更改。“理论上,这听起来很简单,”勇说。“高效地实现它却并非如此。”
用户在命令行中为快照指定自己的唯一名称以创建屏障
lctl barrier_freeze <fsname>[timeout(seconds)]
创建后,用户可以将快照作为只读文件系统挂载到客户端。快照之后,单独的命令“解冻”屏障并提供快照状态。还创建了新命令以分叉和擦除配置日志。
勇的研究和基准测试表明,虽然写入屏障可能需要几秒钟才能完成,但它在其测试系统中具有高度可扩展性,并且随着 MDT 数量的增加变化很小。对 MDT IO 性能的影响最小,这使得等待快照非常有价值,因为可以在给定时刻获得文件系统的完整图像。
勇的工作是多阶段且正在进行的。具有快照功能的第 1 阶段预计将登陆 Lustre 2.10。未来的工作将集成其他功能,例如自动挂载快照和其他功能。勇在 LUG 2016 上的演讲可以在此处找到,视频在此处。
使元数据性能可扩展且快速
元数据服务器性能一直是 Lustre 在 ZFS 部署中的一个挑战领域。历史上,Lustre 的 ldiskfs 比 ZFS 快一个数量级,其中大部分是由于元数据服务器的性能。为了缓解这种情况,一些集成商将后端文件系统与基于 ldiskfs 的元数据服务器和基于 ZFS 的对象服务器混合使用。但是,英特尔 HPDD 的 Alexey Zhuravlev 所做的工作使元数据服务器性能得到了显著改善。
Zhuravlev 先生对基于 ZFS 的 MDSs 进行了一项调查,他发现“有几个领域会出现瓶颈。有些是由于 Lustre 代码,有些是由于 ZFS。”声明时间是一个显著的瓶颈,ldiskfs 在所有声明操作上的时间仅是 ZFS 的一小部分。“声明越具体,它在 ZFS 上的成本就越高,”Zhuravlev 补充道。而 Lustre 声明非常具体,结果证明这并非必需。Lustre 补丁 LU-7898 已登陆 Lustre 2.9,使 ZFS 声明时间与 ldiskfs 保持一致。
ZFS dnodes 也对 Lustre 构成了性能挑战,因为它们尺寸小。ZFS 0.6.5 dnodes 为 512 字节,不足以容纳 Lustre 的扩展属性。如果 dnode 中没有足够的空间,ZFS 将创建一个额外的块,称为溢出块,并用它来存储扩展属性。但是访问溢出块会导致额外的磁盘寻道。“创建一百万个文件需要超过八 GB 的原始写入,”Zhuravlev 评论道。一个可变 dnode 的补丁将登陆 ZFS 主分支 0.7 版本,该补丁将允许 dnode 大小从 512 字节到几 KB,从而消除了查看溢出块的需要,预计这将使磁盘寻道减少一半。“通过 ZFS 和 Lustre 中的大 dnode 支持,一百万个文件现在只需要一 GB 的原始写入,”Zhuravlev 补充道。此外,ZFS 不支持 dnode 记账,Lustre 实现了自己的文件配额原始支持,这非常昂贵且扩展性不佳。补丁 LU-2435 几乎准备好登陆,它将为 ZFS 添加原生 dnode 记账。“我们估计 dnode 记账的性能将具有高度可扩展性且性能更高,”Zhuravlev 表示。
对声明时间(Lustre 2.9)、dnode 大小增加(ZFS 0.7)和 dnode 记账(Lustre 2.10)的修复正在显著改善 ZFS 上的 MDS 性能,提供高可扩展性和有望超越 ldiskfs 的性能。
“我们继续致力于 ZFS 上的 MDS 性能,”Zhuravlev 补充道。“我们正在积极寻找其他优化并与上游 ZFS 社区合作。”他在欧洲开放文件系统 (EOFS) 2016 年 Lustre 管理员和开发人员研讨会上介绍了他的工作。他的演讲在此处。
大 IO 流式传输改进
Lustre 在 ZFS 上的写入性能接近其理论最大值,但块分配不是文件感知的,因此它倾向于将块分散到磁盘上,这意味着当文件被读回时需要更多的磁盘寻道。这使得 ZFS 上 Lustre 的读取性能滞后于写入性能,正如英特尔 HPDD 的熊金山在 LUG 2016 上介绍的那样。2015 年期间已落地许多补丁,这些补丁有助于 ZFS 上的性能,包括熊金山对使用 Intel AVX 指令计算校验和的 Fletcher 4 算法的向量化。
正在进行额外的 IO 性能工作并将其上游到 ZFS on Linux 项目,预计将登陆 Lustre 2.11。这项工作包括
- 增加 Lustre 对 16 MB 块大小的支持——ZFS 已支持——这将增加写入每个磁盘的数据块的大小。更大的块大小将减少磁盘寻道并提高读取性能。这反过来将需要支持动态 OSD-ZFS 块大小以防止读/修改/写操作的增加。
- 实施 dRAID 机制而不是 RAIDZ,以在驱动器发生故障时提高性能。对于 RAIDZ,磁盘组的吞吐量受到备用磁盘带宽的限制。dRAID 将使用一种机制,将数据分配到剩余磁盘上的备用块。即使由于驱动器故障而导致组性能下降,吞吐量也有望提高。
- 创建单独的元数据分配类,以允许专用的高吞吐量 VDEV 用于存储元数据。由于 ZFS 元数据更小但很基础,因此更快地读取它将提高 IO 性能。VDEV 应该是一个 SSD 或 NVRAM,并且可以进行镜像以实现冗余。