与此post类似,我想在特定的NUMA节点(不一定是本地)上创建一个命名的共享内存段(通过CentOS 7上的shm_open()
+ mmap()
创建)。该帖子建议通过使用numa_move_pages()
来实现。
我还有几个问题:
mmap()
s到同一个命名的共享内存段,OS是否会决定将命名的共享内存段移动到此进程的本地NUMA?如果是,我该如何预防呢?numa_move_pages()
指定后,是否还有其他情况会将命名的共享内存段移动到另一个NUMA?/shm/dev
中的命名共享内存段,如何检查它属于哪个NUMA节点?我查看了numactl
,它的--membind
选项是我想要的,但我不确定如果两个不同的进程使用--membind
到2个不同的节点会有什么影响。谁赢?如果#3得到解答,我想我可以测试一下。
谢谢!
我只回答第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的手册页