您可以通过以下三种方法的任意一种来创建一个集群:完全迁移到一个单一的平台,部分迁移,或者是以混合的方式创建。在本文中,将学习如何通过集群代理实现最后一种方法,并了解如何将 coLinux 和 openMosix结合起来为异构环境提供高性能集群中间件。在这个异构的环境中,Linux™ 将提供稳定性和性能,而且 Windows®用户可以继续使用他们的应用程序,根本不用关心其中的区别。
从九十年代早期起,集群计算已经取得了长足的发展。随着对 GNU/Linux 使用的日益增加,以可接受的预算使用 PC集群来获得超级计算速度正日趋主流。容易获得的廉价硬件(处理器、内存、硬盘、以太网卡等),再加上开放源代码软件,这些都促使人们采用基于Linux 的 Beowulf 集群。(“Beowulf”指的是基于 PC 的集群领域中最早的研究者 Dr. Donald Becker 和Dr. Thomas Sterling 为他们最初的集群所起的名字;很多人使用这个名字来代表一种类似的技术,即基于 PC 的集群。)
术语的这一模糊性带来了这样的问题:“希望构建集群的人是否必须使用 Linux?”(或许,那个问题的中心,也是更为实际的一点,是“我们有很多使用 Windows 的空闲 PC。仅仅为了借用 CPU 周期,我们是否需要将它们全部迁移到 Linux?”)
正是这些问题促使我们去试验如何构建混合式集群(hybrid cluster),即由异构操作系统构成的集群。本文使用的是 Windows 和 Linux,为了简化起见,没有考虑其他操作系统。
为什么创建混合式集群?
当前,局域网和校园网都是由使用不同操作系统的PC 所构成。有的使用 Windows,有的使用 Linux,还有的使用 BSD,等等。一个局域网中 PC 的平均数目在 100 到 300之间,这表明其中有巨大的潜在计算能力,特别是如果您正在规划一个主要目的是获得最高速度的高性能计算集群(HPC)。
这种类型的集群所面临的挑战是:在大部分情况下,我们不能让每台 PC百分之百地致力于集群的工作。传统的集群在全天候的运行期间内都完全致力于运行需要大量运算的程序,与之相比,这种混合式的集群主要适用于扩展现有Linux 集群的节点。实现这一目标有两种策略:
我们并没有将从 Windows 到 Linux的部分或完全迁移作为解决方案来研究,因为我们希望在本文中集中关注第三种方法。我们没有研究向 Linux的完全或者部分迁移,而是希望研究那些不需要关注完全迁移就可以将 Window 和 Linux加入集群的机制和好处。不过,这并不表示完全迁移是错误的解决方案。
我们选择集群代理方法作为解决方案,因为它具有以下优势:
使用集群代理的方法,您只需要在 FAT32 或者 NTFS 文件系统中留出一些空间来存放 Linux 代理二进制程序。
混合式集群的先决条件
在创建集群的过程中,需要在三类集群中作出选择:高可用集群(HA)、高性能计算集群(HPC)和高吞吐率集群(HTC)。我们选择的是 HPC,这是最常用的集群,它会带来以下后果:
让我们退而考虑这个问题:“为什么我们需要植入一个集群代理?难道将基于 Linux 的应用程序移植到 Windows 不能获得更好的性能吗?”当然,随着 MinGW 或 Cygwin 等跨平台编译器的可用,这可能会很容易。
对这个问题的回答是,我们出于以下原因而更希望使用集群代理:
我们提出的解决方案并不是要获得如同将其移植为本地 Windows 应用程序那样快的执行速度。不过请记住,在这个试验中,我们将尝试达到以下几个关键目标:
选择软件
首先,我们需要选择两个软件:
关于模拟器/虚拟机
该软件将成为一个桥梁,让 Linux 内核可以在 Windows 上运行;这是它的主要功能。
由于难以将单一系统映像(Single System Image,SSI)中间件移植到 Windows内核体系结构中,所以我们选择使用模拟器或者虚拟机。SSI解决方案会修改内核的几乎所有部分:进程管理、文件系统、内存管理、调度器,等等。通过不加修改地运行内核进程,模拟器简化了部署工作。
关于集群中间件
使用中间件,我们可以选择作为 Linux 内核扩展的解决方案,这样就可以构建 SSI 集群。还有其他一些选择(比如批调度器或者完全的远程执行包装器),但是我们选择 SSI 模型,因为它具有以下优势:
选择集群中间件
这相对简单。我们所选择的 SSI 中间件是什么?有三个开放源代码而且遵循 GPL 许可的解决方案(排序不分先后):
关于各个解决方案的详细资料超出了本文的范围,不过可以在参考资料中找到。
我们将选择 openMosix,原因有二:
选择模拟器/虚拟机
这一选择略为复杂。有两种可能,使用 VMWare等商业版本的,或者使用 coLinux等开放源代码的(猜猜我们将选择哪一个!)。同样,我们选择的是基于开放源代码的解决方案。不过,我们首先来讨论各个解决方案的优势与不足,您将了解到在分析我们的选择时思考的过程。
对于商业产品,我们以 VMWare 为例。您可能会熟悉此产品;VMWare 已经在 VM 舞台活跃了很长时间。这里是我们对 VMWare 的初步分析。
优势 所在:
不足 之处:
现在来分析 coLinux。coLinux 是一个新的开放源代码解决方案,让您可以在 Windows 内核之上运行 Linux 内核。
优势:
不足:
那么,与 VMWare 相比,coLinux 的性能如何呢?我们运行了一个粗略的基准。作为测试,我们选择了来自 Povray 的 Web站点的 POV-Ray 3.6.1 预编译二进制程序。(POV-Ray 是逼真 3D图形创建软件的始祖之一,它完全由那些进行大量数字处理的任务构成,非常适合我们的测试。)使用 benchmark.ini(包含于 povray软件包之中)中的默认选项执行那个二进制程序: # povray benchmark.ini
。
POV-Ray 在用于 Linux 内核 2.4.26 的 coLinux 上运行。根文件系统使用的是 Gentoo发行版本。我们使用相同的发行版本在 VMWare 版本 4.5.2 上测试相同的 POV-Ray二进制程序。下面的表格说明了测试机器使用必要的选项(在 benchmark.ini 给出)完成预定义的场景所需要的时间。
表 1. POV-Ray 运行时间结果
平台(POV-Ray 在哪里执行) | 时间(单位为 分钟:秒) |
本地 Linux | 39:23 |
coLinux | 39:26 |
VMWare | 40:53 |
研究数据表单,您会发现 coLinux 与本地 OS 的速度相差甚少。正如所预期的那样,VMWare 比 coLinux慢,相差一分钟左右。通过实时地将虚拟机(VM)的指令流翻译给宿主机器, VMWare 可以获得接近本地的速度,但是由于 VMWare本身在用户空间运行,这可能会引发问题。比如,当 VM 以内核模式执行代码时;为了正确地仿真 VM 的虚拟 CPU,VMWare必须谨慎地转换内存映射和权限。
现在,我们来看所选择的模拟器 coLinux 和所选择的中间件 openMosix 如何一起工作。
coLinux 与 openMosix 的联合
图 1 向我们展示了 openMosix 的工作方式。
图 1. openMosix 的工作方式
javascript:window.open(this.src);" style="CURSOR: pointer" onload="return imgzoom(this,550)">
openMosix 在 Linux 内核内部运行。它有若干个可以通过 /proc接口进行控制的参数。为了简化实际的操作,创建了一些用户空间应用程序。openMosix以分散的(decentralized)方式工作,所以在此拓扑中没有主节点或从节点。这一分散式策略被应用于负载信息交换,并且应用于进程迁移期间。
如果负载均衡算法认为另一个节点的工作负载较小,而且适于迁移进程,那么 openMosix会透明地将进程迁移到目标节点。进程不能或者不应该迁移的原因是多种多样的(使用pthreads、进行大量磁盘操作、运行期非常短)。从用户空间的角度来看,不需要修改应用程序代码。所有工作都在内核空间透明地完成。
现在,让我们来研究 coLinux 如何工作(下面的图引用自 coLinux.org)。
图 2. coLinux 内部结构的总体描述(获得了Dan Aloni 的授权,他是 coLinux 首席开发人员和文档编写者)
Dan Aloni 将 coLinux 描述为一个协作的(cooperative) 且半虚拟的(paravirtualized)Linux 虚拟机。协作指的是它将控制权自主地交还给宿主 OS。半虚拟指的是:除了 CPU 和内存以外, coLinux内核不需接触任何实际的硬件。这与 VMWare 不同,后者截取访问硬件设备的 I/O 并模拟它。coLinux 感觉像是一个独立的 Linux机器 —— 客户内核的内部结构与宿主内核的内部结构是分开的。
注意,coLinux 由两部分构成:
coLinux 内核驱动程序的主要工作是:
ioctl()
请求。这个 ioctl()
调用负责进行客户 OS 与宿主 OS 之间的上下文切换。在用户空间中,最重要的是部分是 colinux-daemon-process。除了负责触发上下文切换之外,它还要作为colinux-console-nt 和 colinux-net-daemon 等一些其他后台进程的“管理者”。例如,通过colinux-console,用户可以查看 Linux 客户的活动控制台的当前显示。当用户在此 colinux-console 的shell 中输入或者执行命令时,colinux-daemon 将会 “包装”它并将其转发给 colinux-driver。要完全理解coLinux 的内部机制,请访问 coLinux.org。
openMosix 与 coLinux 融合时,没有显著的变化。由于 openMosix 完全位于内核空间,而 coLinux只是与通常一样引导客户内核映像,并如前所述那样工作。当 openMosix 必须与其他节点通信时,客户内核会去调用一些系统调用。coLinux截取这些调用,并将数据传递到 coLinux-net-daemon,由它来通过 Windows API 最终将数据发送出去。
下面是对 coLinux 网络层次和网络传输数据流的描述:
现在我们来看如何让 coLinux 和 openMosix 进行结合。
融合 coLinux 和 openMosix
对本文而言,我们组合使用了coLinux 和用于 2.4.26 Linux 内核的 openMosix 补丁。之所以选择2.4.26,是因为它是进行试验时最新的稳定内核版本,也是同时支持 openMosix 和 coLinux 的 2.4.x内核中序列号最高的版本。(这里提及的描述只是一个概述。要获得完整的说明,请参阅参考资料中的 step-by-step 指南。)
下面是制做您的第一个 coLinux/openMosix 内核的步骤:
# make oldconfig
# make dep
# make vmlinux
这将生成 vmlinux 文件和新的内核。我们建议您在构建 coLinux 的所有过程中(内核映像和用户空间工具)都使用 gclearcase/" target="_blank" >cc3.3.x,因为已经证明它能够生成最稳定的二进制程序。编译内核映像和用户空间工具时不要使用不同的gcc,因为这可能会造成系统的锁定。为了将完成的内核用作虚拟机,还需要有用户空间工具、基文件系统的映像以及 TAP-32 win32网络驱动程序。为了缩短整个测试周期,您可以下载同时包含有用户空间工具和内核映像的立即可用的程序包。(在参考资料一节中可以找到所有这些下载。)
剩下的惟一一件事情就是创建您自己的文件系统映像,或者从 coLinux.org 下载它们。为了使用 openMosix 的功能,需要将openMosix 用户空间工具放入文件系统映像中。请参阅 openmosix.org Web 站点上关于如何编译用户空间工具的说明。
在 step-by-step 指南中,可以找到将所有内容(Linux 内核映像、用户空间工具、根文件系统等)整合为一个可用系统的步骤。
运行时间基准
这里是阐明我们所提出的方法的易用性与性能的一个基本的、初步的基准。我们的实验台上只有两台机器:Amun 是一台本地 Linux 的机器,运行的是 Debian linux。Ipc256 运行的是 Windows 2000 Professional。
各个节点的硬件规格如下:
Ipc256 的规格
处理器: | P4 1.70 GHz |
RAM: | 256 MB |
操作系统: | Windows 2000 Professional |
硬盘: | 40 GB IDE |
网卡: | Realtek Semiconductor Co. Ltd. RTL-8139 Fast Ethernet |
Amun 的规格
处理器: | P4 2.40 GHz Hyper Threading |
RAM: | 2048 MB |
操作系统: | Debian Woody |
硬盘: | 2x approx. 40 GB IDE, several NFS mounts |
网卡 1: | Syskonnect (Schneider & Koch) SK-98xx V2.0 Gigabit Ethernet |
网卡 2: | Realtek Semiconductor Co., Ltd. RTL-8139 Fast Ethernet |
我们选择了一个多进程(之所以使用术语“进程”,是因为它使用了 fork()
)应用程序作为基准,它不做任何事情,只是连续不断地使用不同的种子数值计算 Fibonacci 数字。它的目的并不是做有意义的计算,而是为我们的解决方案提供一个易于理解的说明。在下载一节中有压缩文件,下载这些文件可以查看其源代码。
程序分为两部分。第一部分派生 2^5 = 32 个子进程。为此它使用了系统调用 fork()
。这样就使得 openMosix 可以将那些进程分布到参与集群的所有节点中去。在第二部分执行实际的计算。
我们将此程序运行了四次,取其平均值。下面的表给出了结果。
表 2. 多进程程序运行时间结果
宿主 | 执行时间(单位为秒) | 注释 |
Amun | ta = 436.25 | 本地运行 |
Ipc256 | ti = 778.75 | 本地运行 |
Both | tb = 285.25 | 先在 Amun 上运行,然后迁移到 Ipc256 |
查看这些结果,您会观察到单台 PC 完成那个工作需要多长时间。Amun 比 Ipc256 稍快一些,但是同时使用两台 PC 获得的效率绝对是最高的。如果不仅是一台而是很多 Windows PC 加入到集群,这个效率可能还会更高。
使用下面的公式计算开销:
Overhead = tb/ta + tb/ti - 1
在该例中,我们的试验所产生的开销是 2.01%,接近理论最优值。
通过这一基准,我们可以得出这样的结论:要最大限度地受益于此类集群,最好的方法就是划分作业或者应用程序。使用参数化调用(parameterized invocation) 是更常见的一个策略,使用不同的参数派生同一个程序的多个实例。
POV-Ray 的渲染工厂(renderfarm)是参数化调用的一个示例。渲染程序的每一个实例都取得一部分场景并构建出一个完成的帧。重复此过程,直到所有场景都被取完。
展望
对于预算充足的用户而言,采用 VMWare等商业化的仿真器或许是使用开放源代码的基于 Linux 的 SSI 来实现混合式 Windows-Linux集群的安全方法,但是,对那些寻求可接受的解决方案的用户而言,他们希望每一分投入都能获得最大的价值,而 coLinux 是理想的选择。
这一解决方案的优势很明显。不需要进行大规模的从 Windows 到 Linux 的迁移 —— 只需继续使用您所熟知的 Linux环境。这样将会缩短部署的时间,而且还能让基于 Windows 的用户如往常一样工作。Windows PC 的空闲能力可以用来帮助 Linux机器运行非常消耗 CPU 的程序。
基于目前基础的改进
今后能够得到改进的方面有很多,包括
相关项目
CosMos 是 Ian Latter所开发的一个项目,它的目标是提供一个具有紧凑文件系统的直接可用的 coLinux/openMosix 二进制程序。CosMos的一个非常好的特性是,它使用 IPSec 隧道来在集群节点间创建安全的端到端通信。(您可以通过 Ian.Latter@mq.edu.au 与Ian 联系。)
另一个项目(主要由 Christian Kauhaus 开发)的目标并不是 HPC,而是类似于著名的 Condor 项目,设计用于高吞吐率计算集群。与 CosMos 的共通之处是,其目标也是创建一个立即可用的程序包,不过在其他方面有所不同,比如:
此项目仍处于早期 alpha 阶段 —— 观察它的发展应该会非常有趣。