指定了存储设备。 这时可以由vCenter发出启动虚拟机的命令,这个命令会传递给选定的vServer(即资源占用率最低的主机),vServer会通过虚拟机启动一个具有独立CPU、内存、I/O设备和共享存储设备的虚拟机,除了存储设备,其它的设备都是在硬件物理资源的基础上虚拟出来的。
2.3.3 vServer
vServer的主要功能是划分和管理共享存储。对主机的物理资源(CPU、内 存、I/O)进行虚拟化。vServer同时给vCenter发送心跳包,通知vCenter自己的 通信状态是否正常。
(1)创建存储 存储设备被所有的vServer共享,vServer会根据需求从共享存储中划出一块设备供自己使用,如果虚拟机要在某个vServer上运行,那么虚拟机就会占用该 vServer的存储设备。创建存储是对共享存储设备的组织和划分,vServer利用工具对磁盘设备进行格式化,并在磁盘设备上创建物理卷,逻辑卷组,逻辑卷,创建逻辑卷组是为了对磁盘设备进行合并,这样可以对所有的存储设备统一规划,方便重新分配。
(2)监测资源空闲率 vServer要实时监测自身硬件资源的占用情况,主要是CPU空闲率,内存的空闲率和Swap交换空间的空闲率,这三者的加权值将表明整个主机硬件资源空闲率的高低。每台vServer上的加权值会返回给vCenter,由vCenter找出资源使用率最低的主机。这一功能模块是集群虚拟化架构中实现负载均衡性的基础。
2.4 本章小结
虚拟化技术在提高硬件利用率、安全性、可维护性等方面的帮助很大。而利用集群技术,则可以把多台服务器(物理的或者虚拟的)组成一台虚拟服务器,对提高系统性能和可靠性的作用明显。将集群技术和虚拟机技术结合起来应用在对服务器的管理中,虚拟机把一台服务器分成多台,集群又把多台合成一台。这样一分一合,表面上服务器还是那些服务器,实际上已经把各种负载重新优化组合,更合理地分布在各处。从而物理服务器数量不变的情况下,达到了类似于增加服务器的效果并可以实现计算资源利用的最大化。,而且大大提高了灾难恢复速度。
不过虚拟化技术是要在服务器上运行尽可能多的系统和应用,虚拟化 本身会带来系统开销,同时也要消耗部分资源。这个开销主要集中在CPU 资源消耗、内存资源消耗和硬盘存储资源消耗上。所以虚拟化平台不适合 在低配置的机器上运行,高配置的单台机器要比低配置的单台机器更适于 部署虚拟化系统,这算是虚拟机集群化架构的不足之处。另外,虽然虚拟 化技术已经获得了长足发展。但是面向复杂的不同时代的硬件设备,快速 高效的兼容特性仍然难以迅速满足。
第三章 分布式并行计算技术
3.1 分布式并行计算概述
云计算技术包括两个似乎对立的技术,这两个技术都是用于对资源进行分配、使用和管理。
一个技术是对资源进行分割,将资源的分配、使用的粒度变细,上一章节介绍的虚拟化集群技术就是这样的技术。 通过引入虚拟主机,将物理主机的能力进行分割。简单地说,虚拟化技术就是对资源进行拆分的技术。
另一个技术是利用多个物理主机的能力完成一个任务。分布式并行计算就是这样的技术。分布式并行计算将任务分解为多个子任务分派给主机集群中的各个主机,子任务在多个主机上协调并行运行。简单地说,分布式并行计算技术就是对资源进行聚合的技术。
事实上,分布式并行计算才更加体现出云计算的本质。云计算的名称和分布式并行计算、网格计算是一脉相承的。不过,分布式并行计算应该只是并行计算的一种, 从下文的分析可以看出,对于云计算除了分布式并行计算这个主要的并行模式外,还有其他的并行模式。
并行计算PC集群为云计算的诞生奠定了基础。云计算就是在 PC 集群的基础上发展起来的。云计算的机群由遍布全球的PC通过广域网连接而成。
并行计算的实现层次有两个:
单机(单个节点)内部的多个CPU、多个核并行计算,虽然单节点内部的并行计算不是实施云计算的主流,但由于目前多CPU、多核已经成为主机提高性能的一个非常重要的方面。
集群内部节点间的并行计算。对于云计算来说,更加强调的是集群节点间的并行。目前,集群中的节点一般是通过IP网络连接,在带宽足够的前提下,各节点不受地域、空间限制。所以,云计算中的并行计算在很多时候被称作分布式并行计算。
不过,多CPU、多核是主机的发展趋势,所以在一个集群内,一般2个级别的并行都要求存在,集群内多节点之间并行,节点内部多处理器、多核并行。节点间的并行计算,通常就等同于常说的分布式并行计算。
分布式并行计算和虚拟化成熟的产品不同,并行计算没有成熟的产品,只有相对成熟的工具。并行计算的实现,依赖于开发者和用户对业务的熟悉,对并行工具正确、熟练的使用。
并行应用软件从需求分析到设计再到部署,可以分为3个步骤。 (1)在需求分析阶段,根据业务特点,将任务尽可能地分为可以并行执行的多个任务。这是实现并行计算最基础的、往往也是最有效的阶段。
(2)在设计、编码阶段,采用并行工具进行程序设计。 这个
阶段所应用的并行技术是最核心的并行技术,难度最大,技术也不成熟,而且目前大部分技术人员对这个阶段 所应用的技术还没有足够程度的掌握
(3)在应用部署阶段,采用并行部署架构和工具部署应用。这个阶段就是通过部署,使应用所占用的设备能够实现负载均衡。负载均衡本质上也属于并行计算。 常用的方法为采用负载均衡设备,如F5交换机、ESB等。 这个阶段所涉及的技术比较成熟,已为业界广泛采用。
并行计算编程模型一直是并行计算研究领域中的重点内容,它和并行计算机体系结构紧密相关。共享存储体系结构下的并行编程模型主要是共享变量编程模型,它具有单地址空间、编程容易、可移植性差等特点。分布式存储体系结构下的并行编程模型主要有消息传递编程模型和分布式共享编程模型两种。消息传递编程模型的特点是多地址空间、编程困难、可移植性好;分布式共享编程模型 是指有硬件或软件的支持,在分布式体系结构下实现的具有共享变量编程模型特点的编程模型。并行计算编程模型一般包括两类:一类是在原有串行 编程语言基础上,引入并行控制机制,提供并行 API、运行库或者并行编译指令,这类模型包括 OpenMP、MPI 以及 MapReduce; 另一类则是并行编程语言,其语言本身就是基于并行算法的,相对影响比较大的主要有Erlang。前面说过,并行计算的实现有两个层次,一个是集群节点间的并行,另一个节点内的并行。 OpenMP 一般用于实现节点内并行,MPI 一般用于实现节点间的并行;而 Erlang 既可以实现节点间的并行,也可以实现节点内的并行。。本章重点分析OpenMP、MPI 和 Erlang 这 3 个并行计算编程技术。
3.2 OpenMP
目前从x86到小型机,多核是CPU的主流,对于单线程的程序,多核的处理器并没有办法提升它的处理效能;对于多线程(multi thread)的程序,就可以通过不同的核同时计算来达到提高性能的目的。当然,多线程程序的执行性能依赖于对任务的分解。多线程程序的编写、维护,比单线程的程序要复杂不少。一般而言,采用了多线程编程技术,只要主机是多处理器、多核或者拥有同时执行多个线程的能力,那么多线程程序的执行性能还是远远高于单线程的。传统的多线程程序编写一般有两种方法:
(1)通过调用操作系统功能、开发工具自己的多线程控制语句或控制函数来实现;
(2)采用 POSIX 标准和方法, 利用 POSIX 的线程控制库函数来实现。
这些方法都是通过主线程去产生多个子线程, 由主线程把工作拆开,分给各个子线程去运算,最后再由主线程回收、整合结果。使用这两种方法存在以下问题:
(1)程序的开发复杂性较单线程程序增加很多。 (2)第一种方法的移植性还存在问题。
(3)若要具有好的扩展性,则更加复杂。多线程应该不只是创建固定数量的线程,而应该随着CPU核数的增加而增加线程。 如果用上述方法,虽然可以实现良好的扩展性,但控制十分复杂。
(4)多线程对多核处理器的负载均衡调度需要开发者自己实现,十分复杂。
使用OpenMP则解决了上述问题。OpenMP是多线程的一种编程方法,它的并行粒度是线程级别的。它的适用范围是单机内的并行计算,可以很好地利用单机内多CPU 或者多核。OpenMP 就是一套API和运行库,可以简化单机内的多线程开发,让设计人员和开发人员的主要精力集中到对任务的理解和拆分上,而具体的细节交给OpenMP去完成,用OpenMP的编程效率要远远高于使用一般函数库或者操作系统自带函数库的多线程编程,也大大优于POSIX标准和方法。OpenMP是作为共享存储标准而问世的。它是为在多处理机上编写并行程序而设计的一个应用编程接口,包括一套编译指导语句和一个用来支持它的函数库。OpenMP能通过伪指令,很简单地将程序多线程化。最简单的情形,甚至可以只加一行指导编译程序的编译伪指令就可以将循环内的语句并行处理了。OpenMP起源于C/C++,但目前已经有OpenMP的Java开发包,使其可以用于Java编程。
3.3 MPI
OpenMP虽然很优秀,但只是单机内的并行计算技术。无论是并行计算还是云计算,其并行计算的主流是主机之间的并行而并非单机内的并行。因此MPI (message passing interface)才是并行计算的代表性技术。1994年5月MPI标准诞生,该标准提出了一种基于消息传递的函数接口描述。 目前,MPI 已发展到 2.0 版,成为高性能计算的一种公认标准。 MPI 本身并不是一个具体的实现,而只是一种标准描述。MPI最为著名且被广泛使用的一个具体实现是由美国Argoone 国家实验室开发小组完成 的MPICH,MPICH是一个免费软件,它提供对Fortran和C语言等的绑定支持,以函数库的形式提供给开发者使用。采用MPI在程序设计上有较大的自由度,甚至可以用它实现Hadoop中的MapReduce功能。消息传递方式是广泛应用于并行机的一种模式。特别是分布存储并行机。10 多年来,这种模式在重要的计算应用中已取得了实质进步。在设计MPI时,目标不是选择采用现存消息传递系统中的某一个,而是充分利用这些系统的最抽象特点。 建立消息传递标准的主要优点是可移植性和易于使用。以低级消息传递程序为基础的较高级和(或)抽象程序所构成的分布存储通信环境中,标准化的效益特别明显。消息传递标准的定义能提供给生产商清晰定义的程序库,以便他们能有效地实现这些库或在某些情况下为库程序提供硬件支持,因此加强了可扩展性。 简单地说,MPI是为编写消息传递程序而开发的广泛使用的标准。像这个接口一样,应为消息传递建立一个实际
的、可移植的、有效的和灵活的标准。 全部目标如下:
(1)设计一个应用编程接口 (不必为编译器或系统实 现库); · 允许有效的通信, 避免存储器到存储器的拷贝,而 允许计算和通信的重叠,尽可能给通信协同处理器 卸载;
(2)对于接口,允许方便的 C 语言和 Fortran 77 联接; (3)设定一个可靠的通信接口, 用户不必处理通信失 败,这些失败由基本的通信子系统处理;
(4)定义一个接口,提供更大灵活性的扩展; (5)定义一个接口,它能在基本的通信和系统软件无重 大改变时,在许多生产商的平台上实现,接口的语 义是独立于语言的; (6)接口应设计成允许线索-安全(thread-safety)。 MPI 的一个非常大的优势是大范围的可移植性,在标 准 Unix 处理器间通信协议的上层实现的 MPI 将给工作 站群机系统和不同种类的工作站网络提供可移植性。 这个标准包括点对点通信、集合操作、进程组、通信上 下文、进程拓扑结构、与 Fortran 77 和 C 语言绑定、环境管 理和查询、描述接口。
3.4 Erlang
Erlang首先是一种类似于函数的编程语言,这种语言天生就是为并行计算而设计的。本来这种比Java还古老的语言,一直无人问津,但是主机的多处理器、多核的发展趋势,特别是云计算的兴起,给Erlang又带来了生机。业界对于并行计算的探索一直没有停止,尤其是云计算的发展促进了并行计算各种方法、模式的发展,如Java Concurrency库、Intel 推出的 Threading Building Blocks库、微软为Robotics Studio提供的CCR库等。 但这些措施只是为先天串行的程序设计语言提供了后天的并行能力,属于亡羊补牢。而Erlang 则是先天并行的,在单台主机上利用多处理器和多核的优势,Erlang将传统编程方法远远甩在后面。据说使用 Erlang 编写的Yaws Web服务器,其并发性能是使用C编程的apache 的15倍!apache在并发4 000连接时就已经崩溃,而Yaws Web服务器可实现并发8 万连接。Erlang 不仅是程序设计语言,还是包括一个类似于Java的虚拟机在内的一个完整的平台。通过虚拟机,Erlang 独立于硬件平台和操作系统,在这个平台上实现了网络通信、内存管理、进程调度、并发机制和分布式计算等功能。 Erlang 最初是为通信应用设计的,因此非常适合于构建分布式、实时软并行计算系统。 Erlang 具有以下特点:
(1)并发性 Erlang 的轻量级进程可以支持极高的并发性,而且在高并发的情况下内存使用相当少。 Erlang 的并发性并不会受到宿主操作系统并发性的限制。
(2)分布式 最开始 Erlang 的设计目标就是实现分布式环境,Erlang的一个虚拟机就是Erlang 网络上的一个节点。一个Erlang 节点可以在另一个Erlang节点上创建自己的并发进程,而子进程所在的节点可能是运行其他操作系统的服务器。 不同节点之间可以进行极为高效而又精确的通信, 就像这些通信运行在同一个节