Linux的NUMA架构也共享主存储器吗?

q

我正在阅读有关NUMA(非统一内存访问)体系结构的信息。看起来这是多处理器系统上的硬件体系结构,每个内核访问其内部本地内存的速度都比远程内存快。

我不知道的是:看起来主内存(RAM)也在节点之间分配。这让我感到困惑,因为我认为所有节点(位于同一CPU内)对主内存的访问速度都相同。那么,Linux为什么要为每个节点分配主内存?

管道

免责声明:两天前,我不知道NUMA是什么。在获得NUMA平台之后,我昨天必须学习所有这些内容。

节点的访问速度不同

我认为所有节点(位于同一CPU内)对主内存的访问速度都相同。那么,Linux为什么要为每个节点分配主内存?

对于您的问题的快速答案是,Linux会为每个节点分配主内存,因为每个节点都有自己的专用内存控制器,甚至对外部(主)内存也是如此。关于所有具有相同访问速度的节点的前提是错误的。

例子

作为示例,我将使用具有128 GiB RAM的单个AMD Opteron 6386 SE系统。这个16核1处理器实际上由两个具有高速互连的独立芯片组成,可以被视为同一物理封装中的两个独立处理器。

AMD说明文件

AMD在引人注目的BIOS中对我的体系结构描述以及针对AMD系列15h型号00h-0Fh处理器的内核开发人员指南(BKDG)中,我们在第35页上看到,图2:

双节点处理器

  • 一个(物理的,这是您安装在插槽中的包)
  • …包含两个节点(一个节点等于一个单独的管芯
  • 一个节点包含四个计算单元
  • 计算单元有两个整数芯与股票的FPU和L2高速缓存。
  • 每个节点都有自己的北桥
  • 每个北桥都有两个DDR内存通道

这说明,要使节点0中的内核能够使用连接到DDR通道C或D的RAM,它必须经过节点1中的北桥。

我的系统有8个16 GiB物理RAM内存,因此每个控制器(AD)都可以访问32 GiB。

在Linux中的外观

由于我已在BIOS中启用了对透明NUMA的支持,因此linux认为我的计算机如下所示:

lstopo的拓扑

hwloc包使用lstopo 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.英特尔将其称为8/16核,请参见此诉讼
。2.为了使它适合我使用了lstopo --no-io --no-legend --no-index=PU,core --gridsize 5 --no-attrs=cache --horiz
3.该体系结构来自2011年,可能用于替换旧硬件,同时保持相同的操作系统。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

了解heisenbug示例:寄存器与主存储器的精度不同

来自分类Dev

易失性可变和冲洗到/从主存储器读出

来自分类Dev

Java,仅在同步块中的变量或所有实例变量中发生与主存储器的同步?

来自分类Dev

为什么从硬盘上获取信息要比从主存储器上花费更多的时间?

来自分类Dev

突发模式DMA如何加速主存储器和I / O设备之间的数据传输?

来自分类Dev

Python-如何在不将所有数据同时存储在主存储器中的情况下存储文本文件中的数据?

来自分类Dev

可执行文件中的程序计数器与主存储器中的程序计数器之间的差异

来自分类Dev

由于寄存器或缓存中的值从未被写回主存储器,此C#代码能否失败?

来自分类Dev

如何生成十六进制值以转储到将与模拟缓存一起使用的Java模拟主存储器中?

来自分类Dev

为什么计算机将数据和指令从主存储器传输到块中的高速缓存中,这意味着单个高速缓存未命中可能会覆盖很多

来自分类Dev

分段错误正如读者试图从共享存储器读

来自分类Dev

读取存储器会发生分段错误吗?

来自分类Dev

了解shmat及其对过程存储器的附加吗?

来自分类Dev

VirtIO存储器支持丢弃(fstrim)吗?

来自分类Dev

如何在Linux上检查USB存储器

来自分类Dev

真的可以在OoOE处理器中对存储器进行重新排序吗?

来自分类Dev

真的可以在OoOE处理器中对存储器进行重新排序吗?

来自分类Dev

与PCIe基址寄存器相关的32位Linux虚拟存储器如何构造

来自分类Dev

可以在没有“ allot”的情况下使用字典存储器吗?

来自分类Dev

我应该在Android App的内部存储器中删除文件吗?

来自分类Dev

我应该在助焊剂存储器中过滤吗?

来自分类Dev

使存储器可读,可写和可执行会受到性能影响吗?

来自分类Dev

python可以执行字符串操作而不复制字符串存储器吗

来自分类Dev

写存储器错误可以证明可能是电气故障吗?

来自分类Dev

使存储器可读,可写和可执行会受到性能影响吗?

来自分类Dev

如何在Windows / Linux的X64确定最后时间的存储器页面被访问?

来自分类Dev

堆栈存储器如何组织?

来自分类Dev

C存储器地址中的If语句

来自分类Dev

PHP短期密码存储器

Related 相关文章

  1. 1

    了解heisenbug示例:寄存器与主存储器的精度不同

  2. 2

    易失性可变和冲洗到/从主存储器读出

  3. 3

    Java,仅在同步块中的变量或所有实例变量中发生与主存储器的同步?

  4. 4

    为什么从硬盘上获取信息要比从主存储器上花费更多的时间?

  5. 5

    突发模式DMA如何加速主存储器和I / O设备之间的数据传输?

  6. 6

    Python-如何在不将所有数据同时存储在主存储器中的情况下存储文本文件中的数据?

  7. 7

    可执行文件中的程序计数器与主存储器中的程序计数器之间的差异

  8. 8

    由于寄存器或缓存中的值从未被写回主存储器,此C#代码能否失败?

  9. 9

    如何生成十六进制值以转储到将与模拟缓存一起使用的Java模拟主存储器中?

  10. 10

    为什么计算机将数据和指令从主存储器传输到块中的高速缓存中,这意味着单个高速缓存未命中可能会覆盖很多

  11. 11

    分段错误正如读者试图从共享存储器读

  12. 12

    读取存储器会发生分段错误吗?

  13. 13

    了解shmat及其对过程存储器的附加吗?

  14. 14

    VirtIO存储器支持丢弃(fstrim)吗?

  15. 15

    如何在Linux上检查USB存储器

  16. 16

    真的可以在OoOE处理器中对存储器进行重新排序吗?

  17. 17

    真的可以在OoOE处理器中对存储器进行重新排序吗?

  18. 18

    与PCIe基址寄存器相关的32位Linux虚拟存储器如何构造

  19. 19

    可以在没有“ allot”的情况下使用字典存储器吗?

  20. 20

    我应该在Android App的内部存储器中删除文件吗?

  21. 21

    我应该在助焊剂存储器中过滤吗?

  22. 22

    使存储器可读,可写和可执行会受到性能影响吗?

  23. 23

    python可以执行字符串操作而不复制字符串存储器吗

  24. 24

    写存储器错误可以证明可能是电气故障吗?

  25. 25

    使存储器可读,可写和可执行会受到性能影响吗?

  26. 26

    如何在Windows / Linux的X64确定最后时间的存储器页面被访问?

  27. 27

    堆栈存储器如何组织?

  28. 28

    C存储器地址中的If语句

  29. 29

    PHP短期密码存储器

热门标签

归档