PVFS:用于 Linux 集群的并行虚拟文件系统
使用网络文件系统是在类 UNIX 系统(包括 Linux)上共享磁盘空间的常用方法。Sun 公司率先采用了这项技术,推出了网络文件系统 (NFS),它通过网络提供文件共享。NFS 是一种客户端/服务器系统,允许用户查看、存储和更新远程计算机上的文件,就像它们位于用户自己的计算机上一样。NFS 从那时起已成为 UNIX 社区中文件共享的标准。它的协议使用计算机之间通信的远程过程调用方法。
使用 NFS,用户或系统管理员可以挂载整个文件系统或一部分文件系统。您文件系统中被挂载的部分可以使用您访问每个文件所附带的任何权限(只读或读写)进行访问。
随着这种类型系统的普及和实用性不断增长,出现了更多的网络文件系统。这些新系统在可靠性、安全性、可扩展性和速度方面都取得了进步。
作为我在加拿大爱立信研究公司系统研究部门的职责之一,我评估了 Linux 网络文件系统,以决定为我们的 Linux 集群采用哪些网络文件系统。在这个阶段,我们正在试验 Linux 和集群技术,并尝试构建一个提供极高可扩展性和高可用性的 Linux 集群。
构建这样一个系统的一个重要因素是选择与之一起使用的网络文件系统。经过测试的文件系统包括 Coda、Intermezzo、全局文件系统 (GFS)、MOSIX 文件系统 (MFS) 和并行虚拟文件系统 (PVFS)。在考虑了这些和其他选项后,我们决定采用 PVFS 作为我们测试 Linux 集群的网络文件系统。我们还在使用 MOSIX 文件系统作为 MOSIX 软件包(参见“资源”)的一部分,该软件包增强了 Linux 内核的集群计算能力。
在本文中,我们将介绍我们对 PVFS 系统的初步体验。我们首先讨论 PVFS 系统的设计,以帮助读者熟悉 PVFS 的术语和组件。接下来,我们将介绍在蒙特利尔爱立信系统研究实验室的 7 CPU Linux 集群上的安装和配置。最后,我们将讨论 PVFS 系统的优点和缺点,以帮助其他人决定 PVFS 是否适合他们。
Linux 集群技术已经成熟,并在过去几年中经历了许多改进。商品硬件速度有所提高,并行软件也变得更加先进。然而,输入/输出 (I/O) 支持传统上落后于计算进步。这限制了处理大量数据或依赖核外计算的应用程序的性能。

图 1. PVFS 系统架构
PVFS 的构建有两个主要目标。首要目标是为进一步研究 Linux 集群上的并行文件系统提供平台。第二个目标是满足对此类集群高性能并行文件系统日益增长的需求。PVFS 的目标是
为多个进程对公共文件进行并发读/写操作提供高带宽
支持多种 API,包括原生 PVFS API、UNIX/POSIX I/O API 以及 MPI-IO(通过 ROMIO)
支持常见的 Unix 实用程序,例如 ls、cp 和 rm,用于 PVFS 文件
提供一种机制,使为 UNIX I/O API 开发的应用程序无需重新编译即可与 PVFS 一起工作
提供稳健性和可扩展性
易于安装和使用
集群中的一台机器或节点可以在 PVFS 系统中扮演多种角色。可以将节点视为三种不同类型中的一种或多种:计算节点、I/O 节点或管理节点。通常,单个节点将充当管理节点,而节点的一个子集将是计算节点,另一个子集将充当 I/O 节点。也可以将所有节点都用作 I/O 节点和计算节点。
PVFS 以一组守护进程和一个用于访问文件系统的调用库的形式存在。有两种类型的守护进程:管理守护进程和 I/O 守护进程。通常,单个管理守护进程在管理节点上运行,而多个 I/O 守护进程在 I/O 节点上运行。调用库供计算节点或客户端节点上运行的应用程序使用,以便与管理守护进程和 I/O 守护进程通信。
管理守护进程或管理器有两个职责:验证访问文件的权限以及维护 PVFS 文件的元数据。所有这些任务都围绕元数据文件的访问展开。只需要一个管理守护进程来为文件系统执行这些操作,并且单个管理守护进程可以管理多个文件系统。管理器还负责维护文件系统目录层次结构。计算节点上运行的应用程序在执行诸如列出目录内容、打开文件和删除文件等活动时与管理器通信。
另一方面,I/O 守护进程的唯一目的是访问 PVFS 文件数据以及协调自身与应用程序之间的数据传输。应用程序和 I/O 服务器之间建立直接连接,以便在读写操作期间直接交换数据。
有几种选项可以为客户端节点提供 PVFS 访问。首先,有一个共享的或静态的库,可以使用其原生接口与文件系统交互。但这需要专门编写应用程序来使用诸如 pvfs_open 之类的函数。作为替代方案,有两种访问方法可以提供透明访问。首选方法是使用 PVFS 内核模块,它允许通过 Linux VFS 机制进行完全访问。此可加载模块允许用户像挂载任何其他传统文件系统一样挂载 PVFS。另一个选项是使用 PVFS 提供的一组 C 库包装器。这些包装器直接捕获对诸如 open 和 close 之类函数的调用,然后再到达内核级别。这提供了更高的性能,但缺点是兼容性不完整,并且包装器仅适用于某些受支持的 glibc 版本。
最后一个选项是使用 MPI-IO 接口,它是 MPI-2 标准的一部分,用于并行应用程序中的消息传递。PVFS 的 MPI-IO 接口通过 ROMIO MPI-IO 实现(参见“资源”)提供,并允许 MPI 应用程序在访问 PVFS 时利用 MPI-IO 的功能。它还确保 MPI 代码将与其他 ROMIO 支持的并行文件系统兼容。
蒙特利尔爱立信的测试系统最初是一个由七个无盘 Pentium 级 CPU 组成的集群,每个 CPU 配备 256MB RAM。这些 CPU 首先使用制造商提供的工具在闪存上编写的最小内核启动。然后,它们获取其 IP 地址并从充当 DHCP 和 TFTP 服务器的 Linux 盒下载 RAM 磁盘。同一台机器还充当 CPU 的 NFS 服务器,提供共享磁盘空间。
当我们决定试验 PVFS 时,我们需要一些带有磁盘的 PC 来充当 I/O 节点,还需要一台 PC 来充当管理节点。我们添加了一台机器 PC1 作为管理节点,并添加了三台机器 PC2、PC3 和 PC4,总磁盘空间为 35GB,作为 I/O 节点。集群的新地图变为
七个无盘客户端 CPU
一个管理节点
三个 I/O 节点
虽然 PVFS 开发人员为所有类型的节点提供 RPM,但我们选择重新编译源代码,以便优化在无盘客户端上的安装。使用 PVFS tarball 软件包,这一切都顺利完成。对于管理器和 I/O 节点,我们使用了相关的 RPM 软件包。管理器和 I/O 节点使用 Red Hat 6.2 发行版和 2.2.14-5.0 内核。无盘 CPU 运行定制的 2.2.14-5.0 内核最小版本。
设置 PVFS 管理器的第一步是下载 PVFS 管理器 RPM 软件包并安装它。PVFS 默认安装在 /usr/pvfs 下。自动安装完成后,需要创建配置文件。PVFS 需要两个配置文件才能运行:“pvfsdir”,它描述 PVFS 的目录;“iodtab”,它描述 I/O 守护进程的位置。这些文件是通过运行 mkiodtab 脚本(以 root 身份)创建的
[root@pc1 /root]# /usr/pvfs/bin/mkiodtab
有关并行虚拟文件系统的 iodtab 设置,请参见列表 1。它还将在根目录中创建 .pvfsdir 文件。
当我们在管理器 PC1 上运行 mkiodtab 时,它抱怨没有找到 I/O 节点。结果证明是我们忘记在 /etc/hosts 中包含我的 I/O 节点的条目。我们更新了 /etc/hosts 文件并重新运行 mkiodtab;一切顺利。mkiodtab 在 /pvfs 下创建了一个名为“iodtab”的文件。此文件包含我的 I/O 节点的列表。它看起来像这样
------------/pvfs/.iodtab------------ pc2:7000 pc3:7000 pc4:7000 -------------------------------------
I/O 守护进程软件使用的默认端口号,允许客户端通过网络连接到它是 7,000。
运行 mkiodtab 后,我们执行以下操作以启动 PC1 作为 PVFS 管理器
Start the manager dæ: % /usr/pvfs/bin/mgr % /usr/pvfs/bin/enablemgr
在管理节点上运行 enablemgr 可确保下次机器启动时守护进程将自动启动,因此无需在重新启动后手动启动。enablemgr 命令只需要运行一次即可设置适当的链接。

图 2. PVFS 条带化和分区
I/O 节点的安装同样简单。首先,我们安装了 RPM,然后按如下方式启动每个 I/O 守护进程
% /usr/pvfs/bin/iod % /usr/pvfs/bin/enableiod
在 I/O 节点上运行 enableiod 可确保下次机器启动时守护进程将自动启动。enableiod 命令只需要运行一次即可设置适当的链接。
I/O 守护进程依赖于配置文件 /etc/iod.conf 来告诉它们在哪里存储数据。此文件由 RPM 自动创建,并指示 I/O 守护进程将数据存储在名为 /pvfs_data 的目录中。我们在每个 I/O 节点上使用以下命令创建了这个目录
% mkdir /pvfs_data
客户端 CPU 的安装更加精细,因为如上所述,我们需要最小化安装,以减少 RAM 磁盘上的空间使用量。我们用于客户端节点的最小安装文件集是
------------ List of files installed on the Compute Nodes ------------- /etc/pvfstab /usr/local/pvfs/pvfsd /usr/local/pvfs/pvfs.o /usr/local/pvfs/mount.pvfs /usr/local/pvfs/libpvfs.so.1.4 -------------------------------------------------------------------------
/etc/pvfstab 供计算节点用于确定管理器和 PVFS 文件的位置。它的格式与 /etc/fstab 文件非常相似。对于我们的设置,/etc/pvfstab 文件看起来像这样
----------------/etc/pvfstab-------------------- pc1:/pvfs /pvfs pvfs port=3000 0 0 ------------------------------------------------此配置文件指定了
管理节点是 PC1
管理器存储元数据的目录是 /pvfs
PVFS 文件系统挂载在客户端的 /pvfs 上
管理器正在监听的端口是 3000
/usr/pvfs/bin/mount.pvfs 是 PVFS 提供的特殊挂载命令。客户端 CPU 使用它将 PVFS 文件系统挂载到本地目录。对于这些 CPU,我们创建了一个小的 shell 脚本 /etc/rc.d/rc.pvfs,该脚本在 CPU 启动时执行,以确保它们自动启动为 PVFS 计算节点,无需任何手动干预。rc.pvfs 的内容如下
-----------------/etc/rc.d/rc.pvfs------------------ #!/bin/sh /bin/mknod /dev/pvfsd c 60 0 /sbin/insmod /usr/pvfs/bin/pvfs.o /usr/pvfs/bin/pvfsd /usr/pvfs/bin/mount.pvfs pc1:/pvfs /mnt/pvfs ----------------------------------------------------
该脚本在 /dev 中创建一个节点,供 pvfsd 使用。它加载 PVFS 模块,启动 PVFS 守护进程,并将 PVFS 文件系统本地挂载在 /mnt/pvfs 下。
如前所述,任何 I/O 节点或管理节点也可以充当计算节点。为了启用此功能,我们只需在每个 I/O 节点上安装 PVFS 客户端 RPM,因为我们不担心在 I/O 节点上节省磁盘空间。然后将 /etc/pvfstab 和 /etc/rc.d/rc.pvfs 设置为与无盘客户端上使用的相同。现在,无盘客户端和 I/O 节点都可以以相同的方式访问文件系统。
完成这些安装步骤后,我们能够从所有机器复制和访问 PVFS 文件系统中的文件。安装在 CPU 上的 RAM 磁盘包括作为设置一部分的 Apache Web Server 和 Real Server(Real Networks 的视频流服务器)。我们使用 WebBench (来自 ZDNet.com) 生成到 CPU 的 Web 流量,并更改 Apache 和 Real Server 的配置,以将默认根文档放置在 PVFS 文件系统内。这种情况允许每个 CPU 作为独立的 Web 服务器运行,具有自己的 IP 地址,并使用 Real Server 提供多媒体请求。这允许从 PVFS 文件系统内部托管 Web 文件,包括 mp3 和 rm 文件等大型文件。

图 3. PVFS/Linux 兼容性
由于某些类型的应用程序在某些文件系统上性能更好(因为它们的访问模式),因此对我们来说,PVFS 能够与其他文件系统共存非常重要。PVFS 系统在与 JFS、NFS、SFS 甚至 MOSIX 文件系统相同的环境中运行时没有任何问题。这种整洁的设置为 Web 上的 mp3 文件等大型 I/O 请求提供了服务。MOSIX 文件系统被 MOSIX 用于将集群上的进程迁移到当时最合适的 CPU。
通常,PVFS 位于 ext2 文件系统的顶层。但是,下一代 Linux 文件系统将是日志文件系统。这通过生成正在进行的更改日志来防止硬件或软件故障,该日志以标准方式将文件和目录的更改记录到单独的位置(可能是单独的磁盘)。如果主文件系统崩溃,则可以使用日志撤消任何未完全完成的任务,这些任务会使文件系统处于不一致状态。
此视角中的下一步是查看 PVFS 在 ext3 和 GFS 之上作为原生文件系统时的性能如何。这留待在新集群上进行实验(见下文)。
选择 PVFS 等文件系统的另一个重要因素是检查它在客户端和 I/O 节点更多的情况下如何扩展。拥有一个非冗余管理节点似乎是一个固有的瓶颈。但是,管理器不参与任何读写操作,因为这些操作直接在客户端和 I/O 守护进程之间处理。只有当快速连续地创建、删除、打开或关闭许多文件时,管理器才会负载过重。
我们希望测试此配置的可扩展性,因此即将进行的 PVFS 安装将在一个由 16 个 PIII 500 MHz CPU(每个 CPU 配备 512MB RAM)组成的集群上进行。其中八个 CPU 各配备 18GB SCSI 磁盘,并混合使用了 RAID 1 和 RAID 5 设置。预计的安装将有一个管理器、七个 I/O 节点和 14 个客户端(I/O 节点也是客户端)。此集群将使我们能够更好地了解 PVFS 如何为我们的应用程序扩展,并且还将使我们能够将 PVFS 性能与替代文件系统(例如 NFS)在此规模系统上的性能进行比较。在其他集群上对 PVFS 的测试表明,对于其他工作负载,它可以扩展到 64 个以上的节点的系统。(请参阅 PVFS 网站“资源”中的“PVFS:Linux 集群的并行文件系统”。)
PVFS 易于安装和配置。它附带安装指南,引导管理员完成安装过程。它为 I/O 密集型并行或分布式应用程序提供高性能。它还与现有应用程序兼容,因此您无需修改它们即可与 PVFS 一起运行。PVFS 通过邮件列表得到开发人员的良好支持。
PVFS 目前既不包含数据冗余,也不包含从节点故障中恢复的功能。随着客户端节点数量的增加,管理器级别也可能存在潜在的瓶颈。PVFS 承受 TCP/IP 依赖性引入的限制,例如同时打开的系统套接字数量的限制以及 TCP/IP 协议中固有的网络流量开销。至于安全性,PVFS 提供了一个相当简陋的安全模型,该模型旨在用于受保护的集群网络。此外,目前,PVFS 仅限于传统的 Linux 2 GB 文件大小。
从 PVFS 中受益最多的应用程序类型是
需要大型 I/O 的应用程序,例如科学计算或流媒体处理
并行应用程序,因为带宽随着多个客户端同时访问数据而增加
PVFS 不太适合的应用程序类型
需要许多小型、低延迟请求的应用程序,例如静态 html 页面(对于多个小型文件请求,网络流量开销相当大)
需要长期存储或故障转移能力的应用程序——PVFS 本身不提供冗余
如前所述,现有应用程序可以通过内核模块或库包装器接口访问 PVFS。这不需要用户进行任何修改。但是,为了获得并行应用程序的最佳性能,开发人员必须修改他们的应用程序以使用更复杂的接口。此方法也有两个选项。第一个是使用原生 PVFS 库调用。此接口允许高级选项,例如指定文件条带化和 I/O 节点数。它还允许每个进程定义文件的“分区”或特定视图,以便连续的读取操作仅访问文件中的特定偏移量(参见图 2 和图 3)。PVFS 用户指南中提供了相关文档。
MPI-IO 是编写 PVFS 程序的首选选项。它在 PVFS 之上分层了额外的功能,包括集体文件操作和两阶段 I/O。此接口作为 MPI-2 标准的一部分进行记录。
如前所述,PVFS 目前未实现许多安全功能。它主要用于可以确保受信任客户端的私有集群网络。对客户端连接没有限制,也没有使用任何加密或密钥来验证用户身份。客户端节点通常被信任以提供准确的 UID 信息,用于文件权限和所有权检查,就像在 NFS 中一样。
PVFS 将迎来许多变化和进步。现有世代的 PVFS 正在进行修改和测试,以支持更高程度的可扩展性。这些主要解决支持大量 TCP/IP 套接字的问题。它们还将解决支持 64 位(大于 2 GB)文件大小和偏移量中固有的问题。这将使 PVFS 能够扩展到当前大型集群的规模,这些集群利用数百或数千个节点。
PVFS 作为一个整体正在同时进行全面重新设计。这将导致对 PVFS 的完全重写,其中包含新技术和从以前的实现中吸取的教训。此版本的 PVFS 在相当长一段时间内都无法使用,但已在积极开发中。
下一代将支持的一些功能是
反应式调度,允许 PVFS 根据系统状态和应用程序负载调整策略
对各种网络系统的模块化支持,以便文件系统不再受 TCP/IP 约束,而是可以利用更高级的消息传递协议(当它们可用时)
对各种存储方法的模块化支持,允许 I/O 守护进程通过各种方法(例如原始 I/O 或异步 I/O)访问本地数据
多管理器支持
在系统故障时冗余 I/O 数据和元数据
UNIX 兼容性层的改进
更高级的数据分发选项以及数据表示
在评估了几个分布式文件系统后,我们选择将 PVFS 用于需要密集 I/O 的应用程序。PVFS 在当前状态下不提供任何冗余或高安全性功能。但是,研究仍在进行中,我们对此抱有很高的期望。我们相信,如果 PVFS 能够提供访问安全性、数据冗余和管理节点冗余,那么它将更适合作为高度可扩展、可靠和容错的 Linux 集群的一部分采用。然而,就目前而言,它更适合于最佳性能而不是高可用性至上的应用领域(例如科学计算)。
我对 PVFS 以及在我们实现上述设置时提供了很多帮助并为本文的撰写做出了巨大贡献的开发人员感到非常愉快。
如果您对分布式文件系统感兴趣并且需要对高性能 I/O 的支持,我强烈建议您试用 PVFS。PVFS 在 GPL 下免费提供,可以从克莱姆森大学的网站下载(参见“资源”)。
主要 PVFS 开发人员:Robert Ross,阿贡国家实验室数学和计算机科学部。Philip Carns 和 Walt Ligon,克莱姆森大学并行架构研究实验室,由 NASA 戈达德太空飞行中心以及阿贡国家实验室提供支持。加拿大爱立信研究:加拿大爱立信研究公司的系统研究部门,感谢他们提供设施和设备,并批准发表本文。
Philip Carns (pcarns@hubcap.clemson.edu) 是克莱姆森大学并行架构研究实验室的研究生。Robert Ross (rross@mcs.anl.gov) 受雇于阿贡国家实验室数学和计算机科学部。他将于 2000 年 12 月获得克莱姆森大学计算机工程博士学位。
Ibrahim F. Haddad (ibrahim.haddad@lmc.ericsson.se) 在加拿大爱立信研究公司的系统研究部门工作。他目前是蒙特利尔康考迪亚大学计算机科学博士候选人。