我正在阅读有关NUMA(非统一内存访问)体系结构的信息。看起来这是多处理器系统上的硬件体系结构,每个内核访问其内部本地内存的速度都比远程内存快。
我不知道的是:看起来主内存(RAM)也在节点之间分配。这让我感到困惑,因为我认为所有节点(位于同一CPU内)对主内存的访问速度都相同。那么,Linux为什么要为每个节点分配主内存?
免责声明:两天前,我不知道NUMA是什么。在获得NUMA平台之后,我昨天必须学习所有这些内容。
我认为所有节点(位于同一CPU内)对主内存的访问速度都相同。那么,Linux为什么要为每个节点分配主内存?
对于您的问题的快速答案是,Linux会为每个节点分配主内存,因为每个节点都有自己的专用内存控制器,甚至对外部(主)内存也是如此。关于所有具有相同访问速度的节点的前提是错误的。
作为示例,我将使用具有128 GiB RAM的单个AMD Opteron 6386 SE系统。这个16核1处理器实际上由两个具有高速互连的独立芯片组成,可以被视为同一物理封装中的两个独立处理器。
从AMD在引人注目的BIOS中对我的体系结构的描述以及针对AMD系列15h型号00h-0Fh处理器的内核开发人员指南(BKDG)中,我们在第35页上看到,图2:
这说明,要使节点0中的内核能够使用连接到DDR通道C或D的RAM,它必须经过节点1中的北桥。
我的系统有8个16 GiB物理RAM内存,因此每个控制器(AD)都可以访问32 GiB。
由于我已在BIOS中启用了对透明NUMA的支持,因此linux认为我的计算机如下所示:
我从hwloc包使用lstopo 2命令生成了映像。
这里的层次结构很清楚:Linux知道我有两个节点,每个节点都可以对总共64 GiB的RAM进行本地访问(给定或取一个GiB或两个)。我们可以看到它如何进一步划分为共享一个L3缓存的每个节点,每个计算单元具有自己的L2和L1指令缓存以及每个核心具有专用的L1数据缓存。
内核知道这种布局很重要,因为对于在此CPU“左半部分”中运行的进程,要使用在“右半部分”中分配的内存,它必须跳过一些麻烦。该速度的范围可以足够快,以至于不会打扰或拖延一切,这取决于系统其余部分的繁忙程度。
我的服务器上有一个选项可以“禁用” NUMA,并将整个程序包视为具有16个内核和128 GiB RAM的一个CPU。据我了解,它是通过在节点之间交错存储地址来实现的,因此在一个节点中运行的进程将从节点0看到大约一半的内存,从节点1看到大约一半的内存。
首先,如果您的操作系统或工作负载不支持NUMA 3,则可能有必要。其次,实际上可能很难正确分配内存。如果您的工作负载具有大量的进程间通信,则并非总是能够找到最佳的布局。您还可能最终在一个节点上有一个进程,对与另一节点相连的硬件进行大量I / O。将RAM均匀地分布在节点上可确保至少一半的访问是本地的,这样您就不会遇到最坏的情况。
脚注:
1.英特尔将其称为8/16核,请参见此诉讼
。2.为了使它适合我使用了lstopo --no-io --no-legend --no-index=PU,core --gridsize 5 --no-attrs=cache --horiz
3.该体系结构来自2011年,可能用于替换旧硬件,同时保持相同的操作系统。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句