我的程序使用共享内存作为数据存储。此数据必须可供任何正在运行的应用程序使用,并且必须快速获取此数据。但是一些应用程序可以在不同的NUMA节点上运行,并且对它们的数据访问非常昂贵。每个NUMA节点的数据重复是否是执行此操作的唯一方法?
答案 0 :(得分:5)
有两个主要的减速来源可归因于NUMA。首先是远程访问的延迟增加,这可能因平台而异。在我使用的平台上,延迟命中率约为30%。
性能损失的另一个来源可能来自NUMA节点之间通信链路和控制器的争用。
Linux的默认分配方案是在创建它的节点上分配数据。如果应用程序中的大多数数据由单个线程初始化,那么它将生成大量交叉NUMA域流量并争用该一个内存节点。
如果您的数据是只读的,那么复制是一个很好的解决方案。
否则,跨所有节点交错数据分配将在所有节点之间分配请求,并有助于缓解拥塞。
要交错数据,如果您使用的是Linux,则可以使用set_mempolicy()
中的numaif.h
。