集群系统
在过去的几十年中,出现了许多支持高性能计算的计算机系统。最为普通的系统是:
- 大规模并行处理器(MPP)
- 对称多处理器(SMP)
- Cache一致性的非统一内存访问(CC-NUMA)
- 分布式系统
- 集群系统(Cluster )
集群系统以其较高的性价比越来越受到普遍的欢迎。集群是一种并行或分布处理的系统,它由一组互相连接的多个独立计算机的集合组成,并作为一个单独的集成的计算资源工作。这些计算机可以是单机或多处理器系统(PC、工作站或SMP),每个结点都有自己的存储器、I/O设备和操作系统。集群对用户和应用来说是一个单一的系统,它可以提供低价高效的高性能环境和快速可靠的服务。
集群(cluster)计算技术一直是计算机界研究的一个热点问题。集群系统不但能够充分利用现有的计算资源,而且能够通过较低的软、硬件代价实现较高性能的计算机系统。随着微处理器技术和高性能网络技术的飞速发展,集群计算逐渐成为一种有成本效益的并行/分布式计算资源。目前,最具代表性的集群系统是美国UC Berkerly大学的NOW项目和NASA的Beowulf项目。
集群系统具有很多优点:
- 易于同现有网络集成
- 可伸缩性好,易于保护用户投资
- 工作站上用户的低要求,使得盗用周期式的集群连接成为可能
- 工作站上现有的丰富的标准成熟的开发工具
这些都使得集群系统成为一种发展趋势。
资源管理和负载平衡
集群计算系统一般是多用户(Multi-user)、分时共享(Time-sharing)的系统。集群系统的主要目标是通过网络互连实现全系统范围内的资源的共享,同时通过高效的资源管理和任务调度技术实现资源的有效共享,从而提高资源利用率,获得高性能。为了使由独立机器组成的集群系统工作起来,且形成对用户透明的单一系统,必须为其提供调度、负载平衡和共享服务。因此,我们认为资源的有效利用是集群系统软件研究的关键问题。
集群系统的资源管理与调度系统(RMS:Resource Management and Scheduling)是集群计算技术中一个非常重要的方面:
- 从系统的角度来看,集群系统的资源使用率是最重要的问题。系统资源率使用越高,说明系统吞吐能力(Throughput)越大,资源共享的效果也越好。高吞吐能力计算(High-throughput Computing)的目标就是充分有效的利用集群系统中的所有资源,达到更高的总体性能。
- 从用户的角度来看,任务的响应时间(或平均响应时间)是最为重要的问题。任务的平均响应时间是用户评价集群系统的重要指标。高性能计算(High-Performance Computing) 的目标就是尽量减少单个任务的执行时间。
集群计算系统的核心问题是资源的共享及有效利用,只有平衡的负载才能达到最大的资源使用率。因此,资源负载平衡是实现资源有效共享,提高系统资源使用率的必然要求。负载平衡的实现机制有两种:
- 初始放置(Initial Placement)或远程执行(Remote Execution)。初始放置技术是当进程在某个计算节点产生时,根据负载平衡的要求将进程转移到其它节点远程执行的方法。
- 进程迁移(Process Migration)。在进程运行过程中,根据系统的负载情况,通过将进程从负载较重(Over-loaded)的节点转移到另一负载较轻(Under-loaded)的节点继续运行,可以有效的实现负载的动态平衡。进程迁移技术使得动态调度成为可能。
虽然抢占式进程迁移算法比初始放置算法代价要高,但它的综合性能更为有效。Horchol-Balter和Downey的研究认为,抢占式进程迁移算法能够减少平均延迟35-50%。进程迁移作为支持负载平衡和高容错性的一种非常有效的手段,一直受到人们的重视。
进程迁移(Process Migration)
什么是进程迁移?
进程迁移就是将一个进程从当前位置移动到指定的处理器上。它的基本思想是在进程执行过程中移动它,使得它在另一个计算机上继续存取它的所有资源并继续运行,而且不必知道运行进程或任何与其它相互作用的进程的知识就可以启动进程迁移操作,这意味着迁移是透明的。
进程迁移的好处
进程迁移是支持负载平衡和高容错性的一种非常有效的手段。对一系列的负载平衡策略的研究表明进程迁移是实现负载平衡的基础,进程迁移在很多方面具有适用性:
- 动态负载平衡:将进程迁移到负载轻或空闲的节点上,充分利用可用资源,通过减少节点间负载的差异来全面提高性能。
- 容错性和高可用性:某节点出现故障时,通过将进程迁移到其它节点继续恢复运行,这将极大的提高系统的可靠性和可用性。在某些关键性应用中,这一点尤为重要。
- 并行文件IO:将进程迁移到文件服务器上进行IO,而不是通过传统的从文件服务器通过网络将数据传输给进程。对于那些需向文件服务器请求大量数据的进程,这将有效的减少了通讯量,极大的提高效率。
- 充分利用特殊资源:进程可以通过迁移来利用某节点上独特的硬件或软件能力。
- 内存导引(Memory Ushering)机制:当一个节点耗尽它的主存时,Memory Ushering机制将允许进程迁移到其它拥有空闲内存的节点,而不是让该节点频繁地进行分页或和外存进行交换。这种方式适合于负载较为均衡,但内存使用存在差异或内存物理配置存在差异的系统。
进程迁移的实现角度
进程迁移的实现复杂性及对OS的依赖性阻碍了进程迁移的广泛使用,尤其是对透明的进程迁移实现。根据应用的级别,进程迁移可以作为OS的一部分、用户空间、系统环境的一部分或者成为应用程序的一部分。
- 用户级迁移:用户级实现较为简单,软件开发和维护也较为容易,因此,现有的很多系统都是采用用户级实现,如Condor和Utopia。但由于在用户级无法获得Kernel的所有状态,因此,对于某类进程,无法进行迁移。另外,由于Kernel空间和User空间之间存在着壁垒,打破这个边界获得Kernel提供的服务需要巨大的开销。因此,用户级实现效率远远低于内核级实现。
- 应用级迁移:应用级迁移实现较为简单,可移植性好,但是需要了解应用程序语义并可能需对应用程序进行修改或重编译,透明性较差,这方面的系统有Freedman、Skordos等。
- 内核级迁移:基于内核的实现可以充分利用OS提供的功能,全面的获取进程和OS状态,因此实现效率较高,能够为用户提供很好的透明性。但是由于需要对OS进行修改,实现较为复杂。这方面的典型系统有MOSIX和 Sprite系统。
进程状态
进程迁移的主要工作就在于提取进程状态,然后在目的节点根据进程状态再生该进程。在现实中,一个进程拥有很多状态,并且随着操作系统的演化,进程状态也越来越多样。一般来说,一个进程的状态可以分为以下几类:
- 进程执行状态(Execution State):表示当前运行进程的处理器状态,和机器高度相关。包括内核在上下文切换时保存和恢复的信息,如通用和浮点寄存器值、栈指针、条件码等。
- 进程控制(Process Control):操作系统系统用来控制进程的所有信,一般包括进程优先级、进程标识,父进程标识等。一旦系统编排了进程控制信息,进程迁移系统必须冻结该进程的运行。
- 进程Memory状态和进程地址空间:包括进程的所有虚存信息,进程数据和进程的堆栈信息等,是进程状态的最主要的一部分。
- 进程的消息(Message)状态:包括进程缓冲的消息和连接(Link)的控制信息。进程迁移中通讯连接的保持以及迁移后连接的恢复是进程迁移中一项较有挑战意义的问题。
- 文件状态:进程的文件状态包括文件描述符和文件缓冲快。保持文件的Cache一致性和进程间文件同步访问也是进程迁移机制需要着重考虑的。
由于在同构的环境下(相同或兼容的机器体系结构和指令集以及操作系统)提取和恢复进程状态相对容易,现有的工作大多是以同构环境为前提的。不过,越来越多的人开始研究异构环境下的进程迁移机制,如TUI 系统。