与此类似帖子,我想创建一个名为共享内存段(通过创建shm_open()+ mmap()特定的NUMA节点(不一定是本地)上的CentOS 7).该帖子建议通过使用来实现numa_move_pages().
我还有几个问题:
如果另一个进程(在不同NUMA的本地核心上运行)稍后启动并且mmap()s到同一个命名的共享内存段,OS是否会决定将命名的共享内存段移动到此进程的本地NUMA?如果是,我该如何预防呢?
是否还有其他情况,在我指定后,命名共享内存段将被移动到另一个NUMA numa_move_pages()?
给定一个命名的共享内存段/shm/dev,如何检查它属于哪个NUMA节点?
我查看了numactl,它的--membind选项是我想要的,但我不确定如果两个不同的进程使用--membind2个不同的节点会产生什么影响.谁赢?如果#3得到解答,我想我可以测试一下.
谢谢!
使用时mbind,可以为给定的映射内存段设置内存策略.
mbind在所有节点上交织段?如果在分配之后但在使用之前完成,则MPOL_INTERLEAVE在所有节点上都将执行我们期望的操作 - 将在所有节点上统一分配内存.
但是,如果段已经被写入并且被分配在例如节点0中,则无法告诉内核在所有NUMA节点上均匀地交织它.
该操作只是变为无操作,因为内核将其解释为" 请将此段放在这组节点上 ".由于我们传递了所有NUMA节点的集合,因此外部没有分配需要移动的内存.
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sched.h>
#include <sys/syscall.h>
#include <numaif.h>
#include <numa.h>
#define N ((1<<29) / sizeof(int))
#define PAGE_SIZE sysconf(_SC_PAGESIZE)
#define PAGE_MASK (~(PAGE_SIZE - 1))
void print_command(char *cmd) {
FILE *fp;
char buf[1024];
if ((fp = popen(cmd, "r")) == NULL) {
perror("popen");
exit(-1);
}
while(fgets(buf, sizeof(buf), fp) != NULL) {
printf("%s", buf);
}
if(pclose(fp)) {
perror("pclose"); …Run Code Online (Sandbox Code Playgroud) 我试图理解这是什么node distances意思numactl --hardware?
在我们的集群上,它输出以下内容
numactl --hardware
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 12 13 14 15 16 17
node 0 size: 32143 MB
node 0 free: 188 MB
node 1 cpus: 6 7 8 9 10 11 18 19 20 21 22 23
node 1 size: 32254 MB
node 1 free: 69 MB
node distances:
node 0 1
0: 10 21
1: 21 10
到目前为止,这是我的理解:
琐事
通常,当我想用 C++ 编写多线程程序时,我会询问硬件支持的并发线程数,如下所示:
unsigned int numThreads = std::thread::hardware_concurrency();
Run Code Online (Sandbox Code Playgroud)
这将返回支持的并发总数。因此,如果我们有 2 个 CPU,每个 CPU 都可以支持 12 个线程,numThreads则等于 24。
问题
最近我曾经numactl强制一个程序只在一个 CPU 上运行。
numactl -N 1 ./a.out
Run Code Online (Sandbox Code Playgroud)
问题是std::thread::hardware_concurrency()即使我使用numactl -N 1. 但是,在这种设置下,输出nproc为 12。
numactl -N 1 nproc --> output = 12
Run Code Online (Sandbox Code Playgroud)
题
也许std::thread::hardware_concurrency()不是为了支持这样的场景而设计的。那不是我关心的。我的问题是,什么是最好的做法来获得线程支持的数字时,我想我的运行与程序numactl。
更多信息
如果您还没有处理过numactl,它可以用于运行使用 NUMA 策略的进程。例如,您可以使用它来强制您的程序仅在一个 CPU 上运行。这种情况的用法如上所示。
我正在尝试Dockerfile基于https://hub.docker.com/_/mongo/上的官方回购创建内存中的MongoDB .
在dockerfile-entrypoint.sh我遇到过:
numa='numactl --interleave=all'
if $numa true &> /dev/null; then
set -- $numa "$@"
fi
Run Code Online (Sandbox Code Playgroud)
基本上它存在numactl --interleave=all于原始docker命令之前numactl.
但我真的不明白这个NUMA政策的事情.你能否解释一下NUMA的真正含义,以及它--interleave=all代表什么?
为什么我们需要使用它来创建MongoDB实例?
在最近的Linux版本中默认启用NUMA平衡器吗?如果是这样,我如何禁用NUMA平衡器请告诉我.