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

HCS*_*CSF 9 c linux shared-memory numactl

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

我还有几个问题:

  1. 如果另一个进程(在不同NUMA的本地核心上运行)稍后启动并且mmap()s到同一个命名的共享内存段,OS是否会决定将命名的共享内存段移动到此进程的本地NUMA?如果是,我该如何预防呢?

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

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

我查看了numactl,它的--membind选项是我想要的,但我不确定如果两个不同的进程使用--membind2个不同的节点会产生什么影响.谁赢?如果#3得到解答,我想我可以测试一下.

谢谢!

小智 2

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

第1点:

据我记得我的老师和这个链接所说的:NUMA 机器上的页面可以移动到最靠近调用最多的 CPU 的位置。换句话说:如果您的页面分配在存储体 0 上,但直接连接到存储体 1 的 CPU 使用频率更高,则您的页面将移动到存储体 1。

第3点:

给定一个命名的共享内存,我不知道如何获取调用的 numa 节点,但是给定一个位于该共享内存中的指针,您可以通过调用以下命令来获取其内存策略:get_mempolicy()

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

从这里的手册页get_mempolicy()