一、介绍
numactl命令用于在NUMA架构下进行系统拓扑结构的查看,进程NUMA策略的设定。numactl通过一个指定的numa调度策略或者内存分配策略来控制应用程序的行为,对程序的设置将会被所有的子进程锁继承。numactl也可以控制共享内存段或者文件。
numactl使用的所有nodes参数可以以N或者N,N或者N-N或者+N的任意组合形式来表示,其中+N表示在当前默认的cpuset的基础上增加的偏移,同时也支持使用!作为取反操作。
所有使用nodes参数的位置都可以替换为如下值:
netdev:mydev node指定为网络设备mydev所在的node
file:PATH node指定为路径块设备对应的node
ip:HOST host网络设备所在的node
block:PATH 指定路径块设备所在的node
pci:[seg:]bus:dev[:func]:PCI设备所在的node
二、参数
--hardware,-H:用于显示系统上所有nodes的列表,包括每个node拥有的cpu,内存总量,空闲内存,以及node之间拓扑结构的相对距离distance
--show,-s:显示了当前系统下numa的设置
--all,-a:取消所有的cpuset设置,这样就可以使用policy的所有可用CPUs/nodes
--interleave=nodes, -i nodes:交织内存分配策略。应用程序使用的内存将会在指定的nodes节点上交织分配,如果某个node节点上不能够分配内存,将会使用其他节点的内存。
例如我们指定一个测试程序t在node0和node8上交织分配内存
numactl --interleave 0,8 ./t
通过numastat命令查看进程t在node上内存的使用情况能够看到t使用的内存被平均分配到了两个node上
--membind=nodes, -m nodes:指定进程只在指定的node上分配内存,如果指定节点上的node内存不够则会出现分配失败的错误
例如我们指定进程t在node0上分配内存
numactl -m 0 ./t
通过numastat能够看到进程t使用的内存都分布在node0上
--cpunodebind=nodes,-N nodes:在指定的node上运行程序
例如当前系统中有两个node,分别是node0和node8,有一个简单的测试程序t,执行
numactl -N 0 ./t
通过top查看进程t运行的cpu,能够看到t运行在cpu2上,属于node0的cpu
numactl -N 8 ./t
通过top查看进程t运行的cpu,能够看到t运行在cpu85上,属于node8的cpu
--physcpubind=cpus,-C cpus:指定当前进程能够运行的cpu列表,可以指定单个CPU,也可以指定一个CPU集合。例如
指定进程t运行在cpu12上
numactl -C 12 ./t
指定进程运行在11-14这些cpu上
numactl -C 11-14 ./t
指定进程t只能运行在8,12-14这些cpu上
numactl -C 8.12-14 ./t
指定进程t不允许运行在0-126号cpu上,由于我们当前的系统只有0-127的cpu,所以这意味着t要运行在cpu127上
numactl -C !0-126 ./t
--localalloc,-l:只允许进程在运行进程所在的node上分配内存
例如我们通过-l参数运行进程t
numactl -l ./t
通过top命令查看进程t运行在cpu64上,通过numastat查看进程t分配的内存,能够看到进程t分配的内存在node8上。
--preferred=node:内存分配偏向的node,但是一旦该node的内存分配失败,可以使用其他node上的内存
三、使用方式
下面是一些使用的实例
numactl --physcpubind=+0-4,8-12 进程允许运行在当前cpuset的0-4,8-12这些cpu上
numactl --interleave=all bigdatabase 运行big database,它使用的内存交织分配在所有node上
numactl --cpunodebind=1 --membind=0,1 process 进程运行在node1上,内存可以分配在node0和node1上
numactl --cpunodebind=0,--membind=0,1, -- process -l 和上面的类似,但是因为添加了-l参数,造成了冲突,所以这条指令无法执行
numactl --cpunodebind=netdev:eth0 --membind=netdev:eth0 network-server 运行network-server在网络设备eth0所在的node上,同时内存也分配在该node上
在/dev/shm中创建一个A文件,此文件的一半内存分配在node2上,一半内存分配在node3上
numactl --membind=2 dd if=/dev/zero of=/dev/shm/A bs=1M count=1024
numactl --membind=3 dd if=/dev/zero of=/dev/shm/A seek=1024 bs=1M count=1024