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

问题描述 投票:8回答:1

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

我还有几个问题:

  1. 如果另一个进程(在不同NUMA的本地核心上运行)稍后启动并且mmap()s到同一个命名的共享内存段,OS是否会决定将命名的共享内存段移动到此进程的本地NUMA?如果是,我该如何预防呢?
  2. 在通过numa_move_pages()指定后,是否还有其他情况会将命名的共享内存段移动到另一个NUMA?
  3. 给定/shm/dev中的命名共享内存段,如何检查它属于哪个NUMA节点?

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

谢谢!

c linux shared-memory numactl
1个回答
0
投票

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

第1点:

据我记得我的老师以及这个link所说的内容:NUMA机器上的页面可以移动到最接近最大呼叫CPU的位置。换句话说:如果您的页面在银行0上分配,但直接连接到银行1的CPU正在更频繁地使用它,那么您的页面将被移动到银行1。

第3点:

给定一个命名的共享内存我不知道你是如何得到调用numa节点的,但是如果在这个共享内存中有一个指针,你可以通过调用它来获取它的内存策略:get_mempolicy()

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

来自get_mempolicy() here的手册页

© www.soinside.com 2019 - 2024. All rights reserved.