从系统架构来看,服务器的CPU和内存架构可以分三类:
SMP :Symmetric Multi-Processor
NUMA :Non-Uniform Memory Access
MPP :Massive Parallel Processing
我本人不认为MPP是CPU和内存架构的一种;我认为他是SMP或者NUMA的分布式架构应用而已;本文后续说明。
1.早期的服务器:SMP
最早的服务器都是一颗CPU,随着业务压力的增大,面临CPU不够的境况。怎么办?简单粗暴的办法就是:架构不动,在现有架构上加CPU即可。
架构不变,CPU是加了,但是效果没有想象的那么好。CPU是原来的两倍,但是系统性能并没有提升为原来的两倍。什么原因?两颗CPU的地位是平等的,共享内存总线;导致CPU0使用内存的时候,CPU1就得等待。两颗CPU的情况还马马虎虎能过得去,随着CPU数量的增大,CPU总线越来越成为瓶颈。怎么办?此时NUMA闪亮登场了。
2.现在的服务器:NUMA
NUMA解决了SMP架构内存总线的瓶颈,确保每个CPU都有自己的私有内存和内存总线;如果本CPU的内存不够怎么办?通过CPU总线(QPI或UPI)和其他CPU协商去借。任何事情都不可能十全十美,NUMA也有自己的问题,尤其是在数据库和虚拟化场景下的某些情况会有性能问题:1.跨CPU访问内存(即和别的CPU借内存)比访问本CPU的内存效率要低 2.会出现内存和CPU访问失衡问题:如4颗CPU,CPU1要访问的数据恰好在CPU0的内存里。
小提示:数据库场景下,有经验的DBA都会要求关闭NUMA。
3)MPP
SMP|NUMA架构下,所有的CPU都在一个server里,操作系统也是一个
MPP其实就是SMP|NUMA的多个server通过网络连接在一起,每个server都有自己的操作系统;MPP更多的是依赖多个server之间操作系统或者分布式软件来协调调度组成逻辑的计算机或者服务;本质上应该属于现代分布式架构。程序=算法+数据结构,其中算法可以算作是cpu处理,而数据结构可以看作是数据存储的话,那么很显然扩展的方向有两个,扩CPU和扩存储;此时又演化为scale-out和scale-up。scale-up的局限性很明显,无论多牛逼总有到头的一天;scale-out则计算和存储是永远可以线性扩展。这也是目前分布式大行其道的原因。