多CPU架构变迁之SMP、NUMA和MPP
服务器最开始的时候是单CPU,然后才进化到了双CPU甚至多CPU的SMP架构。所谓SMP架构
指的是多路CPU无主次,共享内存、总线、操作系统等。此时每个CPU访问内存任何地址所耗费的时间是相等的。所以也称为一致存储器访问结构
大家共享同样的内存,所以扩展能力有限,因为CPU数量增加了,内存访问冲突也会增加。为了进一步提高CPU数量的同时还能保证效率,NUMA架构出现了,将多个SMP进行松耦合。
非一致存储访问结构:(NUMA,Non-Uniform Memory Access)
更多请参考:https://www.xmmup.com/neicunfenpeizhongdenuma.html
NUMA架构中,多个SMP通过Crossbar switch交换矩阵进行互联。
每个SMP有自己的内存,同时还可以访问其他SMP
的内存,但是需要经过高速交换矩阵,很显然SMP访问自己的内存速度非常高,但是访问远端的SMP的内存还需要经过交换矩阵,延迟增加,可以看出NUMA通过牺牲内存的访问时延来达到更高的扩展性。
总之,SMP与NUMA架构对软件程序方面影响扩展性不大,一台主机内都使用单一的操作系统。
缺点是CPU数量增加,访问远端内存的时延也会增加,性能不能线性增加。此时MPP架构就出现了。
海量并行处理结构:(MPP,Massive Parallel Processing)
MPP说白了就是将多台独立的主机组成集群。显然在此架构下,每个节点都有各自的CPU、内存、IO总线、操作系统,完全松耦合。最关键的是MPP集群中的软件架构也相应的改变了,这样MPP的效率随节点数量增加就可以线性增加了。
其实如果NUMA架构下,如果通过上层软件来使得程序尽量少的读取远端的内存,NUMA效率也会线性增加。但是实际上NUMA操作系统仍然是同一个,内存仍然是全局均匀的,所以访问远端内存是不可避免的。
那么MPP相当于把内存强制分开,同时又改变了程序架构,这样就可以保证海量计算下的效率线性增加。
SMP和MP
在讲SMP之前需要先了解下MP系统的概念以及其分类
SMP(Symmetric multiprocessing,对称多处理器技术)是提高系统处理能力的一种方法。
单CPU同时只能处理一个线程,如果有许多线程需要执行,CPU数量必然是一个瓶颈,只能通过提高CPU频率提高处理性能。
MP技术(Multi-Processing,多处理技术)使用多个CPU能够协同工作,并行处理,每个CPU在执行队列中选取一个线程执行。
MP系统依据资源共享方式,有多种类型:
松耦合的多处理技术
许多不同系统通过网络通信技术进行互联,通常通过软件技术实现,例如IBM的SP系统(System Parallel,并行系统)、使用群集软件HACMP的并行版(PSSP),建立起松耦合的多处理架构。不同的系统被称为节点,可以互相共享文件、存储,但并不共享CPU和内存,通过专用高速网络进行节点间通信(SP系统专用的交换网络,或者Infinity Band网络等),利用软件控制任务分发和并行处理。
紧耦合的多处理技术
多个CPU之间共享部分内存,但每个CPU都有自己的独立内存和总线结构,通过一个操作系统控制不同处理器之间协同工作,一般有一个主处理器,管理其他从处理器,如果此主处理器不能工作,则由第二候选处理器升级为主处理器。
对称多处理器技术(SMP)
多个CPU之间没有区别,平等地访问内存、外设、一个操作系统。操作系统管理着一个队列,每个处理器依次处理队列中的进程。如果两个处理器同时请求访问一个资源(例如同一段内存地址),由硬件、软件的锁机制去解决资源争用问题。
pSeries采用的就是SMP结构。在AIX中,每个处理器依据其物理位置,依次标记为:proc0,proc1,…不同处理器在正常运行的时候没有区别,但是在机器启动的时候,通常由proc0控制引导过程,如果必要,也可以控制系统内核从其他的处理器引导系统。
由于SMP需要协调各个处理器之间的工作,因此当处理器数量很多,或者执行任务的并行度差(任务之间有复杂的逻辑关联)时,CPU数量增加,则系统性能提高的比例递减,也就是所谓的线性度不好。线性度与CPU设计、操作系统架构及任务类型关系密切,每个计算机厂商都有自己的一套理论来支持自己的设计体系,并没有哪一种理论可以占据绝对优势。例如Sun走的是"群殴"路线,用数量众多的CPU、内存来提高总体性能,尽管最后将近满配的时候,每个CPU所带来的性能提升非常有限。Sun服务器中动辄几十颗,甚至一百多颗CPU并行!IBM则走向另一个极端,甚至曾经建议客户不要使用12颗以上的CPU运行一个操作系统映像(当然也有人说这是因为当时IBM的最高端服务器S70只能支持12颗CPU,作者则觉得两种原因都有)。现在呢,IBM的UNIX服务器仍然是采用少而精的策略,最高端服务器也只可以配到64颗CPU(在IBM只支持最多32颗CPU的时候,HP和Sun的服务器就有可以支持到128颗的配置了,当然可能当时的操作系统并不支持这么多,需要分区后才能使用,一个分区最多64颗CPU)。IBM的一种解释是这样可以降低软件License的费用(因为现在大部分UNIX服务器软件都是按照CPU数量收费的);另一方面,IBM的POWER 5 CPU确实拥有很高的处理能力,可以以一敌二(至少现在的TPCC测试结果是这样),能够让IBM的销售代表理直气壮地任意解释。
SMP
SMP是一种紧耦合、共享存储的系统模型,特点是多个CPU使用共同的系统总线,因此可访问共同的外设和存储器资源。(所有处理器通过一条高速总线或者一个转换器在同一机器中紧密耦合。处理器共享同样的全局内存、磁盘和 I/0 设备。只有一份操作系统的副本跨所有处理器运行,并且操作系统必须设计为能利用这种体系结构(多线程操作系统))
构建SMP 系统的条件
首先,关键的是需要支持SMP 的硬件:CPU 和主板。
要实现SMP功能,我们使用的CPU必须具备以下要求:
1、 CPU内部必须内置APIC(Advanced Programmable Interrupt Controllers)单元。 Intel 多处理规范的核心就是高级 可编程中断控制器 (Advanced Programmable Interrupt Controllers--APICs)的使用。 CPU通过彼此发送中断来完成它们之间的通信。通过给中断附加动作(actions),不同的CPU可以在某种程度上彼此进行控制。 每个CPU有自己的APIC(成为那个CPU的本地APIC),并且还有一个I/O APIC来处理由I/O设备引起的中断,这个I/O APIC是安装在 主板 上的,但每个CPU上的APIC则不可或缺,否则将无法处理多CPU之间的中断协调。
2、相同的产品型号,同样类型的CPU核心。 例如,虽然Athlon和Pentium III各自都内置有APIC单元,想要让它们一起建立SMP系统是不可能的,当然,即使是Celeron和Pentium III,那样的可能性也为0,甚至Coppermine核心的Pentium III和Tualatin的Pentium III也不能建立SMP系统--这是因为他们的运行指令不完全相同,APIC中断协调差异也很大。
3、完全相同的运行频率。 如果要建立双Pentium III系统,必须两颗866MHz或者两颗1000MHz处理器,不可以用一颗866MHz,另一颗1000MHz来组建,否则系统将无法正常点亮。
4、尽可能保持相同的产品序列编号。 即使是同样核心的相同频率处理器,由于生产批次不同也会造成不可思议的问题。两个生产批次的CPU作为双处理器运行的时候,有可能会发生一颗CPU负担过高,而另一颗负担很少的情况,无法发挥最大性能,更糟糕的是可能导致死机,因此,应该尽可能选择同一批生产的处理器来组建SMP系统。
其次,需要操作系统的支持,例如LINUX UNIX WINDOWS SERVER 2003 等支持SMP 的系统。
最后,需要支持SMP的应用软件。
对称多处理 (SMP) 的应用优势
对称多处理 (SMP) 广泛应用于 PC 领域,能够显著提升台式计算机的性能。SMP 能使单芯片上多个相同的处理子系统运行相同的指令集,而且都对存储器、I/O 和外部中断具有同等的访问权限。 操作系统 (OS) 的单份拷贝就能控制所有内核,使任何处理器都能运行所有的线程,而无需考虑内核、应用或中断服务的区分。
存储系统的演进
存储系统与服务器CPU架构演进相同,控制器就好比CPU,后端磁盘柜就类似于内存。
SMP
纵观存储系统的演进,一开始是单控,后来演进到双控互为备份,此时就类似于AMP,两个控制器各自处理自己的任务。
然后进入到双控并行处理的时代(HDS的AMS2000存储系统),类似于SMP,两个控制器可以并行的处理。
再到后来则有多控并行对称处理架构,Oracle的RAC集群就可以视为一种多点SMP,各种共享底层存储的集群文件系统都属于多点对称SMPNUMA
同样NUMA也出现在了存储系统中,比如EMC的V-Max相当于多个SMP利用高速交换矩阵
来共享访问每个SMP上的内存,其中SMP就是一对控制器组成的Director,高速交换矩阵就是RapidIOMPP
那么IBM的XIV就属于松耦合MPP架构,每个节点都有自己的CPU、内存、IO接口,使用外部的交换机互相通信。
而HDS的VSP更像是一个紧耦合的MPP。
另一种属于MPP架构的存储系统就是分布式文件系统,比如HDFS等。
MPP对软件架构变化很大,所以传统存储厂商很难将之前的架构演进到MPP上来。
谁才是真正的Scale-out(横向扩展)
SMP/NUMA/MPP其实都算Scale-out,只不过程度和形态不同。
MPP架构的存储,比如XIV,在多路大块连续的IO
下,效率反而很差。这是因为单路IO可能导致整个MPP集群中的磁盘资源全部牵动
但是如果是小块随机的IO
,多路IO关联很少,则性能随节点数增加线性增加,这就好比将一个程序并行分解为多个子任务(类似于随机小IO),因为子任务之间的关联很少,节点之间的通信量很小,则并行执行的效率高。也就是MPP自身是share-Nothing架构,运行在上面的程序也尽可能的是Share-Nothing
SMP、NUMA、MPP各有各的好处,比如
- SMP适用于扩展性要求不高,而又不想程序改变太大的场景。
- MPP则适用于海量数据下的高扩展性需求场景。它需要对程序进行大量的改变,而且多流大块连续IO场景下性能不佳。所以MPP架构广泛的应用于互联网的底层Key-Value分布式数据库,这种数据库主要应对高随机小块读的场景,可以获得非常高的性能。