标签: numactl

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

与此类似帖子,我想创建一个名为共享内存段(通过创建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得到解答,我想我可以测试一下.

谢谢!

c linux shared-memory numactl

9
推荐指数
1
解决办法
328
查看次数

mbind:如何在所有节点上统一交织现有的段?

使用时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)

linux memory linux-kernel numa numactl

7
推荐指数
0
解决办法
133
查看次数

numactl 中的节点距离是什么意思?

我试图理解这是什么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 到目前为止,这是我的理解:

  • 我们有 24 个虚拟 CPU,每个节点有 …

linux numa numactl

6
推荐指数
1
解决办法
3858
查看次数

C++中的最大线程数

琐事

通常,当我想用​​ 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 上运行。这种情况的用法如上所示。

c++ multithreading c++11 numactl

6
推荐指数
1
解决办法
3519
查看次数

Docker中的Mongodb:numactl --interleave =所有解释

我正在尝试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实例?

numa mongodb docker numactl

4
推荐指数
1
解决办法
5767
查看次数

Linux中的Numa平衡器

在最近的Linux版本中默认启用NUMA平衡器吗?如果是这样,我如何禁用NUMA平衡器请告诉我.

linux linux-kernel numa numactl

2
推荐指数
1
解决办法
6873
查看次数