分类: LINUX
2005-03-31 08:11:08
级别: 初级 |
自由技术文章撰稿人
2005 年 1 月
超级计算机通常用于需要执行大量计算、处理大规模数据库或者二者兼具的科学上和工程上的应用程序。(超级计算机这一术语也可以是指速度慢了很多但仍然让人感觉很快的系统。)实际上,大部分超级计算机系统是多台连接到一起的计算机,使用以下两种普通的并行处理方法之一来进行并行 处理:
- SMP,即对称多处理(symmetric multiprocessing)。
- MPP,即大规模并行处理(massively parallel processing)。
在 SMP(也称为“紧耦合的(tightly coupled)”多处理和“共享所有”的系统)中,处理器共享内存和 I/O 总线或者数据通路,由单一的操作系统来控制这些处理器。在大部分 SMP 系统中,通常最多有十六个处理器。当执行在线事务处理(OLTP,在这类处理中,很多用户使用一组简单的事务来访问同一数据库)时,SMP 系统比 MPP 更具优势。这种装置中的动态工作负载平衡使得 SMP 可以出色地胜任这类任务。
MPP 系统(也称为“松耦合的(loosely coupled)”或者“无任何共享”的系统)的特性是:有很多处理器, 每个处理器都有用于自己的操作系统的内存,可以同时处理同一程序的不同部分。系统使用一个消息接口和一组数据通路 来使处理器彼此通信。最多可以有 200 个处理器从事同一任务。建立 MPP 系统可能会较复杂,因为当涉及 到包装系统资源以及在处理器间分配任务时,需要制定很多计划(记住,没有东西 是共享的)。 MPP 系统的优势在于用户用来同时搜索数量极多的数据库的应用程序。
IBM® Blue Pacific 是高端超级计算机的一个恰当例子。这个拥有 5,800 个处理器、3.9 teraflop 运算 能力的系统(有 2.6 万亿字节的内存)是与 Lawrence Livermore National Laboratory 合作构建的,为的是 模拟核反应的物理过程。
集群代表的是低端的超级计算,这是一种更可能自行构建(build-it-yourself)的方法。最流行而且最知名的示例之一 是 Beowulf Project,它阐述了如何使用现成的 PC 处理器、快速以太网和 Linux 操作系统来 手工构建(handcraft)超级计算机。请参阅下面的参考资料一节,以获得关于 BeoWulf Project 的更多资料。
既然您已经在适当的环境中创建了集群,那么现在我将向您介绍如何开始建立您自己的集群。
在开始构建您的集群之前,还要做另外一件事情:快速了解一下您将要使用的主要发行版本 —— ClusterKnoppix, 以及它所包含的支持集群的内核:openMosix。
顾名思义,ClusterKnoppix 是 Knoppix 的衍生版本。ClusterKnoppix 为用户提供了 Knoppix 的所有 益处(丰富的应用程序、run-off-the-CD、不可思议的硬件侦测能力和对多种外部设备的支持) 以及 openMosix 集群能力。在参考资料一节,有关于 ClusterKnoppix 和 openMosix 的更多资料的链接。各种其他基于 CD 的 openMosix 发行版本包括 Bootable Cluster CD(BCCD)、ParallelKnoppix、 PlumpOS、Quantian 和 CHAOS。不过,ClusterKnoppix 可能是最为流行的“主节点”发行版本,因为它:
- 提供了全功能的运行 KDE 的 X 服务器(以及其他桌面)。
- 提供多种应用程序(比如 GIMP)。
- 采用了来自 CHAOS 发行版本的安全增强功能。(我将在本文后面部分讨论 CHAOS。)
除了硬件与计算机间的连接之外,您还需要可以管理分布在多个从属节点上的程序的软件。在非集群的计算机中,操作系统允许将应用程序从存储媒体(比如硬盘和 CD)加载到内存中并开始运行它。 操作系统负责被执行应用程序的完成。
我选择了 openMosix —— 一个设计用于单一系统映像集群的 Linux 内核扩展 —— 因为它允许操作系统 (在我们的例子中是 Linux 内核)从任何集群节点将应用程序加载到内存并在集群的任何节点 上去运行。所有给定的应用程序都被迁移到可用能力或资源最多的节点上。
一旦安装了 openMosix,集群中的节点就会开始通信,并且,集群通过优化资源分配,不断地根据工作负载 对自己进行调整。自动发现(Auto Discovery)是 openMosix 的特性之一,它允许在操作集群的同时添加新的节点。
按照 openMosix Project 的说法,openMosix 可以扩展到 1,000 多个节点。
为此,我使用了两台计算机。主节点是一台 Pentium™ III 1.7-GHz 计算机,拥有 384 MB 与显示卡共享的 RAM。 从属节点是一台 Pentium III 997-MHz 计算机,拥有 256 MB 专用 RAM。两台机器都有 CD-ROM 驱动器。两台机器 上有 RealTek 10/100 Mbps 局域网卡,通过一根标准的交叉网线将它们连接起来。如果您的家用网络设置有两台(或者更多)使用网线连接起来的计算机,那么您的设置将与我的类似。
您还需要 ClusterKnoppix(撰写本文时,其最新版本为 clusterKNOPPIX V3.4-2004-05-10-EN-cl)。 当从属结点在网络上引导起来时,ClusterKnoppix 能够发现它们,不过您需要支持通过网络引导的 特定的局域网卡和 BIOS。由于复制 CD 的代价很低,而且您需要在所有节点上运行 X,所以最简单的 方法是集群中有多少个节点就使用多少张 ClusterKnoppix CD。
可以为集群中各个的节点使用下面的网络设置:
- Network —— 192.168.1.0
- Netmask —— 255.255.255.0
- Default Gateway —— 192.168.1.1
- IP address of Master —— 192.168.1.10
- IP address of Drone #1 —— 192.168.1.20
我就不再详述 Linux 中的网络。有很多信息可以使用;请参阅下面的参考资料。
openMosix 并不要求将第一个节点初始化为主节点,不过,为了直观,首先要建立主节点。
- 将 ClusterKnoppix CD 放入光驱中并从光驱引导它。
- 在出现
boot:
提示符时,按 Enter。给 ClusterKnoppix 留一些时间来检测和引导硬件。默认情况下,将其引导至 KDE。
- 进入后,打开一个 root shell。它是任务栏的第二个项。
- 现在我们需要配置本地网络接口。首先,要为网卡 ech0 给定一个 IP 地址:
ifconfig eth0 192.168.1.10
。- 然后,指定它访问网关必须遵循的路由:
route add -net 0.0.0.0 gw 192.168.1.1
。这样就设置好了网络。
- 接下来是初始化 openMosix 系统:
tyd -f init
。- 最后,声明这个节点是集群中的主节点:
tyd
。然后,您需要初始化从属节点。
建立一个从属节点与建立主节点没有太大区别。重复前面初始化主节点的前三个步骤。尝试自己使用前面 所提到的值来配置从节点的网卡(ifconfig eth0 192.168.1.20
和ifconfig eth0 192.168.1.20
)。
- 现在,初始化 openMosix 系统。与上次使用的命令相同:
tyd -f init
。- 最后,将这个节点加入到集群之中:
tyd -m 192.168.1.10
。就这样!您的集群已经就绪。
您需要检查集群的状态;ClusterKnoppix 采用了以下跟踪状态的工具:
在 root shell 中输入这个工具的名称来打开它。该工具将检测出集群中节点的数目,并显示一个精美的、外观奇特的界面。很快,您就可以看到集群的效率、集群的负载、集群的 可用内存、已经使用的内存所占百分比以及其他信息。此时您还不会看到太多的活动,因为几乎还没怎么使用集群。用一些时间来让自己熟悉这个应用程序。
这个应用程序显示已经从主节点迁移到从属节点的进程。将您的鼠标移到中间的圆圈周围的正方形。您将得知 进程的名称和它的 ID。为了将某个进程从主节点“迁移”出去,需要拖动正方形并将其放入较小的圆圈中(从属节点)。
这个简单的应用程序报告了从初始化集群到完成其创建这段时间内集群以及各个节点的负载情况。
这个基于命令行的监控器向您实时地显示集群上的负载、可用的内存、正在被使用的内存以及其他内容。 可以查看其手册来了解如何定制视图。
那些熟悉 top 的人对这个工具会很感兴趣。top 保持对计算机上运行的每个进程的跟踪。mtop 是支持集群的 top 的变体,也会显示每个进程,而且会给出运行那个进程的节点的附加信息。
既然集群已经准备就绪,那么现在就可以使其超载。为此,您需要借用好心的 CHAOS 发行版本的 开发人员编写的一个脚本:
// testapp.c Script for testing load-balancing clusters
#include
int main() {
unsigned int o = 0;
unsigned int i = 0;
unsigned int max = 255 * 255 * 255 * 128;
// daemonize code (flogged from thttpd)
switch ( fork() ) {
case 0:
break;
case -1:
// syslog( 1, "fork - %m" );
exit( 1 );
default:
exit( 0 );
}
// incrementing counters is like walking to the moon
// its slow, and if you don't stop, you'll crash.
while (o < max) {
o++;
i = 0;
while (i < max) {
i++;
}
}
return 0;
}打开一个字处理器,复制这个脚本,并将其保存为 testapp.c。使集群中的所有节点都可以使用该脚本。
为了使用这个脚本,需要在所有节点上执行这些命令。首先要编译这个 C 程序:
gcc testapp.c -o testapp
然后,执行
./testapp
。在所有节点上至少执行此脚本一次。我在每个节点上执行了三次。
执行每个实例后,切换到前面描述的应用程序。注意行为的变化。享受看着您自己构建的集群将进程从一个节点 迁移到另一个节点的乐趣吧。看哪,它正在平衡负载!
既然一切都已经就绪,让我们来回顾一下都做了些什么。首先,配置机器上的网卡,并为它们指定 IP 地址。然后,为它们提供一个通信用的公共路由。最后, 使用
tyd
命令初始化 openMosix 系统。(ClusterKnoppix 借用了 CHAOS 项目的tyd
,明确地说是“tidy”。)您可以只在集群中的第一个节点上执行
tyd
而不进行任何切换。 这个节点不必是主节点。所有后续节点都是通过 IP 地址后的-m
开关来添加的。当初始化第二个节点时,IP 地址必须是第一个节点的地址。不过,当初始化第三个节点时,您可以 在节点一和节点二这两个 IP 地址之间作出选择。
当掌握这项技术之后,除了在两个节点上都使用 ClusterKnoppix 来建立集群以外,还可以建立一个 异构的集群。在这类集群中,除了主节点以外,不需要在从节点上运行 GUI。您可以运行一个支持 openMosix 但又像 Linux 内核一样小的发行版本。在从属节点上运行的发行版本的最普遍选择可能 是 CHAOS。它占用的内存很少,这将帮助您为集群节约内存,而且它安全、可靠且速度很快。还等什么?尽情展示您自己构建的集群吧!
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文。
- Beowulf 群集:合众为一 (developerWorks,2001 年 9 月)是对 Beowulf 风格的集群的一个极好介绍。
- 教程 使用 Mosix 的 Linux 集群 (developerWorks,2001 年 12 月)阐述了什么是 MOSIX,如何构建支持集群的 Linux 系统,以及建立集群可以为您 带来哪些好处。
- 创建 WebSphere Application Server V5 群集(developerWorks,2004 年 1 月) 介绍了用于负载平衡和失效切换支持的集群,并描述了如何使用用于 Linux 的 IBM WebSphere® Application Server 构建一个集群。
- 在关于 Linux-powered 网络的 developerWorks 教程系列中可以找到更多关于 Linux 网络基本概念 的资料。
- 提供了这个内核扩展的详细资料和更新。
- 站点对这个发行版本进行了说明, 并为所提出的问题提供了一个发展中的论坛。
- Wikipedia 提供了很多关于 的资料。
- 在 developerWorks Linux 专区 可以找到 更多为 Linux 开发人员准备的参考资料。
- 通过参与 developerWorks blogs 加入 developerWorks 社区。
- 在 Developer Bookstore Linux 专栏中订购 打折出售的 Linux 书籍。
关于作者
在过去的 5 年中,Mayank Sharma 一直在从事技术方面的写作,尤其是免费和开放软件方面。 他帮助创办了南亚最主要的 FLOSS 月刊 LINUX For You(作 为其助理编辑),现在 正忙于整理专门论述本地化、培训和 FLOSS 迁移的基于 Web 的出版物。除了写作之外,Mayank 还喜欢研究骇客技术;他最新的贡献是用于 Utkarsh 本地化项目的一个安装器。虽然他正在为计算机科学学位而努力,但对于 Formula One 赛车,他依然兴趣不减。