精华内容
下载资源
问答
  • 云计算中的并行计算技术分析

    千次阅读 2015-06-19 09:31:09
    摘要 本文阐述了并行计算和云计算的关系,简要回顾并行计算的历史,分析了并行计算的重要技术OpenMP、MPI和Erlang,...通常提到的IaaS、PaaS和SaaS,严格地说是基于服务的术语,并不是对技术的描述。从技术上看,云计

    摘要

    本文阐述了并行计算和云计算的关系,简要回顾并行计算的历史,分析了并行计算的重要技术OpenMP、MPI和Erlang,研究了这些技术在中国电信的应用方法,并介绍了中国电信实施云计算、并行计算的指导思想、原则和策略。

    一、引言

    计算是一个含义丰富的概念,包括了服务、市场、技术等诸多方面。通常提到的IaaS、PaaS和SaaS,严格地说是基于服务的术语,并不是对技术的描述。从技术上看,云计算是对主机、存储、网络资源分配、使用、管理的技术。其核心是对主机资源分配、使用、管理的技术,主机资源也可称为计算资源。云计算技术包括两个似乎对立的技术,这两个技术都是用于对资源进行分配、使用和管理。


    一个技术是对资源进行分割,将资源的分配、使用的粒度变细,主机的虚拟化就是这样的技术。通过引入虚拟主机,将物理主机的能力进行分割,使主机计算能力的分配、使用不是基于单台物理主机,而是基于细分的虚拟主机。简单地说,虚拟化技术就是对资源进行拆分的技术。


    另一个技术是利用多个物理主机的能力完成一个任务。分布式并行计算就是这样的技术。分布式并行计算将任务分解为多个子任务分派给主机集群中的各个主机,子任务在多个主机上协调并行运行。简单地说,分布式并行计算技术就是对资源进行聚合的技术。事实上,分布式并行计算才更加体现出云计算的本质。云计算的名称和分布式并行计算、网格计算是一脉相承的。不过,分布式并行计算应该只是并行计算的一种,从下文的分析可以看出,对于云计算除了分布式并行计算这个主要的并行模式外,还有其他的并行模式。本文不仅分析分布式并行计算,还分析了非分布式的并行计算。


    二、并行计算的历史

    并行计算出现在20世纪60年代初期,这个时期晶体以及磁芯存储器开始出现,处理单元变得越来越小,存储器也更加小巧和廉价。这些技术的发展结果导致并行计算机的出现,这一时期的并行计算机大多是规模不大的共享存储多处理器系统,即所谓大型主机。IBM360是这一时期的典型代表。


    长久以来,并行计算在高性能计算领域发展得如火如荼,并行计算的体系结构也在不断地变化。并行计算所依赖的平台称为并行机,并行机由多个节点组成,任务被分解到各个节点,在各个节点并行运行。早期的并行节点,并不是互相完全独立的主机,更像1台主机的各个模块。到了20世纪90年代,随着网络设备的发展以及MPI/PVM等并行编程标准的发布,集群架构的并行计算机开始出现。此时的并行计算硬件平台的节点就是彼此独立的主机了。


    现代的并行机体系结构有对称多处理共享存储并行机(symmetricmultiprocesser,SMP)、分布共享存储(distributedsharedmemory,DSM)并行机、大规模并行机(massivelyparallelprocessor,MPP)、并行向量多处理机(parallelvectorprocessor,PVP)。所有这些体系结构的并行机都是高高在上位于“云”端的,但和云计算没有直接的关系。所幸的是,另外一种体系结构的并行机出现了,这就是工作站(PC)机群(clusterofworkstation(beowulfPC-cluster),COW)。PC机群的诞生背景是微处理器性能和网络带宽的飞速发展。PC机群的诞生中止了并行计算和并行机的贵族身份,让并行飞入到“寻常百姓家”。PC机群的性能绝不容轻视,如早期128台Pentium3800MHz处理器的PC通过个24端口100Mbit/s的交换机互联,其浮点峰值性能达1000亿,当时的成本不过200万亿元人民币,性价比比当时最好的大型主机并行机还要高30倍。


    PC机群为云计算的诞生奠定了基础。Google的云计算就是在PC机群的基础上发展起来的。Google的机群由遍布全球的PC通过广域网连接而成。


    三、并行计算概述

    行计算的实现层次有两个。


    单机(单个节点)内部的多个CPU、多个核并行计算,虽然单节点内部的并行计算不是实施云计算的主流,但由于目前多CPU、多核已经成为主机提高性能的一个非常重要的方面。


    集群内部节点间的并行计算。对于云计算来说,更加强调的是集群节点间的并行。目前,集群中的节点一般是通过IP网络连接,在带宽足够的前提下,各节点不受地域、空间限制。所以,云计算中的并行计算在很多时候被称作分布式并行计算。不过,多CPU、多核是主机的发展趋势,所以在一个集群内,一般2个级别的并行都要求存在,集群内多节点之间并行,节点内部多处理器、多核并行。节点间的并行计算,和虚拟化成熟的产品不同,并行计算没有成熟的产品,只有相对成熟的工具。并行计算的实现,依赖于开发者和用户对业务的熟悉,对并行工具正确、熟练的使用。


    并行应用软件从需求分析到设计再到部署,可以分为3个步骤。


    (1)在需求分析阶段,根据业务特点,将任务尽可能地分为可以并行执行的多个任务。这是实现并行计算最基础的、往往也是最有效的阶段。
    (2)在设计、编码阶段,采用并行工具进行程序设计。这个阶段所应用的并行技术是最核心的并行技术,难度最大,技术也不成熟,而且目前大部分技术人员对这个阶段所应用的技术还没有足够程度的掌握。
    (3)在应用部署阶段,采用并行部署架构和工具部署应用。这个阶段就是通过部署,使应用所占用的设备能够实现负载均衡。负载均衡本质上也属于并行计算。常用的方法为采用负载均衡设备,如F5交换机、ESB等。这个阶段所涉及的技术比较成熟,已为业界广泛采用。第二阶段的并行计算就是狭义的并行计算,本文主要分析这个阶段的并行计算技术。

    四、并行计算编程模型分析

    并行计算编程模型一直是并行计算研究领域中的重点内容,它和并行计算机体系结构紧密相关。共享存储体系结构下的并行编程模型主要是共享变量编程模型,它具有单地址空间、编程容易、可移植性差等特点,其实现有OpenMP和POSIX等。分布式存储体系结构下的并行编程模型主要有消息传递编程模型和分布式共享编程模型两种。消息传递编程模型的特点是多地址空间、编程困难、可移植性好,其实现有MPI、PVM等;分布式共享编程模型是指有硬件或软件的支持,在分布式体系结构下实现的具有共享变量编程模型特点的编程模型。后者可以按照硬件或软件的实现分为DSM和SVM,其实现有TreadMark和JiaJia等,目前研究热点的分割全局地址空间(PGAS)模型的研究有UPC等代表,具有很强的发展潜力。


    并行计算编程模型一般包括两类:一类是在原有串行编程语言基础上,引入并行控制机制,提供并行API、运行库或者并行编译指令,这类模型包括OpenMP、MPI以及大家广为熟悉的MapReduce;另一类则是并行编程语言,其语言本身就是基于并行算法的,相对影响比较大的主要有Erlang。前面说过,并行计算的实现有两个层次,一个是集群节点间的并行,另一个节点内的并行。OpenMP一般用于实现节点内并行,MPI一般用于实现节点间的并行;而Erlang既可以实现节点间的并行,也可以实现节点内的并行。对于大家已经比较熟悉MapReduce,本文就不再做分析。本文重点分析OpenMP、MPI和Erlang这3个并行计算编程技术。


    五、OpenMP

    目前从x86到小型机,多核是CPU的主流,对于单线程(singlethread)的程序,多核的处理器并没有办法提升它的处理效能;对于多线程(multithread)的程序,就可以通过不同的核同时计算来达到提高性能的目的。当然,多线程程序的执行性能依赖于对任务的分解。多线程程序的编写、维护,比单线程的程序要复杂不少。一般而言,采用了多线程编程技术,只要主机是多处理器、多核或者拥有同时执行多个线程的能力,那么多线程程序的执行性能还是远远高于单线程的。


    传统的多线程程序编写一般有两种方法:

    1、通过调用操作系统功能、开发工具自己的多线程控制语句或控制函数来实现;
    2、采用POSIX标准和方法,利用POSIX的线程控制库函数来实现。


    这些方法都是通过主thread去产生多个thread,由主要的thread把工作拆开,分给各thread去运算,最后再由主thread回收、整合结果。使用这两种方法存在以下问题。


    1、程序的开发复杂性较单线程程序增加很多。
    2、第一种方法的移植性还存在问题。
    3、若要具有好的扩展性,则更加复杂。多线程应该不只是创建固定数量的线程,而应该随着CPU核数的增加而增加线程。如果用上述方法,虽然可以实现良好的扩展性,但控制十分复杂。
    4、多线程对多核处理器的负载均衡调度需要开发者自己实现,十分复杂。

    使用OpenMP则解决了上述问题。


    OpenMP是多线程的一种编程方法,它的并行粒度是线程级别的。它的适用范围是单机内的并行计算,可以很好地利用单机内多CPU或者多核。OpenMP就是一套API和运行库,可以简化单机内的多线程开发,让设计人员和开发人员的主要精力集中到对任务的理解和拆分上,而具体的细节交给OpenMP去完成,用OpenMP的编程效率要远远高于使用一般函数库或者操作系统自带函数库的多线程编程,也大大优于POSIX标准和方法。OpenMP是作为共享存储标准而问世的。它是为在多处理机上编写并行程序而设计的一个应用编程接口,包括一套编译指导语句和一个用来支持它的函数库。


    OpenMP能通过伪指令,很简单地将程序多线程化。最简单的情形,甚至可以只加一行指导编译程序的编译伪指令,就可以将循环内的语句并行处理了。


    OpenMP起源于C/C++,但目前已经有OpenMP的Java开发包,使其可以用于Java编程。


    六、MPI

    OpenMP虽然很优秀,但只是单机内的并行计算技术。无论是并行计算还是云计算,其并行计算的主流是主机之间的并行而并非单机内的并行。因此,MPI(messagepassinginterface)才是并行计算的代表性技术。
    1994年5月1.0版的MPI标准诞生,该标准提出了一种基于消息传递的函数接口描述。目前,MPI已发展到2.0版,成为高性能计算的一种公认标准。MPI本身并不是一个具体的实现,而只是一种标准描述。MPI最为著名且被广泛使用的一个具体实现是由美国Argoone国家实验室
    (argonnenationallaboratory)开发小组完成的MPICH,MPICH是一个免费软件,它提供对Fortran和C语言等的绑定支持,以函数库的形式提供给开发者使用。


    采用MPI在程序设计上有较大的自由度,甚至可以用它实现Hadoop中的MapReduce功能。


    消息传递方式是广泛应用于并行机的一种模式,特别是分布存储并行机。10多年来,这种模式在重要的计算应用中已取得了实质进步。


    在设计MPI时,目标不是选择采用现存消息传递系统中的某一个,而是充分利用这些系统的最抽象特点。


    建立消息传递标准的主要优点是可移植性和易于使用。以低级消息传递程序为基础的较高级和(或)抽象程序所构成的分布存储通信环境中,标准化的效益特别明显。消息传递标准的定义能提供给生产商清晰定义的程序库,以便他们能有效地实现这些库或在某些情况下为库程序
    提供硬件支持,因此加强了可扩展性。


    简单地说,MPI是为编写消息传递程序而开发的广泛使用的标准。像这个接口一样,应为消息传递建立一个实际的、可移植的、有效的和灵活的标准。全部目标如下:


    设计一个应用编程接口(不必为编译器或系统实现库);

    1、允许有效的通信,避免存储器到存储器的拷贝,而允许计算和通信的重叠,尽可能给通信协同处理器卸载;
    2、对于接口,允许方便的C语言和Fortran77联接;
    3、设定一个可靠的通信接口,用户不必处理通信失败,这些失败由基本的通信子系统处理;
    4、定义一个接口,提供更大灵活性的扩展;
    5、定义一个接口,它能在基本的通信和系统软件无重大改变时,在许多生产商的平台上实现,接口的语义是独立于语言的;
    6、接口应设计成允许线索-安全(thread-safety)。

    MPI的一个非常大的优势是大范围的可移植性,在标准Unix处理器间通信协议的上层实现的MPI将给工作站群机系统和不同种类的工作站网络提供可移植性。


    这个标准包括点对点通信、集合操作、进程组、通信上下文、进程拓扑结构、与Fortran77和C语言绑定、环境管理和查询、描述接口。


    七、Erlang

    Erlang首先是一种类似于函数的编程语言,这种语言天生就是为并行计算而设计的。本来这种比Java还古老的语言,一直无人问津,但是主机的多处理器、多核的发展趋势,特别是云计算的兴起,给Erlang又带来了生机。


    业界对于并行计算的探索一直没有停止,尤其是云计算的发展促进了并行计算各种方法、模式的发展,如Java的Concurrency库、Intel推出的ThreadingBuildingBlocks库、微软为RoboticsStudio提供的CCR库等。但这些措施只是为先天串行的程序设计语言提供了后天的并行能力,属于亡羊补牢。而Erlang则是先天并行的,在单台主机上,利用多处理器和多核的优势,Erlang将传统编程方法远远甩在后面。据说使用Erlang编写的YawsWeb服务器,其并发性能是使用C编程的apache的15倍!根据实测,apache在并发4000连接时就已经崩溃,而YawsWeb服务器可实现并发8万连接。


    Erlang不仅是程序设计语言,还是包括一个类似于Java的虚拟机在内的一个完整的平台。通过虚拟机,Erlang独立于硬件平台和操作系统,在这个平台上实现了网络通信、内存管理、进程调度、并发机制和分布式计算等功能。


    Erlang最初是由爱立信专门为通信应用设计的,因此非常适合于构建分布式、实时软并行计算系统。


    Erlang具有以下特点。

    (1)并发性
    Erlang的轻量级进程可以支持极高的并发性,而且在高并发的情况下内存使用相当少。Erlang的并发性并不会受到宿主操作系统并发性的限制。

    (2)分布式
    最开始Erlang的设计目标就是实现分布式环境,Erlang的一个虚拟机就是Erlang网络上的一个节点。一个Erlang节点可以在另一个Erlang节点上创建自己的并发进程,而子进程所在的节点可能是运行其他操作系统的服务器。不同节点之间可以进行极为高效而又精确的通信,就像这些通信运行在同一个节点一样。

    (3)健壮性
    Erlang内部建设有多种错误检测原语,可以通过这些原语来架设高容错性的系统。在分布式状态下,可以把系统配置成具有Fail-over功能的分布式系统。当有其他节点出错的时候,系统会把它的运行场景自动快速地切换到备份节点上。Erlang支持9个9级别的故障率,一年只有几分钟的故障时间。

    (4)软实时
    它可以提供毫秒级别的响应。

    (5)热代码升级
    对于不能中断运行的系统,Erlang允许程序代码在运行系统中被修改。旧代码被逐步淘汰后能被新代码替换。在此过渡期间,新旧代码是共存的。这也使得安装bug补丁在运行系统上升级而不干扰系统操作成为了可能。

    (6)递增式代码装载
    用户能够控制代码被装载的细节。在嵌入式系统中,所有代码通常是在启动时就被完全装载。在开发系统中,代码是按需装载的,甚至在系统运行时被装载的。如果测试到了未覆盖的bug,那么需替换有bug的代码。

    (7)外部接口
    Erlang进程与外部世界之间的通信使用和在Erlang进程之间通信相同的消息传送机制。这种机制被用于和操作系统通信、与其他语言编写的程序交互。


    使用Erlang编写出的应用程序运行时通常由成千上万个轻量级进程组成,并通过消息传递相互通信。进程间上下文切换对于Erlang来说仅仅只是一两个环节,比起C程序的线程切换要高效得多了。


    使用Erlang来编写分布式应用要简单得多,因为它的分布式机制是透明的,对于程序来说并不知道自己是在分布式运行。


    Erlang运行时的环境是一个虚拟机,有点像Java虚拟机,这样代码一经编译,同样可以随处运行。它运行时的系统甚至允许代码在不被中断的情况下更新。另外,如果需要更高效的话,字节代码也可以编译成本地代码运行。


    Erlang能够创建和管理大量的进程(不是操作系统级别的)。那些进程在不同的操作系统上有同样的行为,可以被垃圾回收,对运行地点透明(locationtransparent),不会破坏其他进程的运行。任意两个进程间完全独立,不共享任何状态,一切交流通过消息来传递,当然也就无需上锁。这样的设计思想造就了适合解决如下问题的Erlang。


    (1)系统高度并发
    Erlang具有优秀的并行性能,特别适合高度并发操作。
    (2)实时处理
    在并行情况下,Erlang响应迅速,性能优良。
    (3)计算高度分布
    Erlang适合集群节点间的并行,也就是基于网络的分
    布式并行。
    (4)系统要求高度可靠
    每年的脱机时间以分钟算,甚至永不宕机。
    (5)可靠性高
    Erlang内容的检测原语,极大地提高了系统的容错
    性,进而提高了系统的可靠性。


    对于经常需要更新、升级的系统,Erlang能够在线更新,无需中断系统运行,新旧代码可以同时运行。可以看出,Erlang非常适合于电信领域的应用,只是它是个小众产品和方案,熟悉它的人太少。其实,应该高度重视Erlang,并进行深入研究,根据研究结果引入到支撑系统的开发当中。


    八、云计算及并行计算在中国电信的应用和研究

    1、中国电信IT支撑系统实施云计算的指导思想、目标和策略

    随着云计算不断向广度和深度发展,中国电信对于云计算的探索和研究投入很大,但在应用上比较谨慎。

    1.1云计算实施指导思想

    按照中国电信企业信息化战略规划的要求,根据其内部IT支撑系统的特点,密切跟踪云计算技术的演进趋势,充分利用云计算技术带来的优势,积极、务实、稳妥地探索企业内部MBOSS云计算技术的应用;有效降低IT系统总体拥有成本,同时规避云计算应用过程中存在的各种风险,保证MBOSS稳定、可靠、安全运营,确保有效支撑企业业务经营、网络运营和内部管理的各项需求。

    1.2计算实施目标

    (1)降低IT系统总体拥有成本(TCO)
    重点基于PC服务器构建IaaS云计算平台,实现多应用基于IaaS平台的共享部署,提高基础设施资源利用率,降低硬件成本占比,实现IT投资结构的优化及IT总体拥有成本的降低,并做到系统的稳定、可靠运行。

    (2)更快、更好地满足业务需要
    在云计算适用的应用范围内,积极推进云计算的实施,利用IaaS云计算平台能根据业务需要快速分配资源并能够弹性扩展的特点,实现应用快速部署及处理资源动态伸缩,更好地满足业务需要。

    (3)提升云计算平台的管理和运营能力
    积极推进云计算应用的同时,加强云计算平台管理系统建设,提高平台的自动化配置及管理能力,加强IT人员云计算技术培训,提高云计算平台管理及运营能力。


    目前的指导思想是云计算在技术上分为两类:一类为以虚拟化为代表的资源分割技术,另一类则为以并行计算为代表的资源聚合技术。

    1.3 IT支撑云实施策略

    IT支撑系统的云计算实施是中国电信整个云计算实施的一个非常重要的组成部分。中国电信IT支撑云的实施核心在于提高支撑系统的运行效率,提高运行的可靠性,降低系统的运行成本。随着电信用户数量的不断攀升、业务种类迅速增加、业务规模不断扩大,支撑系统软件的规模和复杂性也在快速增加,超过了硬件性能的提升速度,用于购置、维护硬件的费用也在不断增加。实施基于集群架构的并行计算,则是满足IT支撑云核心需求的基本策略。原因如下:


    1、实施并行计算的集群总体性能,其性能提升可以随集群节点的增加而近似线性提升,目前业界的集群节点已经达到数千个,集群的总体性能远远超过单台高性能主机;

    2、集群内节点互相冗余,整个集群的可靠性远远超过单台主机;

    3、集群的节点可以采用廉价主机,未来的方向是使用x86主机集群代替高性能Unix主机。

    2、并行计算应用现状

    电信支撑系统大多属于高负载应用,这些长期以来需要运行在高性能的小型机上。近年来,逐渐引入并行计算已摆脱对高性能小型机的依赖,解决了硬件成本过高、性能提升有限的问题,主要包括以下两类。


    (1)对数据库进行分库是实现数据的分布存储和并行操作对于计费、账务这类海量数据的存储和操作规模比较大的省公司,一般是根据地域对数据进行分割,不同地域的数据存放到不同的位置,由不同的节点处理。这种并行比较原始,各节点之间耦合度很小,不需要复杂的协同。其优点是对应用无需进行改变即可利用多节点的优势。但并行度较低,资源利用率不高。

    (2)利用负载均衡工具实现并行计算
    对于应用层面,目前已经较普遍地利用负载均衡工具实现一定程度的并行计算。4层交换机是较为常见的工具,此外还有中间件服务器的负载均衡功能也得到较为普遍的应用。近几年,企业服务总线(ESB)也逐步被引入。


    除此以外,近年也在开发阶段引入并行计算。在CRM中部分采用SOA架构,模块可以由ESB等工具进行调度,实现一定程度的并行。

    3、并行计算研究

    中国电信MBOSS系统的支撑云建设重点在于并行计算。支撑系统云计算的实施主要不是对资源进行分割,而是对资源进行聚合。因为支撑系统大都属于“重型”应用,占用计算和存储资源较多,一般单节点资源已经难以满足需求,再对单节点实施分割意义不大。


    对于电信应用的并行化,首先需要对应用特点进行分类,根据不同的特点采用不同的并行策略。并行策略,也要充分考虑到当前的运行状况,在可靠性、成本等限制条件下,逐步实施。其中,可靠性是需要特别注意的。


    对电信应用的划分,可以有多个维度。这里根据计算量、并发性和数据量的大小属性进行分类。具体说,这3个属性为任务执行时间、任务的并发量、单个任务输入(即处理)的数据量。可以只对每个特点分为2个等级:大和小,至于介于大和小之间的,则呈不典型特征,可以根据偏大还是偏小而决定,具体有待进一步研究。目前,对属性值大小的判断,主要还是定性的判断,定量的判断有待进一步深入研究。下面对属性值的分类进行示例,仅供参考。


    应用3个特点的2个等级,可以有8个组合,但有些组合在实际中不可能存在,或者在电信行业不存在。具体见表1。

    这里写图片描述

    根据上面的分析,在电信的实际应用场景中,需要实施并行计算的有以下2类应用:
    1、大任务小并发大数据;
    2、小任务大并发小数据。
    下面针对具备这两个典型特点的应用,探讨并行化策略。

    3.1大任务小并发大数据

    这类应用一般为批处理应用。这类应用可以按功能耦合度和数据耦合度划分。功能耦合度指的是模块之间的功能耦合度,数据耦合度指的是各部分数据之间的耦合度。每个维度取“强”和“弱”2个值,则有表2所列4个组合。

    这里写图片描述

    需要指出的是,就总体而言,电信应用属于数据密集型应用,在应用逻辑上并不十分复杂。


    (1)现状
    目前,这类应用也做了不少集群部署,能够进行一定程度的负载均衡。其方法如下:是多实力部署,每台服务器上部署相同的应用,服务器环境配置也大致相同,实现方法不对应用逻辑进行分割,只是做多实例部署,对数据进行静态分割,具体如以下2个分布式实现方法。

    1、服务器在负载均衡器调度下形成集群,达到负载均衡。
    2、对数据进行分片,片与片之间数据基本没有关联,不同的实例处理不同片的数据。这种情况下,只是实施了负载分担,没有形成一个统一的集群,因为实例之间没有任何关系,也没有统一的管理平台进行管理,不能达到真正的负载均衡。


    (2)并行化策略
    应用并行化的策略,首先是总体架构实施SOA,对于大任务的应用更是如此。在功能上拆分的方法常常是根据任务处理的流程,将相对独立的流程处理模块独立出来,进行解耦、封装。

    不过,电信处理逻辑属于商业处理逻辑,总体来说并不复杂,从逻辑功能上对应用进行拆分,由于这些逻辑大多是流程性的,即使经过解耦,在技术上可以实施并行,但由于其对应的实际业务是流程性的,执行必须有先后顺序,所以事实上这些服务只能是分布式部署,并不一定能并行执行。

    但是,这类应用数据量的特点提供了根据数据对应用进行拆分的可能性。从前面的现状分析可以看出,目前事实上的分布式多实例部署,很多就是根据数据进行的。电信数据有一个很重要的特点,就是数据的地域独立性,同一个业务,不同地区的数据是彼此独立的。如计费数据,广州的数据和珠海的数据是彼此独立的,虽然广州的计费应用和珠海的计费应用是相同的。对同一个本地网来说,不同区的数据也是彼此独立的,如广州花都区的计费数据和广州番禺区的计费数据是彼此独立的。根据这个特点,就可以进行任务拆分,实施集群并行计算。可以选择的方法有MPI和MapReduce,但是MapReduce方法目前的实现是基于Hadoop的开源,并非是Google公开的其本身所采用的,所以其具体效果有待验证,目前中国移动已经使用MapReduce进行了较大规模的试验,中国电信股份有限公司广东研究院(简称广东电信研究院)也进行了这方面的大量研究和测试,就广东电信研究院的测试情况来看,基于Hadoop的>MapReduce实现,在处理大任务大数据方面效果明显。MPI的方法经过多年充分的实践,应该可以认为非常可靠,但是MPI模式处理失效节点方面需要设计人员予以更多的关注,因为它本身不能直接处理节点失效的情况,但由于电信应用逻辑的并发特别复杂,并发属于计算密集型,所以由应用逻辑实现节点的管理也是可以接受的。

    3.2小任务大并发小数据

    这类应用一般都是实时在线处理,对相应速度要求很高。一般应用中的Web层以及OCS、ABM都属于这类。这类应用有以下特点:

    1、实时性强,用户在线等待任务处理结果,任务处理时间短暂,响应速度必须快速;
    2、并发性高,短时间内,一般会有大量请求发生;
    3、稳定性高,这也是实时性的要求,如果服务出现不稳定(指软件故障而不是硬件故障,硬件故障有集群保证其可用性),将严重影响应用的响应速度。


    (1)现状
    目前的解决方案也是借助负载均衡器实施集群部署,按照一定的策略,根据请求的特点,将请求发送到集群中不同的节点进行处理。

    (2)并行化策略
    虽然这类任务往往是Web服务,已经表现为SOA架构,但并行化还是首先按照统一标准化的SOA架构对其进行封装。一般而言,这类应用无需再进行拆分,可以将整个应用封装为统一的、标准的SOA服务。

    在算法上有2种实现方法:一种为依然借助负载均衡设备实现集群节点间的负载均衡,在节点内部采用OpenMP实现节点内部的并行运行;另一种为采用Erlang实现全面、高效率的并行,集群节点间和节点内部的并行计算都由Erlang及其运行环境实现。

    (3)并行化策略总结
    根据上面的分析,应用的并行化按照以下两个步骤实施:对应用实施SOA服务化封装;根据特点,在算法模式
    上按照表3所列实施。
    这里写图片描述

    九、结束语

    并行计算和虚拟化一起构成了云计算技术的骨干。对于大型应用系统实施云计算的主要内容就是实施并行计算。并行计算技术除了目前炙手可热的MapReduce以外,值得推荐的还有OpenMP、MPI和Erlang。这3个技术主要应用于并行程序的开发,和其他并行策略(如SOA)一起,用于从根本上实现应用的并行化。中国电信在支撑云的研究、建设中,计划在多个层面实施并行计算,以提高应用运行效率和可靠性,降低采购和运营成本。对于条件成熟的应用,拟从业务并行开始,在开发层面即实现并行计算。目前,经过研究分析和测试,针对不同的应用,初步制定出不同的并行化解决方案,采用合适的并行计算技术实现不同层次的并行计算。

    展开全文
  • 《Oracle 高性能SQL引擎剖析:Oracle SQL 优化与调优技术详解》一书附录部分。作为对该书补充,帮助读者理解和掌握“提示”这一项在SQL优化中使用这一重要辅助手段。语法:DRIVING_SITE([])描述:指示优化器...

    《Oracle 高性能SQL引擎剖析:Oracle SQL 优化与调优技术详解》一书的附录部分。作为对该书的补充,帮助读者理解和掌握“提示”这一项在SQL优化中使用的这一重要辅助手段。

    50160bda853303d5c5f07dc242c17830.png

    语法:DRIVING_SITE([])

    描述:指示优化器选择那个数据库作为分布式查询中的驱动站点,即将语句放在该站点上执行。未指定参数时,采用本地数据库。

    HELLODBA.COM>exec sql_explain('select /*+ driving_site(rt) */count(*) from t_tables lt, t_tables@ora11r2 rt where lt.owner = rt.owner and lt.table_name = rt.table_name', 'TYPICAL NOTE');

    ... ...

    Remote SQL Information (identified by operation id):

    ----------------------------------------------------

    3 - SELECT "OWNER","TABLE_NAME" FROM "T_TABLES" "A2" (accessing '!' )

    Note

    -----

    - fully remote statement

    语法:REMOTE_MAPPED([])

    描述:在分布式查询中,指示优化器选择那个数据库的进行远程映射。作用和DRIVING_SITE类似。未指定参数时,采用本地数据库。

    HELLODBA.COM>exec sql_explain('select /*+ remote_mapped(ORA11R2) */count(*) from T_USERS@ORA11R2 u, t_tables t where t.owner=u.username', 'TYPICAL');

    Remote SQL Information (identified by operation id):

    ----------------------------------------------------

    3 - SELECT "OWNER" FROM "T_TABLES" "A1" (accessing '!' )

    Note

    -----

    - fully remote statement

    语法:OPAQUE_TRANSFORM

    描述:在分布式查询中,使用INSERT ... SELECT ... FROM语句从远程数据库查询数据插入本地数据库时,在远程数据库上执行的递归查询语句上会加上该提示,使得分布式数据库之间的兼容类型数据被透明传输。

    (本地数据库,10.2.0.4)

    HELLODBA.COM>create table t_objects_dummy2 as select * from t_objects@ora11r2 where 1=2;

    Table created.

    HELLODBA.COM>exec sql_explain('insert into t_objects_dummy2 select * from t_objects@ora11r2','TYPICAL');

    … …

    Remote SQL Information (identified by operation id):

    ----------------------------------------------------

    1 - SELECT /*+ OPAQUE_TRANSFORM */ "OWNER","OBJECT_NAME","SUBOBJECT_NAME","OBJECT_I

    D","DATA_OBJECT_ID","OBJECT_TYPE","CREATED","LAST_DDL_TIME","TIMESTAMP","STATUS","TEMP

    ORARY","GENERATED","SECONDARY","NAMESPACE","EDITION_NAME","LIO" FROM "T_OBJECTS"

    "T_OBJECTS" (accessing 'ORA11R2' )

    HELLODBA.COM>insert into t_objects_dummy2 select * from t_objects@ora11r2;

    72116 rows created.

    (远程数据库,11.2.0.1)

    HELLODBA.COM>select sql_text from v$sqlarea where sql_text like '%OPAQUE_TRANSFORM%' and sql_text not like '%v$sqlarea%';

    SQL_TEXT

    -------------------------------------------------------------------------------------------------------

    SELECT /*+ OPAQUE_TRANSFORM */ "OWNER","OBJECT_NAME","SUBOBJECT_NAME","OBJECT_ID","DATA_OBJECT_ID","OBJECT_TYPE","CREATE

    D","LAST_DDL_TIME","TIMESTAMP","STATUS","TEMPORARY","GENERATED","SECONDARY","NAMESPACE","EDITION_NAME","LIO" FROM "T_OBJECTS" "T_OBJECTS"

    语法:STATEMENT_QUEUING

    描述:在自动并行度模式(11gR2特性)下,使语句在并行资源不足时,进入等待队列,等到能获取到资源时继续运行;

    自动并行度模式下,当存在多个并行查询同时在运行时,如果并行资源不足那么加了该提示的语句就会进入队列等待,此时,通过监控视图V$SQL_MONITOR可以看到其状态为QUEUE。

    语法:NO_STATEMENT_QUEUING

    描述:在自动并行度模式(11gR2特性)下,即使在并行资源不足时,也继续运行语句,这就可能会导致其它资源(如CPU)的争用与等待;

    当参数“_parallel_statement_queuing”被设置为TRUE(默认为FALSE),只有加上该提示的语句在并行资源紧张时不会进入队列。

    语法:GBY_PUSHDOWN([])

    描述:指示优化器在对并行查询进行代价估算时,考虑将GROUP BY操作推入并行服务进程的情况;

    HELLODBA.COM>exec sql_explain('SELECT /*+ FULL(T) parallel(T DEFAULT) GBY_PUSHDOWN */ owner, table_name, COUNT (status) cnt FROM t_tables t GROUP BY owner, table_name', 'BASIC OUTLINE');

    ---------------------------------------------

    | Id| Operation| Name|

    ---------------------------------------------

    |0 | SELECT STATEMENT||

    |1 |PX COORDINATOR ||

    |2 |PX SEND QC (RANDOM)| :TQ10001 |

    |3 |HASH GROUP BY||

    |4 |PX RECEIVE||

    |5 |PX SEND HASH| :TQ10000 |

    |6 |HASH GROUP BY||

    |7 |PX BLOCK ITERATOR ||

    |8 |TABLE ACCESS FULL| T_TABLES |

    ---------------------------------------------

    语法:NO_GBY_PUSHDOWN([])

    描述:禁止优化器在对并行查询进行代价估算时,将GROUP BY操作推入并行服务进程;

    HELLODBA.COM>exec sql_explain('SELECT /*+ FULL(T) parallel(T DEFAULT) NO_GBY_PUSHDOWN */ owner, table_name, COUNT (status) cnt FROM t_tables t GROUP BY owner, table_name', 'BASIC OUTLINE');

    --------------------------------------------

    | Id| Operation| Name|

    --------------------------------------------

    |0 | SELECT STATEMENT||

    |1 |PX COORDINATOR||

    |2 |PX SEND QC (RANDOM)| :TQ10001 |

    |3 |HASH GROUP BY||

    |4 |PX RECEIVE||

    |5 |PX SEND HASH| :TQ10000 |

    |6 |PX BLOCK ITERATOR ||

    |7 |TABLE ACCESS FULL| T_TABLES |

    --------------------------------------------

    语法:HWM_BROKERED

    描述:提示语句执行器在执行并行插入数据(或从其它表获取数据创建新表)时,使用高水位线查封器拆分高水位线,使得多个并行服务进程能共用一个扩展段。

    示例(9i):

    HELLODBA.COM>alter session enable parallel dml;

    Session altered.

    HELLODBA.COM>explain plan for insert /*+ append */ into t_objects_dummy select /*+ full(o) parallel(o 2)*/* from t_objects o;

    Explained.

    HELLODBA.COM>select plan_table_output from table(dbms_xplan.display(null, null, 'ALL'));

    PLAN_TABLE_OUTPUT

    --------------------------------------------------------------------------------

    -------------------------------------------------------------------------------------------------

    | Id| Operation|Name| Rows| Bytes | Cost|TQ|IN-OUT| PQ Distrib |

    -------------------------------------------------------------------------------------------------

    |0 | INSERT STATEMENT|| 32435 |2945K|22 ||||

    |1 |LOAD AS SELECT||||||||

    |2 |TABLE ACCESS FULL| T_OBJECTS| 32435 |2945K|22 | 63,00| P->S | QC (RAND)|

    -------------------------------------------------------------------------------------------------

    HELLODBA.COM>explain plan for insert /*+ append HWM_BROKERED */ into t_objects_dummy select /*+ full(o) parallel(o 2)*/* from t_objects o;

    Explained.

    HELLODBA.COM>select plan_table_output from table(dbms_xplan.display(null, null, 'ALL'));

    PLAN_TABLE_OUTPUT

    --------------------------------------------------------------------------------

    -------------------------------------------------------------------------------------------------

    | Id| Operation|Name| Rows| Bytes | Cost|TQ|IN-OUT| PQ Distrib |

    -------------------------------------------------------------------------------------------------

    |0 | INSERT STATEMENT|| 32435 |2945K|22 ||||

    |1 |LOAD AS SELECT||||||||

    |2 |TABLE ACCESS FULL| T_OBJECTS| 32435 |2945K|22 | 64,00| P->S | QC (RAND)|

    |2 |TABLE ACCESS FULL| T_OBJECTS| 32435 |2945K|22 | 63,00| P->S | QC (RAND)|

    |1 |LOAD AS SELECT||||||||

    |2 |TABLE ACCESS FULL| T_OBJECTS| 32435 |2945K|22 | 64,00| P->S | QC (RAND)|

    |2 |TABLE ACCESS FULL| T_OBJECTS| 32435 |2945K|22 | 63,00| P->S | QC (RAND)|

    |0 | INSERT STATEMENT|| 32435 |2945K|22 ||||

    |1 |LOAD AS SELECT||||||||

    |2 |TABLE ACCESS FULL| T_OBJECTS| 32435 |2945K|22 | 64,00| P->S | QC (RAND)|

    |2 |TABLE ACCESS FULL| T_OBJECTS| 32435 |2945K|22 | 63,00| P->S | QC (RAND)|

    |1 |LOAD AS SELECT||||||||

    |2 |TABLE ACCESS FULL| T_OBJECTS| 32435 |2945K|22 | 64,00| P->S | QC (RAND)|

    |2 |TABLE ACCESS FULL| T_OBJECTS| 32435 |2945K|22 | 63,00| P->S | QC (RAND)|

    -------------------------------------------------------------------------------------------------

    语法:NO_QKN_BUFF

    描述:禁止优化器使用动态分配的内存

    HELLODBA.COM>exec sql_explain('select /*+parallel(t 8) parallel(o 8) leading(t o) pq_distribute(o hash hash) NO_QKN_BUFF*/* from t_tables t, t_objects o where t.owner=o.owner and t.table_name=o.object_name and o.status=:A','BASIC');

    ---------------------------------------------

    | Id| Operation| Name|

    ---------------------------------------------

    |0 | SELECT STATEMENT||

    |1 |PX COORDINATOR||

    |2 |PX SEND QC (RANDOM)| :TQ10002|

    |3 |HASH JOIN||

    |4 |PX RECEIVE||

    |5 |PX SEND HASH| :TQ10000|

    |6 |PX BLOCK ITERATOR ||

    |7 |TABLE ACCESS FULL| T_TABLES|

    |8 |PX RECEIVE||

    |9 |PX SEND HASH| :TQ10001|

    |10 |PX BLOCK ITERATOR ||

    |11 |TABLE ACCESS FULL| T_OBJECTS |

    ---------------------------------------------

    语法:PARALLEL_INDEX([查询块] [ ...] )或者PARALLEL_INDEX([查询块] () [() ...] )

    描述:指示优化器选择并行方式访问本地分区索引。并行度可以为数字,也可以为DEFAULT,使用系统默认并行度。

    HELLODBA.COM>exec sql_explain('select /*+ qb_name(M) parallel_index(o t_objects_list_IDX1 2) */* from t_objects_list o where object_name like :A', 'BASIC');

    --------------------------------------------------------------------

    | Id| Operation| Name|

    --------------------------------------------------------------------

    |0 | SELECT STATEMENT||

    |1 |PX COORDINATOR||

    |2 |PX SEND QC (RANDOM)| :TQ10000|

    |3 |PX PARTITION LIST ALL||

    |4 |TABLE ACCESS BY LOCAL INDEX ROWID| T_OBJECTS_LIST|

    |5 |INDEX RANGE SCAN| T_OBJECTS_LIST_IDX1 |

    --------------------------------------------------------------------

    语法:NO_PARALLEL_INDEX([查询块] [ ...])或者NO_PARALLEL_INDEX([查询块] () [() ...])

    描述:禁止优化器选择并行方式访问本地分区索引

    HELLODBA.COM>alter index t_objects_list_IDX1 parallel(degree 2);

    Index altered.

    HELLODBA.COM>exec sql_explain('select /*+ qb_name(M) no_parallel_index(o t_objects_list_IDX1)*/* from t_objects_list o where object_name like :A', 'BASIC');

    ------------------------------------------------------------------

    | Id| Operation| Name|

    ------------------------------------------------------------------

    |0 | SELECT STATEMENT||

    |1 |PARTITION LIST ALL||

    |2 |TABLE ACCESS BY LOCAL INDEX ROWID| T_OBJECTS_LIST|

    |3 |INDEX RANGE SCAN| T_OBJECTS_LIST_IDX1 |

    ------------------------------------------------------------------

    语法:PQ_DISTRIBUTE([] )或者PQ_DISTRIBUTE([] )

    描述:指定并行查询中并行收、发进程直接的分发方式;

    HELLODBA.COM>exec sql_explain('select /*+parallel(o 2)*/* from t_objects o where exists (select /*+hash_sj PQ_DISTRIBUTE(t HASH HASH)*/1 from t_tables t where o.owner = t.owner and o.object_name = t.table_name)', 'BASIC');

    -------------------------------------------------------

    | Id| Operation| Name|

    -------------------------------------------------------

    |0 | SELECT STATEMENT||

    |1 |PX COORDINATOR||

    |2 |PX SEND QC (RANDOM)| :TQ10002|

    |3 |HASH JOIN RIGHT SEMI BUFFERED||

    |4 |BUFFER SORT||

    |5 |PX RECEIVE||

    |6 |PX SEND HASH| :TQ10000|

    |7 |INDEX FULL SCAN| T_TABLES_PK |

    |8 |PX RECEIVE||

    |9 |PX SEND HASH| :TQ10001|

    |10 |PX BLOCK ITERATOR||

    |11 |TABLE ACCESS FULL| T_OBJECTS|

    -------------------------------------------------------

    语法:PARALLE([[] ] [])

    描述:指示优化器对查询块或者对象使用并行查询。其中,当中指定整条语句为并行查询(未指定查询块和表)时,并行度可以为MANUAL,AUTO,DEFAULT或者指定数字;指定某个表时,并行度可以为DEFAULT或者指定数字,

    HELLODBA.COM>exec sql_explain('SELECT /*+ parallel(u default) */* from t_users u', 'BASIC');

    -----------------------------------------

    | Id| Operation| Name|

    -----------------------------------------

    |0 | SELECT STATEMENT||

    |1 |PX COORDINATOR||

    |2 |PX SEND QC (RANDOM)| :TQ10000 |

    |3 |PX BLOCK ITERATOR ||

    |4 |TABLE ACCESS FULL| T_USERS|

    -----------------------------------------

    语法:NO_PARALLEL()

    描述:禁止优化器并行查询表

    HELLODBA.COM>alter table t_objects_dummy parallel(degree 2);

    Table altered.

    HELLODBA.COM>exec sql_explain('SELECT /*+ no_parallel */* from t_objects_dummy o', 'BASIC');

    Plan hash value: 2093122083

    ---------------------------------------------

    | Id| Operation| Name|

    ---------------------------------------------

    |0 | SELECT STATEMENT||

    |1 |TABLE ACCESS FULL| T_OBJECTS_DUMMY |

    ---------------------------------------------

    语法:SHARED( [并行度])

    描述:指示优化器共享指定表的并行度。如果指定并行度,则和PARALLEL提示作用相同。

    HELLODBA.COM>alter table t_objects_dummy parallel(degree 2);

    Table altered.

    HELLODBA.COM>alter table t_objects parallel(degree 8);

    Table altered.

    HELLODBA.COM>exec sql_explain('select /*+ full(o) full(d) shared(d) */count(*) from t_objects_dummy d, t_objects o where o.owner=d.owner and o.object_name = d.object_name', 'BASIC COST');

    ------------------------------------------------------------------

    | Id| Operation| Name| Cost (%CPU)|

    ------------------------------------------------------------------

    |0 | SELECT STATEMENT||719(1)|

    |1 |SORT AGGREGATE|||

    |2 |PX COORDINATOR|||

    |3 |PX SEND QC (RANDOM)| :TQ10002||

    |4 |SORT AGGREGATE|||

    | 5 |HASH JOIN||719(1)|

    |6 |PX RECEIVE||231(0)|

    |7 |PX SEND HASH| :TQ10000|231(0)|

    |8 |PX BLOCK ITERATOR ||231(0)|

    |9 |TABLE ACCESS FULL| T_OBJECTS|231(0)|

    |10 |PX RECEIVE||486(0)|

    |11 |PX SEND HASH| :TQ10001|486(0)|

    |12 |PX BLOCK ITERATOR ||486(0)|

    |13 |TABLE ACCESS FULL| T_OBJECTS_DUMMY |486(0)|

    ------------------------------------------------------------------

    HELLODBA.COM>exec sql_explain('select /*+ full(o) full(d) shared(o) */count(*) from t_objects_dummy d, t_objects o where o.owner=d.owner and o.object_name = d.object_name', 'BASIC COST');

    ------------------------------------------------------------------

    | Id| Operation| Name| Cost (%CPU)|

    ------------------------------------------------------------------

    |0 | SELECT STATEMENT||1437(1)|

    |1 |SORT AGGREGATE|||

    |2 |PX COORDINATOR|||

    |3 |PX SEND QC (RANDOM)| :TQ10002||

    |4 |SORT AGGREGATE|||

    |5 |HASH JOIN||1437(1)|

    |6 |PX RECEIVE||463(1)|

    |7 | PX SEND HASH| :TQ10000|463(1)|

    |8 |PX BLOCK ITERATOR ||463(1)|

    |9 |TABLE ACCESS FULL| T_OBJECTS|463(1)|

    |10 |PX RECEIVE||973(1)|

    |11 |PX SEND HASH| :TQ10001|973(1)|

    |12 |PX BLOCK ITERATOR ||973(1)|

    |13 |TABLE ACCESS FULL| T_OBJECTS_DUMMY |973(1)|

    ------------------------------------------------------------------

    语法:NOPARALLEL([[] ])

    描述:禁止优化器对查询块或者对象使用并行查询。和NO_PARALLEL作用基本相同。

    参见NO_PARALLEL示例。

    语法:PQ_MAP()

    描述:未知。可能是用于并行查询的提示。

    语法:PQ_NOMAP()

    描述:未知。可能是用于并行查询的提示。

    语法:PRESERVE_OID

    描述:未知。可能是用于并行查询的提示。

    语法:SYS_PARALLEL_TXN

    描述:未知。可能是用于并行查询的递归调用语句上的。

    语法:CUBE_GB

    描述:未知。可能是用于GROUP BY CUBE并行查询的内部递归查询

    该提示直接使用会导致10g(10.2.0.4)在解析提示时在后台发生ORA-00600错误,但不会终止语句运行。

    ORA-600: internal error code, arguments: [prsHintQbLevel-1], [890], [], [], [], [], [], []

    发生类似情况的提示还有:CUBE_GB/GBY_CONC_ROLLUP/PIV_GB/PIV_SSF/RESTORE_AS_INTERVALS/SAVE_AS_INTERVALS/SCN_ASCENDING/MODEL_DONTVERIFY_UNIQUENESS/TIV_GB/TIV_SSF

    语法:GBY_CONC_ROLLUP

    描述:未知。可能是用于GROUP BY ROLLUP并行查询的内部递归查询

    语法:PIV_GB

    描述:未知。出现在GROUP BY并行查询的内部递归查询语句上

    示例(9i):

    HELLODBA.COM>select /*+qb_name(Q2) full(o2) parallel(o2 2)*/ owner, status, count(object_name) from t_objects o2 where owner like 'D%' group by owner, status;

    Execution Plan

    ----------------------------------------------------------

    0SELECT STATEMENT Optimizer=CHOOSE (Cost=11 Card=3 Bytes=42)

    10SORT* (GROUP BY) (Cost=11 Card=3 Bytes=42):Q17865001

    21SORT* (GROUP BY) (Cost=11 Card=3 Bytes=42):Q17865000

    32TABLE ACCESS* (FULL) OF 'T_OBJECTS' (Cost=6 Card=3379 Bytes=47306):Q17865000

    1 PARALLEL_TO_SERIALSELECT /*+ CIV_GB */ A1.C0,A1.C1,COUNT(SYS_O

    P_CSR(A1.C2,0)) FROM :Q17865000 A1 GROUP BY

    A1.C0,A1.C1

    2 PARALLEL_TO_PARALLELSELECT /*+ PIV_GB */ A1.C0 C0,A1.C1 C1,SYS_O

    P_MSR(COUNT(*)) C2 FROM (SELECT /*+ NO_EXPAN

    D ROWID(A2) */ A2."OWNER" C0,A2."STATUS" C1

    FROM "T_OBJECTS" PX_GRANULE(0, BLOCK_RANGE,

    DYNAMIC)A2 WHERE A2."OWNER" LIKE 'D%') A1

    GROUP BY A1.C0,A1.C1

    3 PARALLEL_COMBINED_WITH_PARENT

    语法:TIV_GB

    描述:未知。出现在并行查询的内部递归查询语句上

    语法:TIV_SSF

    描述:未知。出现在并行查询的内部递归查询语句上

    语法:PIV_SSF

    描述:未知。出现在并行查询的内部递归查询语句上

    语法:RESTORE_AS_INTERVALS

    描述:未知。出现在并行查询的内部递归查询语句上

    语法:SAVE_AS_INTERVALS

    描述:未知。出现在并行查询的内部递归查询语句上

    语法:SCN_ASCENDING

    描述:未知。出现在并行查询的内部递归查询语句上

    展开全文
  • 有时,我们希望能同时运行多个 Pod,提高 Job 的执行效率。这个可以通过parallelism设置。 这里我们将并行的 Pod 数量设置为 2,实践一下: Job 一共启动了两个 Pod,而且AGE...上面配置的含义是:每次运行两个 ...

    有时,我们希望能同时运行多个 Pod,提高 Job 的执行效率。这个可以通过 parallelism 设置。

    这里我们将并行的 Pod 数量设置为 2,实践一下:

    Job 一共启动了两个 Pod,而且 AGE 相同,可见是并行运行的。

    我们还可以通过 completions 设置 Job 成功完成 Pod 的总数:

    上面配置的含义是:每次运行两个 Pod,直到总共有 6 个 Pod 成功完成。实践一下:

    DESIRED 和 SUCCESSFUL 均为 6,符合预期。如果不指定 completions 和 parallelism,默认值均为 1

    上面的例子只是为了演示 Job 的并行特性,实际用途不大。不过现实中确实存在很多需要并行处理的场景。比如批处理程序,每个副本(Pod)都会从任务池中读取任务并执行,副本越多,执行时间就越短,效率就越高。这种类似的场景都可以用 Job 来实现。

    下一节我们讨论如何定时执行 Job。

    书籍:
    1.《每天5分钟玩转Docker容器技术》
    https://item.jd.com/16936307278.html

    2.《每天5分钟玩转OpenStack》
    https://item.jd.com/12086376.html

    展开全文
  • 核心 对于一个多功能可编程接口芯片,我们要想使用它,必须 先确定需求,要用什么芯片去干什么 设置芯片工作方式 然后再让芯片工作 ...控制字编码含义 我们将8位控制字编码拆开看! D7 D6 D5 D

    核心

    对于一个多功能可编程接口芯片,我们要想使用它,必须

    1. 先确定需求,要用什么芯片去干什么
    2. 设置芯片的工作方式
    3. 然后再让芯片工作

    至于设置的方式,当然是软件编程。

    同时重点注意,例如8255A,它一次只能写8位数据,像多干活,就多写几次就好了,反正速度快。需要理解不是一次性完成就好。

    与CPU控制接口的方式结合理解

    • 无条件
    • 查询
    • 中断
    • DMA

    前提

    CPU能够对接口进行读写控制,通过IO译码能够选中端口地址,进行数据读写。

    控制字的编码含义

    我们将8位控制字编码拆开看!

    D7 D6 D5 D4 D3 D2 D1 D0
    1 x x x x x x x
    0 x x x x x x x

    首先看最高位D7

    • D7 = 1:方式选择控制
    • D7 = 0:C端口置0置1控制

    方式选择控制

    对于方式选择控制,我们拆开看

    D7 D6 D5 D4 D3 D2 D1 D0
    1
    • 最高位是1
    • D6~D3:A组控制
    • D2~D0:B组控制
    A组控制
    D6 D5 D4 D3
    • D6D5:A组的方式选择(很好记,与二进制的十进制值一样)
      • 00:方式0
      • 01:方式1
      • 10、11:方式2
    • D4:A端口输入输出控制
    • D3:C端口高4位输入输出控制

    B组控制

    D2 D1 D0
    • D2:B组方式选择
      • 0:方式0
      • 1:方式1
    • D1:B端口输入输出控制
    • D0:C端口低四位输输出控制

    一些通用法则

    1. A组和B组控制是相互独立的
    2. 端口的输入,就是1(input的i就像1);端口输出,就是0(output)
    3. 方式的选择,二进制的十进制值与方式对应
    4. A、B端口只能作为输入或输出,用于传送外设数据
    5. C端口不同方式下的含义不同
      1. 可以设置D7 = 0来设置C寄存器的每一位的值
      2. 方式0下是作为独立的输入输出的
      3. 其他方式下,作为A组或B组的补充信息位,用于表示A端口或B端口传送状态,空闲位仍可以独立使用
      4. A组与B组的工作方式可以不一样,因此C端口的高4位和低4位的作用也可以不一样,相互独立
    6. 如果没有用到,就写0,当然这只是习惯

    总之,二进制编码分开看待,相互独立,不同情况下含义不同,一样分开看,就什么都能看清楚了

    C端口置0置1控制

    D7 D6 D5 D4 D3 D2 D1 D0
    0 x x x
    • x可以直接都写0就好
    • D3D2D1:3位编码对应C端口的8个二进制位,用于选中某一位
    • D0:0的时候将选中的位置0,1的时候置1

    这个控制字的作用,就是控制C端口某一位的值的,如果有单独控制的需要,就设置就好了。

    • 可能是设置空闲位
    • 也可能设置状态位

    对待每种工作方式的思考点

    • 接口:如何设置,原理和功能
    • CPU :如何控制,控制方式,汇编指令
    • 外设:能干啥(数据肯定行,但是响应信号之类的呢?它能不能干,能不能用?)

    其实也就这些了,还是内3个器件,4个箭头的事儿。

    接下来,将会具体阐述每个工作方式下,二进制编码的含义。


    见下一篇。

    展开全文
  • MapReduce技术原理

    千次阅读 2018-05-20 15:01:37
    MapReduce是面向大数据并行处理计算模型、框架和平台。 它包含以下三层含义: MapReduce是一个基于集群高性能并行计算平台(Cluster Infrastructure)。 MapReduce是一个并行计算与运行软件框架(Software ...
  • 摘 要:USB作为一种新型的接口技术,以其简单易用、速度快等特点而备受青睐。本文简要介绍USB 接口的特点、硬件结构、数据流传送以及外设控制器的实现方式。并详细说明利用51单片机...速度快是USB技术的突出特点之一
  • 摘要概述了产品数据管理技术的含义和产品数据管理系统的基本功能组成,论述了目前企业面临的主要问题和产品数据管理技术在处理这些问题方面的优势,表明了企业实施产品数据管理技术的必要性和迫切性。   目前,...
  • RAID技术简介

    千次阅读 2018-04-11 15:17:08
    一、RAID名词解释RAID技术主要是通过条带化、并行存储、校验、镜像方式来提高数据存储速率及安全。可由硬件、软件两种方式来实现RAID技术。二、RAID组四种工作状态三、常见RAID级别 级别 含义 RAID0 数据条带...
  • 1.1.1集群的含义  集群是一种并行或分布式系统。  集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益,其任务调度则是集群系统中...
  • 负载均衡技术

    2012-03-01 22:36:19
    负载均衡有两方面的含义:首先,大量的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间;其次,单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇...
  • 负载均衡技术简介

    2011-08-28 10:13:34
    负载均衡有两方面的含义:首先,大量的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间;其次,单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,...
  • 千兆以太网技术与应用

    热门讨论 2011-06-22 21:39:31
    13.4.2 AUI、MII等的含义 160 13.4.3 体系结构:标准与现实 161 13.4.4 标准条款 162 13.5 正在进行的工作 167 第三部分 千兆以太网应用 第14章 应用环境 169 14.1 端站接入点 170 14.1.1 硬件平台和I/O总线 171 ...
  • windowsnt 技术内幕

    2014-04-09 20:47:17
    理解NTFS分区和文件大小限制 NTFS POSIX.1符合性 为NTFS分区整理碎片 可移动介质和Windows NT 理解运行第三方磁盘工具造成的问题 支持基于Win32的应用程序 理解Windows NT对附加技术的支持 知道在什么时候不能使用...
  • 大数据与云计算物联网关系

    千次阅读 2020-02-25 21:27:33
    一类是以谷歌GFS和MapReduce为代表大规模分布式并行计算技术; 另一类是以亚马逊虚拟机和对象存储为代表“按需租用”商业模式。 但是,随着大数据概念提出,云计算中分布式计算技术开始更多地被列入...
  • 1、 存储单元的分配、标志位的含义 2 、主程序框图及清单(带有注释) 硬件设计――――――――――――――――――――9 一、系统所选用各芯片的介绍 1、中断优先级管理器8259A 2、可编程并行接口接口芯片...
  • ( 现代交换原理与通信网技术 (卞佳丽 着) 北京邮电大学出版社 课后答案.pdf )答:在任意入线和出线之间建立连接,并将入线上信息分发到出线上去。 9.分别说明什么是集中型、分配型、扩散型交换单元?什么是有向交换...
  • 云计算最初主要包括了两类含义:一类是以谷歌GFS和MapReduce为代表大规模分布式并行计算技术;另一类是以亚马逊虚拟机和对象存储为代表“按需租用”商业模式。 随着大数据概念提出,云计算中分布式计算...
  • 5.1.1 TAPI的含义 5.1.2 TAPI的体系结构 5.1.3 TAPI的服务类型 5.2 windows TAPI 2.x函数集 5.2.1 Windows TAPI编程流程 5.2.2 TAPI 2.x常用函数 5.3 使用TAPI实现电话拨打程序 5.4 实践拓展 第二篇 串口编程基础...
  • EOS.IO是一个由其创始团队block.one开发一个平台软件,他构建一个区块链底层的技术架构,类似区块链中操作系统使得更多开发者能够基于EOS.IO平台快速方便构建分布式应用软件(DAPP)。EOS就像PC中Windows...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 152
精华内容 60
关键字:

并行技术的含义