在特定的NUMA节点上创建命名共享内存?

时间:2018-08-05 08:57:05

标签: c linux shared-memory numactl

类似于此post,我想在特定的NUMA节点(不一定是本地)上创建一个命名的共享内存段(通过CentOS 7上的shm_open() + mmap()创建) 。该帖子建议使用numa_move_pages()来实现。

我还有几个问题:

  1. 如果稍后启动另一个进程(在另一个NUMA本地的核心上运行)并且mmap()到相同的命名共享内存段,则操作系统将决定将命名共享内存段移动到NUMA。这个过程本地化?如果是,该如何预防呢?

  2. 在通过numa_move_pages()指定后,是否还有其他情况会将命名的共享内存段移动到另一个NUMA?

  3. 给定/shm/dev中的一个命名共享内存段,如何检查它属于哪个NUMA节点?

我调查了numactl,它的--membind选项接近我想要的,但是我不确定如果两个不同的进程对两个不同的节点使用--membind会产生什么影响。谁赢?我想我可以测试一下是否回答#3。

谢谢!

1 个答案:

答案 0 :(得分:0)

我只想回答第1点和第3点。

要点1:

据我的老师们回忆,link所说的话:NUMA计算机上的页面可以移动到最靠近调用最多的CPU的位置。换句话说:如果您的页面分配在bank 0上,但是直接连接到bank 1的CPU使用它的频率更高,那么您的页面将移到bank 1上。

要点3:

给定一个命名的共享内存,我不知道如何获取调用的numa节点,但是给定该共享内存中的指针,则可以通过调用get_mempolicy()

来获取其内存策略。
  

如果标志指定MPOL_F_ADDR,则返回有关管理addr中给定的内存地址的策略的信息。如果已使用mbind(2)或numa(3)中描述的一个辅助函数之一来为包含addr的内存范围建立策略,则此策略可能与进程的默认策略不同。

来自get_mempolicy() here的手册页