根据处理器对内存的访问方式将共享存储器方式的计算机系统分为两大类,即UMA(Uniform Memory Access,统一内存访问)架构和NUMA(Non Uniform Memory Access,非统一内存访问)架构。
UMA架构
UMA是对称多处理器计算机采用的存储器架构,因此对称多处理器系统有时也称为UMA架构系统。在对称多处理器架构下,系统中的每个处理器内核地位相同,其看到的存储器和共享硬件也都是相同的。在UMA架构的多处理器系统中,所有的处理器都访问一个统一的存储器空间,这些存储器往往以多通道的方式组织。在UMA架构下,所有的内存访问都被传递到相同的共享内存总线上,不同的处理器访问存储器的延迟时间相同,任何一个进程或线程都可以被分配到任何一个处理器上运行。每个处理器还可以配备私有的Cache,外围设备也可以通过某种形式共享。因而UMA架构可以在操作系统的支持下达到非常好的负载均衡效果,让整个系统的性能、吞吐量有较大提升。
但从存储器访问的角度看,对称多处理器架构的缺点是可伸缩性差。这是因为多个核使用相同的总线访问内存,随着处理器内核数的增加,总线将成为系统性能提升的瓶颈。因而UMA架构只适用于处理器内核数量相对较少的情况,不适用于系统中配置数十个甚至数百个处理器内核的情况。
NUMA架构
而NUMA架构则属于分布式共享存储(Distributed Shared Memory,DSM)架构,存储器分布在不同节点上。NUMA架构通过限制任何一条内存总线上的处理器内核数量并依靠高速互连通道连接各个节点,从而缓解了各个处理器内核竞争共享内存总线造成的访问瓶颈的影响。
在NUMA架构中,每个处理器与本地存储器单元距离更短,而与远程存储器(其他处理器所属的本地存储器)距离更长。因此,处理器访问本地存储器的延迟比访问远程存储器更短,即NUMA架构中存储器访问周期是不固定的,取决于被访问存储器的物理位置。
不同NUMA域内的处理器内核访问同一个物理位置的存储器的延迟时间不同。系统内的存储器访问延迟从高到低依次为:跨CPU访存、不跨CPU但跨NUMA域访存、NUMA域内访存。因此,在应用程序运行时应尽可能避免跨NUMA域访问存储器,这可以通过设置线程的CPU亲和性(Affinity)来实现。
NUMA架构既可以保持对称多处理器架构的单一操作系统、简便的应用程序编程模式及易于管理的特点,又可以有效地扩充系统的规模。NUMA架构能够为处理器访问本地存储器单元提供高速互连机制,同时为处理器访问远程存储器单元提供较为经济但延迟时间更高的连接通道,因而NUMA架构的系统通常比UMA架构的系统更加经济且性能更强大。
在NUMA架构中,有一种类型应用特别普遍,即CC-NUMA(Cache Coherent Non-Uniform Memory Access,缓存一致性非统一内存访问)系统。缓存一致性问题是由于多个处理器共享同一个存储空间而引起的,而CC-NUMA是指通过专门的硬件保持Cache中的数据和共享内存中的数据的一致性,不需要软件来保持多个数据副本之间的一致性。
UMA和NUMA的适配场景
如果一个CPU访问的数据量不大,本地内存就足够的话,那么NUMA架构的优势就可以发挥出来了,各个CPU可以并发的访问自己的内存。
如果CPU访问的数据量大的话,那么CPU需要频繁的访问其他CPU的内存,内部互连的效率是要小于UMA总线的效率。所以NUMA的效率会低于UMA的。