[翻译]高性能计算Linux集群,第一部分:集群基础
时间:2006-02-08 来源:jiangqihua
原文:http://www-128.ibm.com/developerworks/linux/library/l-cluster1/index.html
作者:Aditya Narayan ([email protected]), Founder, QCD Microsystems
中文翻译:Jiang Qihua
由于开源软件观念和集群技术的发展,高性能计算(High Performance Computing)正变得越来越容易,这两篇文章的第一篇主要讨论现存的集群种类和使用,还有为什么集群技术在HPC中如此流行,一些HPC的基础和Linux在HPC中的作用.
HPC架构的种类
大部分HPC系统使用并行(parallelism)的概念.许多软件平台是面向HPC的,但首先让我们来看看硬件方面.
HPC硬件分为三类:
- 对称多处理器(Symmetric multiprocessors (SMP))
- 矢量处理器(Vector processors)
- 集群(Clusters)
对称多处理器(SMP)
SMP是一种多个处理器共享相同内存的HPC架构.(在集群中,有所谓的massively parallel processors(MPPs),但他们不共享相同的内存,我们在后面会详细分析).SMPs一般比MPPs更昂贵且缺乏扩展性.
矢量处理器
在矢量处理器中, 处理器被优化来操作编队和矢量;因此而得名的矢量计算系统表现了高性能并在1980年代和1990年代早期支配了整个HPC架构,但集群在近些年变得更为流行.
集群
集群是现在HPC硬件的主要类型;一个集群是MPPs的集合,一个集群中的处理器通常指的是一个节点(node)和它自己
的CPU,内存,操作系统和I/O子系统并有与其他节点通讯的能力.这些年使用一台普通的运行Linux和其他开源软件作为一个集群的节点是很常见的.
你将看到这些不同的HPC硬件是如何不同的,但是还是让我们从集群开始.
集群定义
术语"集群"在不同的上下文中有不同的含义,本文主要讨论一下三种集群:
- 故障切换集群(Fail-over clusters)
- 负载平衡集群(Load-balancing clusters)
- 高性能集群(High-performance clusters)
故障切换集群
最简单的故障切换集群只有两个节点:一个保持活动而另一个保持等待并不断监视活动的节点,一旦活动结点崩溃,这个等待着的节点便立即接手,这样就保持了一个系统能在紧急情况下持续发挥作用.
负载平衡集群
负载平衡集群通常用在繁忙的网站服务器,他们使用数个节点做同一个站点的主机,每一个网页的新请求被动态的发送到负载较低的那个节点上.
高性能集群
这些集群被用来运行并行程序,这些通常是对时间有较高要求的情况,所以科学领域中对高性能集群有特别的兴趣,科学家们通常会想在普通的硬件上以较少的时间运行仿真器和其他对运算能力有高要求的程序.
图1展示了一个基本的集群.本系列的第二部分将说明如何建立这样一个集群并为它写程序.
网格计算(Grid computing)是 一个范围很广的术语,通常指一个的面向服务的架构(service-oriented architecture (SOA)),这个架构是由一些有松散联系的系统组成的.基于集群的HPC是网格计算的一个特例因为在其中节点是被紧密连接着的,网格计算中的一个成功且 有名的项目是SETI@home, 即搜索地球外智慧生命计划(the Search for Extraterrestrial Intelligence program),它使用数百万台家用个人电脑运行屏幕保护程序的时间所空闲的CPU资源来分析射电望远镜的数据,一个类似的成功项目是蛋白质折叠计算Folding@Home计划.
高性能集群的通常用途
几乎每一个行业需要快速处理能力,随着计算机变得更便宜和更快,更多的公司对技术的进步感到了兴趣.对计算机处理能力的要求是永无止境的;即使随着计算能力的快速增长,需求仍相对的会大于供给.
生命科学研究
蛋白质分子是又长又变化多端的链式结构,可以呈现出事实上无穷数量的三维形状.在自然界,当蛋白质分子被放入溶液后,它们很快的"折叠"成它们的天然态.不正确的折叠被认为会导致不同的疾病如Alzheimer症;因此,对蛋白质折叠的研究是相当重要的.
科学家试图理解蛋白质折叠的一种方法是在计算机上进行模拟.在自然界,折叠发生地很快(大约百万分之一秒)但是以普通的电脑来模拟这一如此复杂的过程可能要花费数十年的时间.这只是这个行业中众多如此领域中的一个,但它确实需要强大的计算能力.
这个行业中另一些焦点包括药物建模,虚拟外科训练,可视化诊断,药物数据库,和人类基因组计划(Human Genome Project).
石油和天然气探测
震动图逐条表现了地底和海床下面的地质特征,对于这些数据的分析能够帮助探测石油和其他资源.即使是相当小的一个区域也有TB数量级的数据需要被重构.在这个领域对于计算能力的要求是如此之大以致超级计算资源总是被租来做这项工作.
其他地质学的成就需要类似的计算能力,比如设计预报地震的系统和设计多谱线的卫星影像系统.
图形处理
由 于数据总和的容量相当大,操作高分辨率的交互式图形在工程上(比如飞机引擎设计)总是对性能和扩展性的一个挑战.基于集群的技术在这个领域帮助很大,绘图 的任务被分成小块并交给集群中的不同节点,这些节点使用它们的图形硬件来描绘各自负责的屏幕的部分并把像素信息传输到一个主节点好让它在屏幕上绘制出总和 的图像.
以上这些例子仅仅是冰山一角;更多的程序包括天体物理仿真,气象仿真,引擎设计,金融建模,投资模拟和电影特效都需要更多的计算资源.
Linux和集群式如何改变HPC的
在集群计算出现之前,典型的超级计算机是一个通常值超过100万美元的矢量处理器,而原因是它使用了特殊的硬件和软件.
随着Linux和其他免费的开源集群软件组件的出现和硬件通用性的改善,现在的形势完全不同的,你可以以非常少的预算构建一个强大的集群并可以在需要的时候增加额外的节点
GNU/Linux 操作系统(Linux)在很大程度上适合集群的部署.Liunx能在相当广泛的硬件上运行,高品质的编译器和其他软件比如并行文件系统和MPI实现在 Linux上是免费的.使用Linux的用户可以根据他们的工作量定制自己的内核.Linux被认为是构建HPC集群的理想平台.
理解硬件:矢量vs.集群
为了理解HPC硬件,比较一下矢量计算范例和集群范例是很有用的.这些是相互竞争的技术(Earth Simulator,一台矢量超级计算机,仍然是当今10大最快速超级计算机之一).
基本上来说,矢量和标量处理器都基于一个时钟来执行指令;使它们区分的东西是矢量处理器有并行计算涉及矢量的能力(比如矩阵乘法),这种能力被广泛地使用在HPC中.为了解释这点,假设你有两个双精度浮点数数组a和b,你想创造第三个数组x并使x[i]=a[i]+b[i].
任何浮点数操作比如加或乘都可以由一系列分开的步骤达到.
1.指数被调整
2.底数被相加
3.检查结果的舍入误差
等等
一个矢量处理器使用一种叫做流水线操作(pipelining)的技术来并行执行这些内部操作,假设浮点数加法有六步(就像IEEE算术硬件里一样)如图2所示.
一 个矢量处理器并行处理这六个步骤--如果第i个数组元素被加发生在第四个阶段,矢量处理器将为第i+1个元素执行第三个阶段,为第i+2个元素执行第二个 阶段,如此下去.正如你所看到,一个六部的浮点加法,由于所有的阶段在任意给定时刻都是活动的,速度将提高到接近于原来的六倍(在开始和结束时,不是所有 六个阶段都在活动).一个很大的好处是并行动作全部发生在后台,你不需要在你的程序中编写有关并行的代码.
在很大的程度上,所有的六个步骤都可以并行执行导致了性能上几乎六倍的增长.
相比于矢量处理,基于集群的计算走了一条基本上完全不相同的路径.它使用标准标量处理器而不是特殊的定制的矢量处理硬件,但是却能并行处理为数众多的计算.
集群的一些特点如下所示:
- 集群使用通用的硬件构建而成,价格只是矢量处理器的一小部分.在很多情况下,价格会降低一个数量级.
- 集群使用message-passing范例来通信,程序必须被重新编写以使用分布式硬件.
- 使用集群,你可以根据需要增加更多的节点到集群中
- 开源软件组件和Linux导致了更低的软件成本
- 集群有更低的维护费用(它们使用更少的空间更少的电源,需要更少的冷却)
并行编程和Amdahl定律
为了达到集群的高性能,软件和硬件必须联合起来。程序必须被编写成能够明确利用底层硬件的好处,而现存的非并行程序必须重写以适应在集群上的运行.
并行程序在同一时刻做许多事情.做多少取决于问题的性质,假设占一个程序运行总时间的1/N是的部分时不能够被并行运算的,而剩下的(1-1/N)是在可被并行化的部分.
理论上你可以用无限数量的硬件来运行并行部分使它的运行时间达到零.但是连续的部分不会有任何改善.结果是你能够达到的运行程序的最快时间是原来的1/N,不会再快了,在并行编程中,这个现象通常叫做Amdahl定律.
Amdahl定律指出了使用并行处理器相对于使用串行处理器能够加速多少.加速(Speedup)被定义为程序以串行方式运行所费的时间除以其以并行方式运行的时间.
T(1)
S = ------
T(j)
T(j)指使用j个处理器运行所使用的时间
在图3中,在使用尽量多的节点并行运算时,T'par可以被减少到零,不但Tseq不会改变,在最好的情况下,并行的版本不会比原来速度的1+Tpar/Tseq还要快.
在 写一个并行程序中真正困难的部分是使N尽量的大.但这里有一个有趣的手法来达到这个目的.你通常在更强大的电脑上尝试规模更大的问题,而在连续部分所花的 时间通常会随着问题规模的增长而减小(因为你试图更改程序并增加并行的部分来最优化可用的资源).这样,N的值会自动变得更大.
并行编程方法
让我们来看看两个并行编程的的方法:分布内存方法和共享内存方法
分布内存方法
想象一个主-从模型:
- 主节点在数个从节点之间分配工作.
- 从节点干他们各自的任务.
- 从节点在他们认为需要时互相通讯.
- 从节点向主节点返回结果.
- 主节点汇编这些结果并进一步分配工作,如此以往.
很明显这种方法的实际问题在于分布式内存的组织.因为每个节点只能访问自己拥有的内存,如果其他节点需要访问,数据结构必须被复制并在网络上传送,这导致了网络的过载.为了写出有效率的分布式内存程序,必须把这些缺点和主-从模型记在脑中.
共享内存方法
在 共享内存方法中,内存是所有处理器所通用的(比如SMP).这种方法并没有避免上面提到的分布式内存方法所遇到的问题(原文如此,译注),然而,这样的系 统上的编程更容易些,因为所有的数据对所有的处理器都是公开的,这样就和连续编程没有什么区别.这种系统的大问题是扩展性:增加额外的处理器是很困难的.
并行编程(就像其他所有的编程一样)像科学一样巧妙和富有艺术性,设计和性能的都留给我们相当大的改进和提高的空间,并行编程在计算中有其特殊位置;这个系列的第二部分将考察并行编程平台和举一些例子.
当文件I/O成为瓶颈
一些程序经常会在磁盘上读写大量的数据,这总是计算中最慢的一个步骤.更快的硬盘驱动器能够改善,但是总有它们不够的时候.
当一个硬盘分区在所有的节点之间共享时(比如使用NFS)这个问题更突出了,而这在Linux集群中是很常见的.这就是并行文件系统能派上用场的地方.
并行文件系统把 一个文件分散在许多不同节点的硬盘上,这些节点被称作I/O节点.当一个程序试图读一个文件时,那个文件的每个小部分被并行地读取.这减少了每一个磁盘控 制器的负载并允许他们接受更多的请求.(PVFS是开源并行文件系统中的一个很好的例子; 在一个Linux集群上使用标准IDE磁盘的环境下,磁盘的性能已经超过了1GBsec)
PVFS可以作为Linux内核模块或者可以被编译进Linux内核,后台实现的概念是很简单的(见图4):
- 一个元数据服务器存放文件的各个部分所在位置的信息
- 若干个I/O节点存放文件的碎片(任何普通的文件系统比如ext3都可以被PVFS所使用).
当一个集群中的一个计算节点想要访问这个并行文件系统中的一个文件时,它会采取接下来的步骤:
- 它会像平常一样请求一个文件,然后这个请求到了底层PVFS文件系统.
- PVFS向元数据服务器发送一个请求(图4的第一第二部),得知关于文件在I/O节点中所在位置的信息.
- 得到了这些信息,计算节点直接与所有的相关I/O节点通讯并得到了这个文件的所有碎片.
所有这些对呼叫程序是透明的,PVFS管理在底层的复杂操所比如向所有I/O节点发送请求,调整文件内容等等.
资源
略