转自:http://www.ibm.com/developerworks/cn/linux/cluster/hpc/part2/index.html
Beowulf是现存的最古老的英语史诗:
Famed was this Beowulf: far ew the boast of him, son of Scyld, in the Scandian lands. So becomes it a youth to quit him well with his father's friends, by fee and gift, that to aid him, aged, in after days, come warriors willing, should war draw nigh, liegemen loyal: by lauded deeds shall an earl have honor in every clan.
它歌颂了一个英雄,他拥有强壮的体魄和无人伦比的勇气。他最终战胜了魔鬼Grendel. 你可以在http://legends.dm.net/beowulf/index.html找到这首史诗。
我们所说的Beowulf首先是一个象史诗中英雄一样强大的集群系统。在1994年夏季,Thomas Sterling和Don Becker在CESDIS(The Center of Excellence in Space Data and Information Sciences)用16个节点和以太网组成了一个计算机集群系统,并将这个系统命名为Beowulf。Beowulf集群。Beowulf集群提供了一种使用COTS(Commodity off the shelf)硬件构造集群系统以满足特殊的计算需求的方法。这里的COTS是指象PC和以太网这种广为应用的标准设备,它们通常可以由多家厂商提供,所以通常有很高的性价比。Beowulf集群这种方法很快从NASA传遍了整个科研机构和社团。实际上,Beowulf集群现在已被人们看作高性能计算中的一个分支或流派。
因为几乎每个Beowulf集群的设计者都有自己的Beowulf集群的定义,恐怕很难给Beowulf集群下一个确切的定义。一些人认为只有那些采用和原始的Beowulf集群系统一样方法构建的系统才叫Beowulf集群。而另一些人则认为凡是能够在多个工作站上运行并行代码的系统都称为Beowulf集群。这里我们只是列举多数Beowulf集群具有的特征作为Beowulf集群的定义:
- Beowulf是一种系统结构,它使得多个计算机组成的系统能够用于并行计算。
- Beowulf系统通常有一个管理节点和多个计算节点构成。它们通过以太网(或其他网络)连接。管理节点监控计算节点,通常也是计算节点的网关和控制终端。当然它通常也是集群系统文件服务器。在大型的集群系统中,由于特殊的需求,这些管理节点的功能也可能由多个节点分摊。
- Beowulf系统通常由最常见的硬件设备组成,例如,PC、以太网卡和以太网交换机。Beowulf系统很少包含用户定制的特殊设备。
- Beowulf系统通常采用那些廉价且广为传播的软件,例如,Linux操作系统、并行虚拟机(PVM)和消息传递接口(MPI)。
由于一些特殊的目的如系统性能,有些Beowulf集群系统也采用一些用户定制的设备(它们通常由一家厂商提供)。为了区分这些特殊的系统,通常把Beowulf分为两大类:
2.1 第一类Beowulf集群(CLASS I Beowulf)
这一类Beowulf集群全部由COTS设备组成。第一类Beowulf系统的优点是:
- 硬件设备由多个来源,通常具有廉价和易管理维护的特点。
- 不依赖于单个硬件供应商
- 所有设备驱动都由Linux开发社团提供
- 通常都是标准设备,例如,SCSI、以太网等等
当然第一类Beowulf集群的缺点也是非常显然的。由于所采用的硬件都没有经过性能优化,所以其很难达到很好的性能。比如,由于以太网的高延迟和低带宽使得集群系统中消息传递很难达到MIMD应用的需求,从而使整个集群系统的计算能力大打折扣。
2.2 第二类Beowulf集群(CLASS II Beowulf)
第二类Beowulf集群是指那些采用了用户定制设备的Beowulf集群。这类集群系统最大优点是具有很好的性能。例如,采用Myrinet作为集群系统的IPC网络可以极大地提供进程间消息传递延迟和速度。当然它的缺点就是依赖于单个硬件提供商而且价格高昂。
不能说,哪一类集群绝对优于另一类集群。这依赖于你的集群系统的需求和预算。
如上所述,现实中存在形形色色的Beowulf集群。虽然它们都是原始Beowulf集群的衍生物,但是它们的体系结构也存在各种各样微小的差异。本文以IBM eServer Cluster 1300为例来阐述Beowulf集群体系结构和系统组成。
图1是Cluster 1300上Beowulf集群的系统视图
![图1是Cluster 1300上Beowulf集群的系统视图](https://i-blog.csdnimg.cn/blog_migrate/99da3df5e78d464ba1cf2cb5682ecca5.png)
图1是Cluster 1300上Beowulf集群的系统视图。无论是管理节点(Master Node)和计算节点都是Intel IA32架构的xSeries PC服务器。它们通过网络(以太网和Myrinet)相连接。所有的节点都运行Linux操作系统。运行在计算节点上的并行应用程序采用MPI进行完成并行进程间的通信。计算节点通过管理节点和外部LAN相连。整个集群系统都在一套集群管理工具监控之下。
图 2 Cluster1300上Beowlf集群组件
![图 2 Cluster1300上Beowlf集群组件](https://i-blog.csdnimg.cn/blog_migrate/6f974ec3d194f120b69c39f630e7eb77.png)
图 2 是 Cluster 1300上Beowulf集群的组件视图。它揭示了Beowulf集群的组成部分。通常Beowulf集群由四个层次构成:
- 硬件:主要是指Intel IA32架构的PC服务器。
- 网络:指用于节点间通信的局域网(普通的以太网)和并行进程间通信的高速网(Myrinet等高速网)。
- 软件:主要指Linux操作系统和用于并行通信的并行编程库(如MPI和PVM)。
- 并行应用
本文的下面三个小节将分别介绍这四个层次。而本系列文章的后面两片将更详细的介绍它们。
Beowulf集群硬件和网络层次需要解决的问题是如何组织硬件使其达到最高的性价比。为了达到很好的性价比,Beowulf通常采用廉价的COTS硬件。当然有时为了提供某些关键的性能,也会使用一些特殊的设备。
从硬件组织的角度说,Beowulf集群中的节点都是非共享内存的计算机,它们通过消息传递进行通信。实际上,我们还有其他组织硬件完成并行计算的方式。
简单地说,有两种组织硬件完成并行计算的方法:
- 通过消息传递通信的本地内存(非共享内存)计算机系统 (Beowulf集群)
- 通过内存访问通信的共享内存计算机系统 (SMP计算机)
当然也存在将多个本地或共享内存计算机相连并创造一个混和的共享内存计算机系统的可能。但在最终用户看来,这种计算机系统就好像一个大型的共享内存计算机。这种技术被我们叫做非一致内存访问NUMA(Non Uniform Memory Access)。但是从底层说,一个NUMA计算机系统必须在节点间传递消息。
当然也可以将共享内存计算机作为一个本地内存的计算机连入一个Beowulf集群系统。由于Linux系统支持SMP计算机,所以Linux系统本身能够在SMP中的多个CPU上调度作业。所以Beowulf集群本身就没有必要识别集群的节点是不是共享内存计算机了。
和SMP系统相比,集群系统有明显的优点。关于这一点请参阅本系列文章的第一篇。
因为Beowulf集群采用消息传递完成并行程序间通信,所以网络传输成了系统的瓶颈。在实际的系统中,通常采用有两套彼此的独立的网络设备。一套是普通的以太网,用于象系统管理和文件服务等普通的网络通信。另一套网络是用于进程间通信的高速网,象Myrinet和Giganet。和100M以太网相比,这类网络具有低延迟和高带宽的特性。
还有三类设备虽然不是必须,但是对于集群管理却是非常重要的:
- KVM Swither:KVM是指Keyboard、Video和Mouse。这个设备可以让系统管理员用一套KVM管理系统中的所有节点。
- 远程电源管理设备(如ASM):这类设备使得管理员可以在管理节点Power on/off其他节点。
- Terminal Server:这种设备通过串口将节点连接起来。通过这个设备,管理员可以在管理节点上虚拟出其他节点上的控制终端。和KVM相比,这种方法不需要硬件的切换。
Beowulf集群在软件层次面临的问题是如何在硬件层次上获得最大的性能。通常,Beowulf集群采用Linux+MPI的方式支持并行计算。MPI是采用消息传递的方式实现并行程序间通信。虽然也可以采用其他的通信方法,但是消息传递模式是最适合于集群系统的。 简单地说,有两种在并行程序间传递并发的方法:
- 使用处理器间的消息传递(MPI)
- 使用操作系统的线程(Thread)
其他的方法也存在,但是这两种方法应用得最广泛。虽然存在效率和移植的问题,这两种方法都可以在SMP,NUMA和Cluster上实现。
消息传递需要在CPU间拷贝数据,而线程却可以在CPU间共享数据。数据拷贝的速度和延迟是影响消息传递效率的最关键的因素。PVM和MPI是最常用的两种消息传递API。消息传递也可以在线程上实现,并且消息传递即可以用于集群系统,也可以用于SMP系统。和线程相比,在SMP系统上使用消息传递的优点在于可以很方便的把SMP上的应用移植到集群系统上。
线程的最大特点是,线程间是共享数据。因此它在SMP系统上工作的更好。而且Linux本身也是支持Posix线程的。但是使用线程的最大缺点在于,很难将线程扩展到SMP系统以外。虽然NUMA技术可以高效的做到这一点,但是那非常昂贵而且Linux本身也不支持。
下表概括了线程和消息传递在SMP和集群系统上的比较:
*需要昂贵的NUMA技术
| SMP系统性能 | 集群系统性能 | 扩展性 |
消息传递 | 好 | 很好 | 很好 |
线程 | 很好 | 差* | 差 |
Beowulf集群的应用层次位于硬件和软件层次之上。它要解决的问题是如何在实际的集群系统中并行化(PARALLEL)应用中的并发(CONCURRENT)部分,从而使集群上的应用达到最好的性能。
在阐述这部分之前,我们需要区分两个概念: PARALLEL和CONCURRENT。程序的并发(CONCURRENT)部分是指程序中可以独立计算的部分。程序的并行(PARALLEL)部分是指程序中在同一时间被分别执行的并发(CONCURRENT)部分。
它们的区别是很重要的。并发是程序本身的属性,而并行是计算机系统的属性。并行的目的是获得很好的性能。限制并行性能的因素是计算节点间通信的速度和延迟。大部分的Benchmark都有很高的并行性并且通信和延迟不是什么瓶颈。但是其他应用却没有这么简单。对于这些应用,有时候使并发部分并行执行反而可能使应用性能更低。简单的说,除非附加的通信时间代价小于并发节约的计算时间,否则并行执行反而会降低效率。
![](https://i-blog.csdnimg.cn/blog_migrate/ccc879d39c2f68561abf539039ed8a40.png)
程序员的任务就是决定哪些并发的部分需要并行执行,而哪些不应该并行执行。这些决定最终会影响应用程序的执行效率。图3描述了实际应用中程序并发部分和通信计算时间比的关系。
在理想的系统中,通信计算时间比应该是恒定的。任何并发部分都应该实现为并行。不幸的是,实际的系统,包括SMP系统,都是图3所示的那样。所以在设计Beowulf集群应用时,必须认识到并发带来的效率依赖于在该系统上通信处理时间比。也正是因为这个原因,虽然可以把应用移植到另一个并发系统上,但是并不能保证应用在被移植的系统上仍然是高效的。一般来说,不存在可移植的且高效的应用程序。
同样的道理,使用更快的CPU也可能使你的应用变慢。
- Linux HPC Cluster Installation, IBM Redbooks, http://www.redbooks.ibm.com/
- IBM eServer xSeries Clustering Planning Guide, IBM Redbooks, http://www.redbooks.ibm.com/
- Linux Clustering with CSM & GPFS, IBM Redbooks, http://www.redbooks.ibm.com/
- Cluster Computing White Paper, Mark Baker, University of Portsmouth, UK
- Beowulf HOW-TO, http://www.beowulf-underground.org
- Beowulf Introduction and Overview, http://www.beowulf.org
- The Mosix Howto, http://www.mosix.org
- Linux-HA Heartbeat System Design, http://www.linux-ha.org
- xCAT HOW-TO, http://www.x-CAT.org
- MPICH, http://www.mcs.anl.gov/mpi/mpich.
- PVM, http://www.epm.ornl.gov/pvm/pvm_home.html
- OpenPBS, http://www.openpbs.org/
- Maui, http://www.supercluster.org/
- Condor Manual, Condor Team, University of Wisconsin-Madison
- Intermezzo, http://inter-mezzo.org/
- Coda, http://www.coda.cs.cmu.edu/