NUMA(非一致性内存架构)

https://blog.csdn.net/vanbreaker/article/details/7492886

一、基本概念

非一致性内存架构(Non-uniform Memory Architecture)是为了解决传统的对称多处理(Symmetric Multi-processor)系统中的可扩展性问题而诞生的。在对称多处理系统中,处理器共享北桥中的内存控制器来达到共同访问外部内存和IO的目的,也就是说所有的处理器对内存和I/O的访问方式和开销都是相同的。在这种系统中,随着更多的处理器被添加到SMP系统中,总线的竞争将会越来越大,系统的性能也必将随之大打折扣。SMP系统的示意图如下:

NUMA系统拥有多条内存总线,于是将几个处理器通过内存总线与一块内存相连构成一个组,这样整个庞大的系统就可以被分为若干个组,这个组的概念在NUMA系统中被称为节点(node)。处于该节点中的内存被称为本地内存(local memory),处于其他节点中的内存对于该组而言被称为外部内存(foreign memory)。而节点又可以分为三类,即本地节点(local node),邻居节点(neighbour node)和远端节点(remote node).

本地节点:对于某个节点中的所有CPU,此节点称为本地节点;

邻居节点:与本地节点相邻的节点称为邻居节点;

远端节点:非本地节点或邻居节点的节点,称为远端节点。

超立方体可以作为一种有效的拓扑来描述NUMA系统,它将系统中的节点数限制在2^C内,C是每个节点拥有的邻居节点数,如下图所示

以C=3为例,则对于节点1而言,2,3,5则为邻居节点,4,6,7,8为远端节点,显然访问开销的关系为 本地节点<邻居节点<远端节点。

二、AMD Hyper-Transport

古老的SMP系统只拥有一个位于北桥中的内存控制器,而如今更先进的做法是将内存控制器整合到CPU中去,这样每个CPU都拥有自己的内存控制器,不会相互之间产生竞争。最先采用这种做法的一批处理器就是AMD在2003年推出的AMD Opteron系列处理器,其结构如下图所示:

可以看到,每个CPU中都整合了一个内存控制器,并且CPU之间采用了一种Hyper-Transport的技术建立连接,这种连接可以使得CPU通过其他CPU来访问外部内存,当然访问开销要比访问本地内存更大。

三、操作系统的支持

为了支持NUMA架构,OS的设计必须将内存分布的特点考虑进去。举一个简单的例子,假如一个进程运行在一个给定的处理器中,那么为这个进程所分配的物理内存就应该是该处理器的本地内存,而不是外部内存。为了避免情况变得更糟,OS还要注意避免将一个进程从一个节点给迁移到另一个节点。在一个普通的多处理系统中,OS就应该已经尝试不去在处理器之间迁移进程,因为这意味着一个处理器的cache中的相关内容都将被丢失。如果在某种情况下必须进行迁移,那么OS可以随意选择一个空闲的处理器。但是在NUMA系统中,可选择的新处理器将要受到一些限制,最重要的一点就是新处理器访问内存的开销不能比先前的处理器大,也就是说应该尽可能选择本地节点中的处理器。当找不到符合条件的处理器,OS才能选择其他的处理器。在这种较糟的情况下有两种选择,一种是如果这个进程只是暂时性的被迁移出去,那么可以再将其迁移回更加合适的处理器;如果不是暂时性的,那么可以将该进程的内存拷贝到新处理器的内存中,这样就可以通过访问拷贝的内存来消除访问外部内存的开销,显然这是一种空间换时间的做法。

————————————————

版权声明:本文为CSDN博主「橙色逆流」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/vanbreaker/article/details/7492886

原文地址:https://www.cnblogs.com/dhcn/p/12272487.html

时间: 2024-10-08 16:51:37

NUMA(非一致性内存架构)的相关文章

服务器体系(SMP, NUMA, MPP)与共享存储器架构(UMA和NUMA)

3种系统架构与2种存储器共享方式 1.1 架构概述 从系统架构来看,目前的商用服务器大体可以分为三类 对称多处理器结构(SMP:Symmetric Multi-Processor) 非一致存储访问结构(NUMA:Non-Uniform Memory Access) 海量并行处理结构(MPP:Massive Parallel Processing). 共享存储型多处理机有两种模型 均匀存储器存取(Uniform-Memory-Access,简称UMA)模型 非均匀存储器存取(Nonuniform-

h.264并行解码算法2D-Wave实现(基于多核非共享内存系统)

在<Scalable Parallel Programming Applied to H.264/AVC Decoding>书中,作者基于双芯片18核的Cell BE系统实现了2D-Wave并行解码算法. Cell BE架构 首先来了解一下Cell BE.Cell BE全称为Cell Broadband Engine,是一种微处理器架构,Cell处理器由索尼.东芝.IBM共同研发,曾应用于PlayStation 3.Cell BE的架构如下图 一个Cell微处理器中共有9个核心,其中有1个PP

Linux性能及调优指南(翻译)之Linux内存架构

本文为IBM RedBook的Linux Performanceand Tuning Guidelines的1.2节的翻译原文地址:http://www.redbooks.ibm.com/redpapers/pdfs/redp4285.pdf原文作者:Eduardo Ciliendo, Takechika Kunimasa, Byron Braswell 译文如下: 1.2 Linux内存架构 为了执行一个进程,Linux内核为请求的进程分配一部分内存区域.该进程使用该内存区域作为其工作区并执行

Java并发编程里的volatile。Java内存模型核CPU内存架构的对应关系

CPU内存架构:https://www.jianshu.com/p/3d1eb589b48e Java内存模型:https://www.jianshu.com/p/27a9003c33f4 多线程下的缓存一致性问题:https://www.jianshu.com/p/97dc5242c3a6 java volatile关键字解惑:https://www.jianshu.com/p/195ae7c77afe Google-Java Memory Model:https://www.jianshu.

如何让IntPtr指向一块内存,以及托管内存与非托管内存的相互转化

IntPtr idp= IntPtr.Zero; StringBuilder idata = new StringBuilder("000000"); string idata ="000000"; 我这样建立的2个idata字符串,如何让idp指向他 我指向他的目的是为了传递给dll的某个函数,他需要传指针 还有我定义了一个结构如何向dll的函数传递其指针? 所有分了,解决一起结了 用GCHandle.Alloc(object obj)方法来给string分配一个

VB.NET 内存指针和非托管内存的应用

介绍 Visual Basic 从来不像在C或C++里一样灵活的操纵指针和原始内存.然而利用.NET框架中的structures 和 classes,可以做许多类似的事情.它们包括 IntPtr,   Marshal 以及 GCHandle. 这些structures(结构) 和classes(类) 允许你在托管和非托管环境中进行交互.本文中将向您展示如何使用这些structures 和 classes 去完成指针和内存的操作. 关于 IntPtr 结构 IntPtr  结构的行为像一个整型指针

备份概念(一致性、非一致性)

一致性备份(consistent backup)的含义是,备份所包含的各个文件中的所有修改都具备相同的系统变化编号(system change number,SCN).   也就是说,备份所包含的各个文件中的所有数据均来自同一时间点.与非一致性备份(inconsistent backup)不同,   使用一致性数据库完全备份(consistent whole database backup)进行复原(restore)后,不需要执行恢复操作(recovery).非一致性备份指,在数据库处于打开(o

何谓可分页和非分页内存

何谓可分页和非分页内存 1)默认情况下,内核加载器会加载所有的代码部分和全局数据到非分页内存中.而且,加载器是一次加载整个驱动的可执行文件,包括相关的DLL.加载后,内核加载器关闭驱动程序文件,甚至你可以删除当前正在执行的驱动文件. 但是,你可以告诉加载器你希望驱动的哪部分是可分页,所谓可分页,就是可能会被换页出内存(Page out).可以使用下面的指令来实现: #define ALLOC_PRAGMA #pragma alloc_text(PAGE, function_name1) #pra

jvm 堆内存及非堆内存配置

-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M-vmargs 说明后面是VM的参数,所以后面的其实都是JVM的参数了-Xms128m JVM初始分配的堆内存-Xmx512m JVM最大允许分配的堆内存,按需分配-XX:PermSize=64M JVM初始分配的非堆内存-XX:MaxPermSize=128M JVM最大允许分配的非堆内存,按需分配