高性能的 Linux 集群IBM文章.docx
《高性能的 Linux 集群IBM文章.docx》由会员分享,可在线阅读,更多相关《高性能的 Linux 集群IBM文章.docx(23页珍藏版)》请在冰豆网上搜索。
高性能的Linux集群IBM文章
高性能的Linux集群,第1部分:
集群基础
采用Linux集群技术的高性能计算的基本概念简介
高性能计算(HPC)正在变得越来越简单,这是由于两个原因:
开放源码软件概念的采用,以及集群技术的精炼。
本文是两篇系列文章中的第一篇,讨论了集群的类型、用途以及在HPC领域变得更加流行的原因、HPC基础以及Linux®在HPC中的角色。
现在Linux集群在很多领域都已经变得非常流行了。
随着集群技术的出现以及开放源码软件日益得到采纳,现在只需要传统高性能机器的很少一部分成本就可以构建一台超级计算机了。
这两篇系列文章简要介绍采用Linux集群技术的高性能计算(HPC)的概念,展示如何构建集群并编写并行程序。
本文是两篇系列文章中的第一篇,讨论了集群的类型、用途、HPC基础、Linux在HPC中的角色以及集群技术日益增长的原因。
第2部分将介绍并行算法的知识,并介绍如何编写并行程序、如何构建集群以及如何进行基准测试。
HPC体系架构的类型
大部分HPC系统都使用了并行 的概念。
有很多软件平台都是面向HPC的,但是首先让我们先来了解一下硬件的知识。
HPC硬件可以分为3类:
∙对称多处理器(SMP)
∙向量处理器
∙集群
对称多处理器(SMP)
SMP是HPC采用的体系架构之一,其中有多个处理器会共享内存。
(在集群中,这也称为 大规模并行处理器(massivelyparallelprocessor,MPP),它们并不需要共享内存;稍后我们将更详细介绍这方面的内容。
)与MPP相比,SMP通常成本更高,而且可伸缩性较差。
向量处理器
顾名思义,在向量处理器中,CPU被优化以便很好地处理向量数组的运算。
向量处理器系统的性能很高,在20世纪80年代到90年代早期一度在HPC体系架构中占有统治地位,但是最近几年以来,集群变得更加流行了。
集群
集群是最近几年中最为主要的一种HPC硬件:
集群(cluster) 就是一组MPP的集合。
集群中的处理器通常被称为 节点,它具有自己的CPU、内存、操作系统、I/O子系统,并且可以与其他节点进行通信。
目前有很多地方都使用常见的工作站运行Linux和其他开放源码软件来充当集群中的节点。
接下来您将看到这些HPC硬件之间的区别,但是首先让我们从集群开始。
回页首
集群定义
术语“集群(cluster)”在不同的地方可能会意味着不同的意义。
本文重点介绍以下三种类型的集群:
∙故障迁移集群
∙负载均衡集群
∙高性能集群
故障迁移集群
最简单的故障迁移集群有两个节点:
一个节点是活动的,另外一个节点是备用的,不过它会一直对活动节点进行监视。
一旦活动节点出现故障,备用节点就会接管它的工作,这样就能使得关键的系统能够持续工作。
负载均衡集群
负载均衡集群通常会在非常繁忙的Web站点上采用,它们有多个节点来承担相同站点的工作,每个获取Web页面的新请求都被动态路由到一个负载较低的节点上。
高性能集群
高性能集群用来运行那些对时间敏感的并行程序,它们对于科学社区来说具有特殊的意义。
高性能集群通常会运行一些模拟程序和其他对CPU非常敏感的程序,这些程序在普通的硬件上运行需要花费大量的时间。
图1解释了一个基本的集群。
本系列文章的第2部分将展示如何创建这种集群,并为其编写程序。
图1.基本的集群
网格计算 是一个更为广泛的术语,通常用来代表利用松耦合系统之间的协作来实现面向服务的架构(SOA)。
基于集群的HPC是网格计算的一个特例,其中节点之间都是紧耦合的。
网格计算的一个成功的、众所周知的项目是SETI@home,即搜索外星智慧的项目,它使用了大约一百万台家用PC在屏保时的空闲CPU周期来分析无线电天文望远镜的数据。
另外一个类似的成功项目是Folding@Home项目,用来进行蛋白质的折叠计算。
回页首
高性能集群的常见用途
几乎所有的产业界都需要快速的处理能力。
随着越来越便宜而且快速的计算机的出现,更多公司表现出了对利用这些技术优势的兴趣。
人们对于计算处理能力的需求是没有上限的;尽管处理能力在迅速提高,但是人们的需求仍然超出计算能力所能提供的范围。
生命科学研究
蛋白质分子是非常复杂的链,实际上可以表示为无数个3D图形。
实际上,在将蛋白质放到某种溶液中时,它们会快速“折叠”成自己的自然状态。
不正确的折叠会导致很多疾病,例如Alzheimer病;因此,对于蛋白质折叠的研究非常重要。
科学家试图理解蛋白质折叠的一种方式是通过在计算机上进行模拟。
实际上,蛋白质的折叠进行得非常迅速(可能只需要1微秒),不过这个过程却非常复杂,这个模拟在普通的计算机上可能需要运行10年。
这个领域只不过是诸多业界领域中很小的一个,但是它却需要非常强大的计算能力。
业界中其他领域包括制药建模、虚拟外科手术训练、环境和诊断虚拟化、完整的医疗记录数据库以及人类基因项目。
石油和天然气勘探
震动图中包含有大陆和洋底内部特性的详细信息,对这些数据进行分析可以帮助我们探测石油和其他资源。
即便对于一个很小的区域来说,也有数以TB计的数据需要重构;这种分析显然需要大量的计算能力。
这个领域对于计算能力的需求是如此旺盛,以至于超级计算机大部分都是在处理这种工作。
其他地理学方面的研究也需要类似的计算能力,例如用来预测地震的系统,用于安全性工作的多谱段卫星成像系统。
图像呈现
在工程领域(例如航天引擎设计)操纵高分辨率的交互式图像在性能和可伸缩性方面历来都是一种挑战,因为这要涉及大量的数据。
基于集群的技术在这些领域已经取得了成功,它们将渲染屏幕的任务分割到集群中的各个节点上,在每个节点上都利用自己的图形硬件来呈现自己这部分屏幕的图像,并将这些像素信息传送到一个主节点上,主节点对这些信息进行组合,最终形成一个完整的图像。
这个领域中的例子目前才不过是冰山一角;更多的应用程序,包括天体物理模拟、气象模拟、工程设计、金融建模、证券模拟以及电影特技,都需要丰富的计算资源。
对于计算能力越来越多的需求我们就不再进行介绍了。
回页首
Linux和集群如何改变了HPC
在基于集群的计算技术出现之前,典型的超级计算机都是向量处理器,由于它们全部采用专用的硬件和软件,因此成本通常会超过一百万美元。
随着Linux和其他免费的集群开放源码软件组件的出现和常用硬件处理能力的提高,这种情况现在已经发生了很大的变化。
您可以利用少量的成本来构建功能强大的集群,并能够根据需要来添加其他节点。
GNU/Linux操作系统(Linux)已经在集群中得到了大量的采用。
Linux可以在很多硬件上运行,并且具有高质量的编译器和其他软件,例如并行文件系统和MPI实现在Linux上都是免费的。
采用Linux,用户还可以针对自己的任务负载对内核进行定制。
Linux是构建HPC集群的一个非常好的平台。
回页首
理解硬件:
向量机与集群
要理解HPC硬件,对向量计算和集群计算进行一下比较是非常有用的。
二者是互相竞争的技术(地球模拟器 是一台向量超级计算机,目前仍然是最快的10台机器之一)。
从根本上来讲,向量处理器和标量处理器都是基于时钟周期来执行指令的;使它们产生区别的是向量处理器并行处理与向量有关的计算的能力(例如矩阵乘法),这在高性能计算中是非常常见的。
为了展示这一点,假设您有两个双精度的数组 a 和 b,并且要创建第三个数组 x,比如x[i]=a[i]+b[i]。
任何浮点操作,例如加法和乘法,都可以通过几个步骤来实现:
∙进行指数调整
∙添加符号
∙对结果进行取整检查等
向量处理器通过使用 流水线(pipeline) 技术在内部对这些步骤进行并行处理。
假设在一个浮点加法运算中有六个步骤(与IEEE算术硬件一样),如图2所示:
图2.IEEE算术硬件中的六级流水线
向量处理器可以并行处理这六个步骤——如果第i个数组元素是在第4个步骤中被添加的,那么向量处理器就会为第(i+1)个元素执行第3个步骤,为第(i+2)个元素执行第2个步骤,依此类推。
正如您可以看到的一样,对于一个6级的浮点加运算来说,加速比非常接近于6(在开始和结束时,这六个步骤并不是都处于活动状态的),因为在任何给定的时刻(图2所示的红色),这些步骤都是活动的。
这样做的一大优点是并行处理都是在幕后进行的,您并不需要在程序中显式地进行编码。
对于大部分情况来说,这六个步骤都可以并行执行,这样就可以获得几乎6倍的性能提高。
箭头表示了对第i个数组元素所进行的操作。
与向量处理相比,基于集群的计算采用的是完全不同的一种方法。
它不使用专门优化过的向量硬件,而是使用标准的标量处理器,但是它采用了大量的处理器来并行处理多个计算任务。
集群的特性如下:
∙集群都是使用常见的硬件进行构建的,其成本只是向量处理器的很小一部分。
在很多情况中,价格会低一个数量级以上。
∙集群使用消息传递系统进行通信,程序必须显式地进行编码来使用分布式硬件。
∙采用集群,您可以根据需要向集群中添加节点。
∙开放源码软件组件和Linux降低了软件的成本。
∙集群的维护成本很低(它们占用的空间较小,耗费的电力较少,对于制冷条件的需求较低)。
回页首
并行编程和Amdahl法则
当在集群上实现高性能环境时,软件和硬件就需要联合起来工作。
程序在编写时必须要显式地利用底层硬件的优点,如果现有的非并行程序不能很好地在集群上运行,那么这些程序必须重新进行编写。
并行程序一次要执行很多操作。
其数量取决于目前正在解决的问题。
假设一个程序所花费的时间中有1/N是不能并行处理的,那么剩余的(1-1/N)就是可以并行处理的部分(请参看图3)。
图3.Amdahl法则
从理论上来说,您可以采用无数的硬件来处理并行执行的部分,甚至在接近0的时间内完成这些任务,但是对于串行部分来说,这样做不会有任何提高。
结果是,可以实现的最佳结果是使用原来的1/N的时间来执行整个程序,但是不可能再快了。
在并行编程中,这个事实通常就称为Amdahl法则。
Amdahl法则揭示了使用并行处理器来解决问题与只使用一个串行处理器来解决问题的加速比。
加速比(speedup) 的定义如下:
(使用多个处理器)并行执行程序所需要的时间除以(使用一个处理器)串行执行程序所需要的时间:
T
(1)
S=------
T(j)
其中T(j)是在使用j个处理器来执行程序时所需要的时间。
在图3中,如果采用足够多的节点来进行并行处理,那么T'par就可以非常接近于0,但是Tseq却不会变化。
在最好的情况中,并行程序也不可能快到原来的1+Tpar/Tseq。
在编写并行程序时真正困难的事情是使N尽量大。
但是这件事情却有两面性。
通常都是要试图在更为强大的计算机上来解决更大的问题,通常随着所解决问题的规模的增大(例如试图修改程序并提高可并行的部分来优化地利用可用资源),所花费在串行部分上的时间就会减少。
因此,N值就会自动变大了。
(请参看本文后面 参考资料 部分所给出的Amdhal法则推论。
)
回页首
并行编程的方法
现在让我们介绍两种并行编程的方法:
分布式内存方法 和 共享式内存方法。
分布式内存方法
此处我们考虑一种主从模式非常有用:
∙主节点负责将任务划分到多个从节点上。
∙从节点负责处理自己所接收到的任务。
∙如果需要,从节点之间会相互进行通信。
∙从节点将结果返回给主节点。
∙主节点收集结果,并继续分发任务,依此类推。
显然,这种方法的问题就产生于分布式内存的组织。
由于每个节点都只能访问自己的内存,如果其他节点需要访问这些内存中的数据,就必须对这些数据结构进行复制并通过网络进行传送,这会导致大量的网络负载。
要编写有效的分布式内存的程序,就必须牢记这个缺点和主从模型。
共享式内存方法
在共享式内存方法中,内存对于所有的处理器(例如SMP)来说都是通用的。
这种方法并没有分布式内存方法中所提到的那些问题。
而且对于这种系统进行编程要简单很多,因为所有的数据对于所有的处理器来说都是可以使用的,这与串行程序并没有太多区别。
这些系统的一个大问题是可伸缩能力:
不容易添加其他处理器。
并行编程(与所有的编程技术一样)与其他科学一样,都是一门艺术,总会留下一定的空间来进行设计的改进和性能的提高。
并行编程在计算中有自己特殊的地位:
本系列文章的第2部分将介绍并行编程平台,并给出几个例子。
回页首
当文件I/O成为瓶颈时怎么办?
有些应用程序通常会需要从磁盘中读写大量的数据,这通常是整个计算过程中速度最慢的一个步骤。
更快的硬盘驱动器能够帮助解决一些问题,但是有时这是不够的。
如果一个物理磁盘分区是在所有节点之间共享的(例如使用NFS),就像是在Linux集群中经常采用的方法一样,那么这个问题就会变得更加明显了。
此时就是并行文件系统的用武之地了。
并行文件系统(Parallelfilesystem) 将数据存放在分布在多个磁盘上的文件中,这些磁盘连接到集群中的多个节点上,这些节点称为I/O节点。
当一个程序试图读取某个文件时,可以并行地从多块磁盘上分别读取这个文件的某些部分。
这可以降低某个磁盘控制器上的负载,并能够处理更多请求。
(PVFS就是一个很好的开放源码并行文件系统;目前已经在Linux集群上使用标准的IDE硬盘实现了超过1GB/s的磁盘性能。
)
PVFS可以作为一个Linux内核模块使用,也可以编译到Linux内核中。
底层的概念非常简单(请参看图4):
∙元数据服务器负责存储文件的哪些部分存储在什么地方的信息。
∙多个I/O节点上存储了文件的各个部分(PVFS底层可以使用任何常见的文件系统,例如ext3)。
图4.PVFS是如何工作的
当集群中的计算节点想要访问并行文件系统中的一个文件时,它需要执行以下步骤:
∙像平常一样请求文件,请求被传送到底层的PVFS文件系统中。
∙PVFS向元数据服务器发送一个请求(图4中的步骤1、2),这会通知请求节点有关文件在各个I/O节点上的位置的信息。
∙使用这些信息,计算节点直接与所有相关的I/O节点进行通信,获得整个文件(步骤3)。
这些步骤对于调用应用程序来说都是透明的;底层对所有I/O节点发出请求的复杂性、获取文件的内容等等,都是由PVFS处理的。
有关PVFS有一件好的事情:
不需做任何修改就可以在其上运行普通文件系统的二进制形式——这在并行编程领域多少是个例外。
(参考资料中介绍了其他一些并行文件系统。
)
参考资料
学习
∙您可以参阅本文在developerWorks全球站点上的 英文原文。
∙构建自己的集群:
oBuildingaLinuxHPCClusterwithxCAT(IBM红皮书,2002年9月)为系统架构师和工程师介绍了基本的集群技术、术语以及安装Linux高性能计算(HPC)集群的知识。
oLinuxHPCClusterInstallation(IBM红皮书,2001年6月)重点介绍了用来安装和管理的xCAT(xCluster管理工具)。
o“BuildinganHPCClusterwithLinux,pSeries,Myrinet,andVariousOpenSourceSoftware”(IBM红皮书,2004年7月)介绍了如何利用一组pSeries节点和Myrinet网络来构建一个可以真正运行HPC产品负载的环境。
o“使用coLinux和openMosix构建异构集群”(developerWorks,2005年2月)展示了如何构建一个混合的HPCLinux集群。
oLinuxClusteringwithCSMandGPFS (IBM红皮书,2004年1月)重点介绍了集群系统管理和Linux集群上的通用并行文件系统。
∙请访问 SETIProject,并学习有关 SETI@home 的知识。
∙有关蛋白质折叠的知识,请访问 Folding@HomeProject,并了解 introductiontoproteinfolding。
∙学习有关IBM的 DeepComputingCapacityonDemand 的知识,这是为石油和其他业界处理计算敏感的任务而设计的计算中心。
∙JohnL.Gustafson解释了一个 Amdhal法则的推论。
∙学习如何使用常见的IDE磁盘利用 PVFS 实现每秒1GB的I/O吞吐量。
∙5部分的系列文章,“Buildadigitalanimationsystem”(developerWorks,2005年7月),介绍了如何构建一个HPC集群,您可以使用它来运行专用系统。
∙在 developerWorksLinux专区 中可以找到更多为Linux开发人员准备的资料。
∙要学习更多有关网格计算的知识,请阅读 Gridcomputing新手入门 ,并查看developerWorks上的 网格专区。
获得产品和技术
∙下载 ParallelVirtualFilesystem。
∙在您的下一个开发项目中采用 IBM试用版软件,这可以从developerWorks上直接下载。
讨论
∙通过参与 developerWorksblogs 加入developerWorks社区。
高性能的Linux集群,第2部分:
构建一个工作集群
本系列的第1篇 集群基础 讨论了集群的类型、用途、HPC基础以及集群技术在HPC领域变得更加流行的原因。
本文介绍了并行算法,并介绍了如何编写并行程序、构建集群以及对集群进行基准测试。
我们将介绍如何使用MPI进行并行编程,以及构建Linux集群的基础知识。
在本文中,我们将会介绍有关OSCAR的内容,这是一个用来帮助构建健壮集群的开放源码项目。
另外,我们还会概要介绍集群管理和基准测试的概念,并详细介绍在集群上运行标准LINPACK测试的步骤。
如果已经安装好了Linux,在阅读本文之后,就可以安装Linux集群并进行故障排除了。
下面的 参考资料 中给出的链接可以帮助您学习更多有关集群的知识。
集群和并行编程平台
正如在 第1部分 中可以看到的一样,HPC大部分都是有关并行编程的。
并行编程是一个发展相当完善的领域,在过去20年中,已经开发出了多种编程平台和标准。
HPC中使用的两种主要的硬件平台是共享内存系统和分布式内存系统。
详细信息请参阅 第1部分。
在共享内存系统 中,HighPerformanceFORTRAN是一种非常适合并行编程的语言。
它可以有效地利用数据的并行,并将其作为一个整体数组在不同处理器上使用不同的索引来同时执行指令。
因此,这只需要最少的努力就可以提供自动的并行处理能力。
(Jamaica项目就是这样一个例子,标准的Java程序可以使用特殊的编译器进行重构来生成多线程的代码。
然后所生成的代码就可以自动利用SMP体系架构的优点,并可以并行执行了。
)
在分布式内存系统 上,情况会有根本的不同,这是因为内存是分布式的;必须编写能够理解硬件底层的分布式特性的代码,并且需要显式地使用消息传递在不同的节点之间交换信息。
并行虚拟机(PVM)曾经是一个非常流行的并行编程平台,但是最近MPI已经成为了为集群编写并行程序的事实标准。
为Linux上FORTRAN、C和C++使用的高质量的MPI实现可以免费获得。
流行的MPI实现有两个:
∙MPICH
∙LAM/MPI
在本文稍后的部分中,我们将构建一个基于MPICH的Linux集群,并来看一个基于MPI的程序例子。
回页首
创建一个简单的Linux集群
有关集群最有趣的事情之一是,如果我们有基本的Linux安装,并且具备一定的故障排除的技能,只需要很少的努力就可以构建基于Linux的集群。
让我们来看一下这是如何实现的。
对于我们的集群,要使用MPICH和一组普通的Linux工作站。
为了简单起见,并且重点突出其中的基本原理,我们将构建最小的裸系统,在集群环境中可以使用它来运行并行程序。
本节中给出的7个步骤将显示如何构建裸系统。
构建健壮的集群以及集群的管理涉及很多工作,我们在本文后面进行介绍。
步骤1
如果想获得一个真正的集群,至少需要两台Linux机器。
两个VMware映像也可以很好地实现这种功能。
(使用VMware,显然我们并不会期望能获得什么性能优势。
实际上,其性能显然会有所下降,因为CPU需要进行共享。
)请确保这些机器彼此之间可以使用机器名相互ping通。
否则,就需要在/etc/hosts中添加适当的项。
步骤2
安装GNUC编译器和GNUFORTRAN编译器。
步骤3a
为所有节点配置SSH,允许不询问密码就可以执行命令。
这样做的目的是能够不需询问密码就可以执行 ssh-nhostwhoami 这样的命令。
SSH用作不同机器之间的通信方法。
(也可以使用rsh来实现这种功能。
)
步骤3b
ssh-keygen-f/tmp/key-tdsa 可以在文件key中生成一个私钥,在文件key.pub中生成一个公钥。
步骤3c
如果正在以root用户的身份构建集群,并且以root用户的身份来运行程序(显然只有在进行实验时才会这样),那么就可以将私钥拷贝到文件/root/.ssh/identity中,并将公钥拷贝到集群中所有节点上的/root/.ssh/authorized_keys文件中。
为了确保所有的配置都能正常工作,请执行下面的命令:
ssh-nhostname'date',并查看这个命令能否成功执行,而不会出现任何错误。
应该对所有节点都执行这种测试,这样就可以确保所有节点上的设置都没有问题。
注意:
可能还需要修改防火墙的配置,使其允许节点彼此之间相互进行通信。
步骤4a
接下来,我们将安装MPICH。
从anl.gov的Web站点(请参阅 参考资料 中的链接)上下载UNIX版本的MPICH。
下面是一个简要介绍。
步骤4b
假设您已经将所下载的mpich.tar.gz放到了/tmp中:
cd/tmp
tar-xvfmpich.tar.gz(假设执行这个命令之后会得到一个/tmp/mpich-1.2.6目录)
cd/tmp/mpich-1.2.6
步骤4c
./configure-rsh=ssh ——这告诉MPICH使用ssh作为通信机制。
步骤4d
make ——执行完这个步骤之后,就已经安装好MPICH了。
步骤5
要让MPICH知道所有的节点,请编辑文件/tmp/mpich-1.2.6/util/machines/machines.LINUX,并将所有节点的主机名添加到这个文件中,这样安装的MPICH就可以知道所有的节点了。
如果以后再添加新的节点,也请修改这个文件。
步骤6
将目录/tmp/mpich-1.2.6拷贝