问题标签 [numactl]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - 来自不同进程的 set_mempolicy
对于 NUMA 机器,Linux 提供
set_mempolicy
系统调用,允许进程定义其首选 NUMA 节点以进行内存分配。
是否有一些类似的功能可以更改另一个正在运行的进程的内存策略?那么像这样set_mempolicy(pid, ...)
的东西pid
对应于不同的运行过程?
请注意,另一个进程(我想更改其内存策略的那个)已经在运行,我无法控制它。所以像这样的解决方案:
不是我要找的。
python - pysys startProcess 与 numactl
numactl 是一个可以设置处理器亲和性的进程。它将固定到 cpu 的过程作为参数:
我可以使用 pysys startProcess 命令成功运行我的进程:
但是,根据 ps -ef [PID],以下内容会导致 Python 进程失效。
关于如何使用 startProcess() 调用进程 (numactl) 的任何想法:
- 本身有参数(-physcpubind 0)
- 所述参数之一是另一个进程(processA),它本身具有参数(argsA)
TIA
java - 如何研究 NUMA 在 Java 算法中的影响
我正在研究 Java 中的一些代码(SOR 算法和 LU 分解)。主要目标是研究在 NUMA 感知架构中执行此类算法的影响。我已经找到了一些工具,例如numactl和其他关联环境变量。例如:GOMP_CPU_AFFINITY (GCC)和KMP_AFFINITY (ICC)使用 C 中的相同算法将线程固定到内核。但是我不知道在 Java 中研究 NUMA 有什么替代方法。对于 Java,我只使用numactl并使用--interleave=all标志来提高性能,但我并不能真正控制 JVM 级别中发生的事情。
我发现了另一个名为numastat的工具,它应该测量 NUMA 架构中的“NUMA 计数器”,并且知道 NUMA 节点中的“命中”(numa_hit)和“未命中”(numa_miss)的分配。但是我不确定如何使用它来测量我的 Java 应用程序中的计数器。为了研究 NUMA 在 Java 应用程序中的影响,我应该执行什么样的测试(和编程技术)?
谢谢你的帮助。
numa - 如何重置 numastat 统计信息?(除了重启)
运行命令numastat
查看命中、未命中、外部等时。计数器在运行一些测试时不断增加。
我可以在两个测试之间进行区分以获取该测试的统计信息,但是除了重新启动机器之外,有没有办法将它们重置为 0?
man
或者--help
显然不为此提供信息。
linux - 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,每个节点都有 32Gb 的 DRAM。
- 在
numa
集群上,我们必须“跳”到下一个集群才能访问其他节点上的内存,这会导致更高的延迟。 - 在这种情况下,数字
10
是否21
表示“跳数”的延迟?我如何找到延迟ns
?是在某处指定的吗?
编辑:这个链接说距离不在ns
,而是相对距离。如何获得 ns 中的绝对延迟?
任何帮助将不胜感激。
c - 在特定 NUMA 节点上创建命名共享内存?
与这篇文章类似,我想在特定的 NUMA 节点(不一定是本地的)上创建一个命名的共享内存段(在 CentOS 7 上通过shm_open()
+创建)。mmap()
该帖子建议使用numa_move_pages()
.
我还有几个问题:
如果另一个进程(在不同 NUMA 本地的核心上运行)稍后启动并
mmap()
s 到同一个命名的共享内存段,操作系统会决定将命名的共享内存段移动到该进程本地的 NUMA 吗?如果是,我该如何预防?在我指定 through 之后,是否还有其他情况将命名的共享内存段移动到另一个 NUMA
numa_move_pages()
?给定一个命名的共享内存段
/shm/dev
,我如何检查它属于哪个 NUMA 节点?
我查看了numactl
,它的--membind
选项与我想要的很接近,但我不确定如果两个不同的进程用于--membind
2 个不同的节点会产生什么影响。谁赢?我想如果#3得到回答,我可以测试一下。
谢谢!
c - numaif.h:MPOL_LOCAL 未声明用于 mbind
根据mbind man page
,一种可能mode
是MPOL_LOCAL
,它将内存区域放置在触发分配的 CPU 的同一节点中:
但是,符号根本没有定义。
更改为 egMPOL_INTERLEAVE
使其编译和显示Hello world!
就好了。
这里发生了什么?在这个阶段,我 100% 感到困惑。
我试过gcc
/ g++
4.9.2、5 和 8;在运行内核的三台不同的机器中4.17.12+
(不知道它来自哪里),4.18.10
(我自己编译)和4.15.0
(包含在最新的 Linux Mint 中)。libnuma-dev
已是最新。
linux - mbind:如何在所有节点上统一交错现有段?
使用mbind
,可以为给定的映射内存段设置内存策略。
问:我如何知道mbind
在所有节点上交错一个段?
如果在分配之后但在使用之前完成,那么MPOL_INTERLEAVE
在所有节点上都会按照我们的预期进行——内存将在所有节点上统一分配。
但是,如果该段已经被写入并分配在例如节点 0 中,则无法告诉内核在所有 NUMA 节点上统一交错。
该操作简单地变为无操作,因为内核将其解释为“请将此段放在这组节点上”。由于我们正在传递所有 NUMA 节点的集合,因此没有在外部分配需要移动的内存。
最小、完整和可验证的示例
gcc -o interleave_all interleave_all.c -lnuma && sudo ./interleave_all
使用产量编译和运行:
linux - numactl 和 move_pages 不匹配
根据这个问题,我开发了一个简单的程序来测试页面在哪个 NUMA 节点中。
问题是,将我的程序结果与numactl -H
Xeon E5-2698 v4(两个 NUMA 节点)进行比较显示不同的输出。numactl -H
显示(裁剪):
因此,例如,numactl
说 cpu 20 位于节点 1。我有以下代码:
我正在aligned_alloc
尝试仅分配一个对齐的页面,以便当该线程“触摸”此页面时,它将被映射到该线程所在的 NUMA 节点(第一次触摸策略)。然后我使用mlock
,你可以在这个问题中检查。我想我正在使用第一次触摸,因为我没有修改任何与此相关的内容,但是,我不知道如何检查以确保。
我正在用,和
编译icc -fopenmp -lnuma
和运行它。我正在使用这种亲和力,因为我认为它执行与 numactl 看到系统相同的分配。这输出:KMP_AFFINITY=granularity=fine,compact
OMP_NUM_THREADS=80
numactl -m 0,1 ./numa
所以,这个程序说线程 20 在节点 0,但numactl
说线程 20 在节点 1。为什么?我期待在两者上看到相同的输出。
c++ - 如何避免 numa 架构中的远程内存分配?
我有一台 numa 机器,有两个节点,每个节点有 8 个内核和 64G 内存,并且有两个服务:service-1 和 service-2,service-1 部署在 node-0 中,service-2 部署在 node-1 中。
我只是想让这两个服务分开运行,所以我启动服务如下:
在服务代码中,我使用 pthread_setaffinity_np 将线程绑定到相应节点的 cpus(绑定 service-1 到 cpu[0,2,4,6,8,10,12,14,16,18,20,22,24,26, 28,30]);
我期望的是linux系统在node-1上为service-2分配内存,除了service-2主要访问node-1内存和node-0上的一些动态库页面。但遗憾的是我发现 service-2 在远程节点(node-0)上有很多内存,访问它花费太多时间。
所以这是我的问题:
1、linux系统真的会为service-2分配远程内存(node-0)吗,不管service-2已经被membind命令绑定到node-1了吗?
2、这是否与kernel.numa_balancing相关联,我的机器中的值为 1?在我看来,在 kernel.numa_balancing = 1 的情况下,linux 只会将任务迁移到最近的内存或将内存移动到执行任务的最近节点。既然 service-2 已经绑定到 node-1,就不会发生平衡了吗?
3、谁能解释一下这个远程分配是怎么发生的?有什么方法可以避免这种情况吗?
非常感谢 !