我正在阅读有关 NUMA(非均匀内存访问)架构的内容。看起来这是这样的硬件架构:在多处理器系统上,每个核心访问其内部本地内存的速度比访问远程内存的速度快。
我不知道的是:看起来主内存(RAM)也在节点之间划分。这让我很困惑,因为我认为所有节点(位于同一个 CPU 内)对主内存的访问速度都是相同的。那么Linux为什么要为每个节点划分主存呢?
答案1
免责声明:两天前我还不知道 NUMA 是什么。昨天在获得 NUMA 平台后我必须学习所有这些。
节点的访问速度不相同
我认为所有节点(位于同一个 CPU 内)对主内存的访问速度都相同。那么Linux为什么要为每个节点划分主存呢?
对你的问题的快速回答是,Linux 为每个节点划分主内存,因为每个节点都有自己专用的内存控制器,甚至是外部(主)内存。您关于所有节点具有相同访问速度的前提是错误的。
例子
作为示例,我将使用我的单曲AMD 皓龙 6386 SE具有 128 GiB RAM 的系统。这个 16 核1处理器实际上由两个独立的死了具有高速互连,并且可以被视为同一物理封装中的两个独立处理器。
AMD 文档
从AMD 的以朗朗上口的方式描述我的建筑适用于 AMD 系列 15h 型号 00h-0Fh 处理器的 BIOS 和内核开发人员指南 (BKDG) 第 35 页,图 2:
- 一包裹(物理上,这是你安装在插座中的)
- …包含两个节点(一个节点等于一个单独的死)
- A节点包含四个计算单元
- A计算单元有两个整数核心并共享 FPU 和 L2 缓存。
- 每个节点有它自己的北桥
- 每个北桥有两个DDR内存通道
这说明,节点 0 中的内核要使用连接到 DDR 通道 C 或 D 的 RAM,必须通过节点 1 中的北桥。
我的系统有八个 16 GiB 物理 RAM 棒,因此每个控制器 (AD) 都可以访问 32 GiB。
它在 Linux 中的样子
由于我在 BIOS 中启用了对透明 NUMA 的支持,linux 认为我的计算机如下所示:
我使用生成图像伊斯托波2命令来自硬件锁包。
这里的层次结构很清楚:Linux 知道我有两个节点,每个人都可以本地访问总共 64 GiB 的 RAM(给予或减少一两个 GiB)。我们可以看到它是如何进一步划分为每个节点共享一个 L3 缓存的,每个节点计算单元拥有自己的 L2 和 L1 指令缓存,并且每个指令缓存核具有专用的 L1 数据缓存。
内核了解这种布局非常重要,因为对于运行在该 CPU“左半部分”的进程来说,要使用分配在“右半部分”的内存,它必须跳过一些环节。这个速度的范围可以是足够快,不至于打扰或阻碍一切,这一切都取决于系统其余部分的繁忙程度。
如何可以查看 Linux - 节点交错
我的服务器上有一个选项可以“禁用”NUMA,并将整个软件包视为一个具有 16 核和 128 GiB RAM 的 CPU。据我了解,它是通过在节点之间交错内存地址来实现这一点的,这样在一个节点中运行的进程将看到大约一半来自节点 0 的内存和一半来自节点 1 的内存。
首先,如果您的操作系统或工作负载不支持 NUMA 3 ,这可能是必要的。其次,正确分配内存实际上很困难。如果您的工作负载有大量进程间通信,则并不总是能够找到最佳布局。您还可能最终在一个节点上有一个进程对连接到另一节点的硬件执行大量 I/O。将 RAM 均匀分布在节点上可确保至少一半的访问是本地的,这样您就不会遇到最坏的情况。
脚注:
1. Intel 将其称为 8/16 核,请参见这起诉讼
2. 为了使其适合,我使用了lstopo --no-io --no-legend --no-index=PU,core --gridsize 5 --no-attrs=cache --horiz
3. 该架构来自 2011 年,可能用于替换旧硬件,同时保持相同的操作系统。