如何使程序支持NUMA?

4

我的程序使用共享内存作为数据存储。这些数据必须对运行的任何应用程序都可用,并且获取这些数据必须很快。但是,一些应用程序可以在不同的NUMA节点上运行,它们的数据访问非常昂贵。难道为每个NUMA节点复制数据是唯一的方法吗?


1
这非常取决于程序访问数据的顺序以及它如何进行写入。 - osgx
1
内存访问模式是完全不可预测的。 - Evgeny Lazin
1
因此,使程序能够支持NUMA架构是“绝对不可预测的”。你可以像在SMP上一样启动程序,如果它访问内存的模式不好,它将运行缓慢。(NUMA允许访问其他节点的内存,但成本比访问本地内存高) - osgx
1个回答

5
有两种主要的减速来源可以归因于NUMA。第一个是远程访问的延迟增加,这取决于平台而有所不同。对于我所使用的平台,延迟会增加约30%。
性能损失的另一个来源可能来自于NUMA节点之间通信链接和控制器的争用。
Linux的默认分配方案是将数据分配到创建该数据的节点上。如果应用程序中大部分数据是由单个线程初始化的,则会产生大量跨NUMA域流量和对那个内存节点的争用。
如果您的数据是只读的,则复制是一个好的解决方案。
否则,将数据分配交错到所有节点上将会在所有节点之间分发请求并有助于缓解拥塞。
要交错数据,如果您正在使用Linux,则可以使用中的set_mempolicy()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接