Language agnostic 如何使程序NUMA就绪?
我的程序使用共享内存作为数据存储。此数据必须可用于任何运行的应用程序,并且获取此数据必须快速。但是,有些应用程序可以在不同的NUMA节点上运行,对它们的数据访问非常昂贵。是否每个NUMA节点的数据复制都是实现这一点的唯一方法?有两个主要的减速源可归因于NUMA。首先是远程访问延迟增加,这可能因平台而异。在我使用的平台上,延迟命中率约为30% 性能损失的另一个来源可能来自NUMA节点之间通信链路和控制器的争用 Linux的默认分配方案是在创建数据的节点上分配数据。如果应用程序中的大多数数据由单个线程初始化,那么它将为该内存节点生成大量跨NUMA域流量和争用 如果您的数据是只读的,那么复制是一个很好的解决方案 否则,在所有节点之间交错数据分配将在所有节点之间分配请求,并将有助于缓解拥塞Language agnostic 如何使程序NUMA就绪?,language-agnostic,numa,Language Agnostic,Numa,我的程序使用共享内存作为数据存储。此数据必须可用于任何运行的应用程序,并且获取此数据必须快速。但是,有些应用程序可以在不同的NUMA节点上运行,对它们的数据访问非常昂贵。是否每个NUMA节点的数据复制都是实现这一点的唯一方法?有两个主要的减速源可归因于NUMA。首先是远程访问延迟增加,这可能因平台而异。在我使用的平台上,延迟命中率约为30% 性能损失的另一个来源可能来自NUMA节点之间通信链路和控制器的争用 Linux的默认分配方案是在创建数据的节点上分配数据。如果应用程序中的大多数数据由单个线
要交错数据,可以使用
set_mempolicy()
fromnumaif.h
,如果您使用的是Linux。这很大程度上取决于您的程序如何(以什么顺序)访问数据,以及它如何写入数据内存访问模式是绝对不可预测的,因此,如何使程序NUMA就绪是“绝对不可预测的”。您可以像在SMP上一样启动程序,如果它的内存访问模式不好,它将运行缓慢。(Numa允许以比本地内存更高的成本访问其他节点的内存)