【问题标题】:How to make program NUMA ready?如何使程序 NUMA 准备好?
【发布时间】:2011-10-20 19:11:31
【问题描述】:

我的程序使用共享内存作为数据存储。该数据必须可供任何正在运行的应用程序使用,并且必须快速获取该数据。但有些应用程序可以在不同的 NUMA 节点上运行,它们的数据访问成本非常高。每个 NUMA 节点的数据复制是唯一的方法吗?

【问题讨论】:

  • 这很大程度上取决于你的程序如何(以什么顺序)访问数据,以及它是如何写入数据的
  • 内存访问模式是绝对不可预测的
  • 因此,如何使程序准备好 NUMA 是“绝对不可预测的”。您可以像在 SMP 上一样启动程序,如果它的内存访问模式不好,它将运行缓慢。 (Numa 允许以比本地内存更高的成本访问其他节点的内存)

标签: language-agnostic numa


【解决方案1】:

有两个主要的减速原因可归因于 NUMA。首先是远程访问的延迟增加,这可能因平台而异。在我使用的平台上,延迟大约有 30%。

性能损失的另一个来源可能来自 NUMA 节点之间的通信链路和控制器争用。

Linux 的默认分配方案是在创建数据的节点上分配数据。如果应用程序中的大部分数据是由单个线程初始化的,那么它将产生大量跨 NUMA 域的流量和对那个内存节点的争用。

如果您的数据是只读的,那么复制是一个很好的解决方案。

否则,在所有节点之间交错分配数据将在所有节点之间分配请求,并有助于缓解拥塞。

要交错数据,如果您使用的是 Linux,则可以使用 numaif.h 中的 set_mempolicy()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-21
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2018-10-24
    • 1970-01-01
    • 2016-11-23
    相关资源
    最近更新 更多