利用Beowulf让普通PC变集群
现在,Linux在IT业里已经有着非常重要的影响,除了其具有免费、高效、可靠等优势外,对于计算机科学家和那些需要进行大量运算的科学家来说,它还是一个非常强大的工具。自从Donald Becker发起了Beowulf集群计算以后,在NASA的Goddard Space Flight Center工作的Thomas Sterling又扩展了Linux在高性能并行计算领域的应用。
现在,Linux在IT业里已经有着非常重要的影响,除了其具有免费、高效、可靠等优势外,对于计算机科学家和那些需要进行大量运算的科学家来说,它还是一个非常强大的工具。自从Donald Becker发起了Beowulf集群计算以后,在NASA的Goddard Space Flight Center工作的Thomas Sterling又扩展了Linux在高性能并行计算领域的应用。今天,大量以普通PC为基础的集群出现在了各个级别的实验室、工业科技中心、大学甚至是一些小的学院中。如果有人问你是否一个有关科学计算的问题可以通过一些松散的计算资源来解决?答案是当然可以。我们可以使用Beowulf集群,它可以使用很多普通的PC做成一个集群来解决我们所面临的问题,并且这种集群所具有的价格优势是传统的并行计算机所无法比拟的。
如何创建一个Beowulf集群
事实上,使用现有的PC或者不用的旧PC,任何人都可以构建一个自己的并行系统来练习并行编程或者进行并行运算。在一个计算机实验室里,我们可以将PC机做成双启动系统(可以根据需要进入Windows或者Linux),将其用作两种用途。此外,对于那些已经不再使用的机器则可以像Stone SouperComputer一样做成一个并行的运算系统。
没有两个Beowulf集群是完全相同的。事实上,这种系统的硬件和软件的配置是如此的灵活,以致于其可以被轻松定制成为不同的组合。虽然每一个Beowulf集群系统都是不同的,并且其配置也是根据应用程序的需要来进行的,但还是有一些基本要求是相同的。下面我们就来看一看在创建一个集群时需要考虑的一些基本问题。
创建一个集群的最低需求
要创建一个集群,每一个节点至少应该包含有一个Intel 486 CPU和主板。虽然Intel 386也可以正常工作,但其性能将不值得我们为之付出劳动。内存的需求则取决于目标应用程序的需求,但每一个节点至少需要16MB的内存。大部分应用程序都会要求每一个节点具有32MB以上的内存。通过使用集中式的磁盘空间,节点可以从软盘、小容量的硬盘或者网络文件系统启动。启动以后,节点可以通过网络访问文件系统中属于自己的Root分区,这种访问一般都是通过NFS(网络文件系统)来实现的。在一个具有高带宽和高性能服务器的环境中,这种配置的工作状态将非常不错。要想获得更好的性能,应该在本地磁盘上安装有操作系统、交换分区,并且数据可以在每一个节点获得。每一个节点应该至少有200MB的磁盘空间用于存放操作系统组件和用作交换空间,还应该有400MB或者更多的空间保留用于程序运行中使用。每一个节点至少要包含有一个网卡(最好是高速网卡)。最后,每一个节点都需要一个显卡,一个硬驱和一个电源。键盘和显示器则只有在进行系统安装和配置时需要。
需要注意的是,所有选择使用的硬件在Linux中都要有驱动程序或者相应的模块,一般来说,除非这些硬件非常陈旧,否则都不是问题。对于需要对整个集群进行管理的主节点来说,为了方便起见,最好安装一个X服务器。安装过程中,如果某一个特定的组件出现问题或者没有驱动程序,可以到论坛中寻求帮助。
网络连接
如果可能,每一个节点最好处于一个单独的局域网中,并且拥有一个自己的Hub.这样可以保证网络通信能够顺畅进行。集群中的第一个或者主节点应该具有两个网卡,其中一个与内部网络相连,另外一个与公共网络相连。这对于用户登录和文件传输尤为有用。在内部网络中,需要使用不在 Internet上使用的IP地址。一般来说,最简单的办法就是A类10.0.0.0地址,因为这些地址是专门为那些没有路由的网络保留的。在本例中,每一个节点的/etc/hosts文件看起来如下所示:
10.0.0.1 node110.0.0.2 node210.0.0.3 node310.0.0.4 node4
每一个节点的/etc/hosts.equiv文件应该如下所示:
node1node2node3node4.
一个节点号为2,使用Red Hat Linux的ifcfg-eth0配置文件如下所示:
DEVICE=eth0IPADDR=10.0.0.2NETMASK=255.0.0.0NETWORK=10.0.0.0BROADCAST=10.255.255.255ONBOOT=yes
此外,我们还经常需要一个DNS,对于那些节点名字和地址经常变化的内部网络更是如此。DNS可以运行在第一个节点来为内部网络的节点提供名字/地址的解析。
本地存储
在加载操作系统的问题上,创建Beowulf集群需要预先做一些存储方面配置的决定。因为一旦安装完成后要进行更改就要重新安装所有的节点,所以一定要进行非常细致的考虑。虽然大部分基于Linux的Beowulf集群运行的是都是Red Hat Linux发行版,但事实上,基本上所有的Linux发行版都支持基本的集群。Red Hat的安装非常简单,我们可以使用光盘或者通过集群的第一个节点进行安装(前提是在节点上已经有一份发行版拷贝)。在实际的使用过程中,很多人发现从主节点通过FTP把操作系统加载到每一个节点要比通过NFS挂载Root分区好。这种方法避免了一些不必要的网络通信,在应用程序运行时保留带宽用于信息的传送。
Red Hat Linux运行环境只需要每一个节点有大约100MB的磁盘空间,不过,在实践中发现在每一个节点包含一个编译和一些其它的工具还是非常必要。因此,在配置中,每一个操作系统需要大约175MB的磁盘空间。虽然有一些集群将交换分区配置在了普通的文件系统上,但在本地磁盘上使用一个专门的交换分区才是一个更高效的选择。一般而言,节点的交换空间的大小应该是内存的2倍,而当内存大于64MB时,交换空间应该等于内存的大小。在实际中,当内存为64MB至 128MB时,我们通常将交换分区设为128MB.因此,如果某一个节点有32MB内存,有2个硬盘,那么我们就应该将Linux系统加载至主驱动上,而将另外一个硬盘用作交换空间(64MB)和本地运行空间(138MB)。
集群管理
系统管理和维护是一件非常乏味的工作,对于大型的集群更是如此。不过,我们可以从网上找到一些工具和脚本来简化这些工作。比如,一个节点必须在时间和系统文件(/etc/passwd、/etc/group、/etc/hosts、/etc/hosts.equiv等)上与其它的节点保持同步,那么一个简单的可以被cron定时执行的脚本将可以来完成这个同步过程。
一旦所有的节点都加载和配置完成后,我们就可以来开发和设计并行应用程序来充分利用新系统的运算能力。
为集群计算开发并行应用程序
在Linux下,我们可以使用商业编译器,也可以使用免费的编译器。GCC、g++和FORTRAN(g77)编译器被包含在了大部分的Linux发行版中。其中C和C++编译器已经非常优秀,而FORTRAN编译器也在不断的进步之中。商业编译器则可以从Absoft、 Portland Group、The Numerical Algorithms Group等公司获取。如果配置适当,一些商业的FORTRAN-90编译器可以自动实现并行计算。一般来说,开发并行代码需要在处理器之间使用PVM (并行虚拟机)、MPI(信息传送接口)或者其它的通信库来进行清晰的信息传递。PVM和MPI都是免费的,并且可以在计算的过程中通过简单的库调用来实现节点的之间的信息传递。
当然,并不是所有的计算任务都适合用并行计算来实现。一般而言,为了充分利用并行计算的优势,通常要对针对任务进行一些开发工作。很多科学问题都可以进行细分,也就是可以将其分解为相对独立的模块,以使其可以在各个独立的节点进行处理。比如,图像处理任务通常可以再细分,让每一个节点都可以处理某一部分的图像。当某一图像可以被独立处理时(比如处理这部分图像不需要其它部分的信息),效果更好。
对于并行计算来说,最危险的缺陷就是将一个计算问题变成了一个通信问题(不管是使用现有的并行运算代码还是自己新开发代码)。这种问题一般发生在将任务过分细化,从而使得各个节点为了保持同步而传输数据的时间超过了CPU进行计算的时间。在这种情况下,使用更少的节点反而可能会获得更多的运行时间和更充分地利用资源。这就是说,对于不同的并行应用程序而言,要根据本地节点计算的负载和通信来进行调整和优化。
最后要说的是,在开发并行算法时,如果所使用的集群环境的节点各不相同,那么就要充分考虑到这个问题。事实上,在运行并行应用程序时,各个节点间CPU的速度是非常关键的,因此,在一个配置不同的集群中,只简单地将任务平均分配,那么速度比较快的CPU就必须要等待速度比较慢的 CPU完成自己的任务,这显然是不合理的。因此,设计适当的算法可以很好地处理这种情况,当然,不管采用什么样的算法,一定要充分考虑到通信过载问题。
并行处理可以以很多种方式来组织,但是master/Slave的组织方式是最易于理解和编写程序的。在这种模式中,一个节点作为master,而另外一个则作为Slave.Master节点通常决定如何分割任务,以及指挥信息的传送,而Slave节点则只负责处理分配到的任务,并在任务完成的时候向master报告。
总结
事实上,在开发并行代码时,并没有严格的规定,而是要根据实际情况来进行。优化硬件配置和算法的前提是要知道所要运行的应用程序的细节。在各个节点配置不同的集群中,在各个节点中进行负载平衡以及各个节点中的通信都取决于硬件的具体情况。在通信速度快的环境里,可以将任务分得更细,反之则不宜将任务过分细化。
应该说“Beowulf运动”将并行计算大众化了。在Beowulf系统中使用标准信息传送库开发的并行代码可以不经过任何更改就直接运行在商业级的超级计算机之上。因此,Beowulf集群可以作为一个入门的切入点,在需要时再将其过渡到大型机上。此外,廉价、通用的集群意味着并行计算机环境可以用于特定的任务,而大型的商业超级计算机由于其过于昂贵,故不可能使其专注于某个单一的应用程序。很显然,随着并行环境越来越多地被应用到现实工作,将会更进一步促进其在各个领域的应用。