Name
numactl - Control NUMA policy for processes or shared memory
numactl -用于控制进程与共享存储的NUMA技术机制
NUMA -- (Non Uniform Memory Access Architecture)非统一内存访问架构
Synopsis
概述
numactl [--interleave nodes] [- -preferred node] [--membind nodes]
[--cpunodebind nodes] [--physcpubind cpus] [--localalloc] [--] {arguments ...}
numactl --show
numactl --hardware
numactl [--huge ] [--offset offset] [--shmmode shmmode] [--length length] [--strict]
[--shmid id] --shm shmkeyfile | --file tmpfsfile
[--touch] [--dump] [ --dump-nodes] memory policy
Description
使用方法介绍
numactl runs processes with a specific NUMA scheduling or memory placement policy.
使用numactl命令启动的进程会按照特定的NUMA调度机制或是在指定的内存空间位置上运行.
The policy is set for command and inherited by all of its children .
让进程按照NUMA调度机制运行是通过命令行来实现的,而被设定进程得子进程也会遵照NUMA调度机制运行.
In addition it can set persistent policy for shared memory segments or files.
除了将NUMA调度机制设置在进程上之外,还可通过将该NUMA调度机制作用在共享内存段或是文件对象上来实现NUMA策略的持久化.
/也就是把可持久化的对象(内存空间或是文件实体)设定成符合NUMA调度机制的实体,这样运行在该块空间上的所有数据的调度都可以按照NUMA策略来执行
Use
-- before command if using command options that could be confused with numactl options.
numactl命令的使用方法
--在使用该命令之前,如果不了解每个命令选项的确切含义的话,只会是使用命令使 者徒增麻烦
Policy settings are :
关于numactl命令的不同选项解释如下
--interleave=nodes, -i nodes
Set a memory interleave policy. Memory will be allocated using round robin on nodes.
这个选项用于设定内存的交织分配模式。也就是说系统在为多个节点分配内存空间的时候,将会以轮询分发的方式被分配给这多个节点.
When memory cannot be allocated on the current interleave target fall back to other nodes.
如果在当前众多的交织分配内存节点中的目标节点无法正确的分配内存空间的话,内存空间将会由其他的节点来分配。
Multiple nodes may specified on --interleave, --membind and --cpunodebind.
多节点可以通过--interleave , --membind和--cpunodebind命令来指定.
You may specify "all" , which means all nodes in the current cpuset. nodes may be specified as N,N,N or NN or N, NN or NN , NN and so forth.
也可以通过使用'all'这个选项, 'all'选项是用来选定在当前运行的cpu集合中的所有节点.节点可以通过N,N,N或是NN或是N,NN或者是NN , NN诸如此类的
方式来指定
/其中N,N,N --> node1,node2,node0可以看做是将numa调度机制施加到node1, node2, node3的上面
/而NN or N ---> node1-node7, node12可以看做是将numa机制施加到[node1,node7]和单独的node12节点上面,
/后面的NN等等都是在此基础上演变而来的
Relative nodes may be specified as +N,N,N or +NN or + N,NN and so forth.
如果节点之间具有相关性的话,是可以通过+N,N,N或者是+NN或者是+N,NN这种设定方式来表明这些节点之间是有相关性的.
The +indicates that the node numbers are relative to the process' set of allowed cpu in its current cpuset .
上面命令中使用'+'符号作为修饰的节点与被准许留在在当前cpu集合中的cpu上所运行的进程是一一对应的.
A !NN notation indicates the inverse of NN , in other words all nodes except NN.
!NN这种表述方式表明的是NN含义的翻转,也就是说,某个命令将会被施加在除了NN这一区间内的节点以外的所有节 集上面
If used with + notation , specify !+NN .
如果在使用'!'符号的同时,也需要使用'+'符号的话,按照'!+NN'这个顺序来使用。
--membind=nodes, -m nodes
Only allocate memory from nodes. Allocation will fail when there is not enough memory available on these nodes.
选项'--membind'仅用来从节点中分配内存空间所用。如果在这些节点中无法分配出所请求的空间大小的话该分配操作将会失败.
nodes may be specified as noted above .
上述命令中指定需要分配空间的nodes的方式可以遵照上述N,N,N , NN , N这种方式来指定.
--cpunodebind=nodes, -N nodes
Only execute process on cpus. This accepts cpu numbers as shown in the processor fields of /proc/cpuinfo , or relative cpus as in relative to the current cpuset.
上述命令仅用于施加在运行与cpu上的进程。这个命令用于显示cpu的个数,cpu数目信息同样记录在系统中的存放处理器领域信息的/proc/cpuinfo文件夹下,
或者是按照关联的中央处理器信息在当前的中央处理器集中所存放.
You may specify "all" , which means all cpus in the current cpuset .
使用者可以通过制定"all"这个选项来选定当前中央处理器集合中的所有中央处理器对象.
Physical cpus may be specified as N,N ,N or NN or N, NN or NN,NN and so forth .
物理(而非程序中所抽象的) cpu实体也可以按照N,N,N或是NN或者是N,NN或是NN,NN诸多选定方式进行选定.
Relative cpus may be specified as +N,N,N or +NN or +N,NN and so forth.
相互关联的cpu实体也可以按照+N,N,N或是+NN ,或+ N,NN来选定并表明他们之间的关系.
The +indicates that the cpu numbers are relative to the process' set of allowed cpu in its current cpuset.
上述命令中的'+'符号用于表明中央处理器的标号与当前其所在的中央处理器集合中某个cpu上运行的进程集合中的进程之间是有一定的关联的。
A !NN notation indicates that the cpu inverse of NN , in other words all cpus except NN if used with + notation , specify !+NN .
!NN这种表述方式表明的是NN含义的翻转,也就是说,某个命令将会被施加在除了NN这一区间内的节点以外的所有节点集上
--localalloc , -l
Always allocate on the current node.
这个命令选项通常是为当前的节点分配内存的
--preferred=node
Preferably allocate memory on node, but if memory cannot be allocated there fallback to other nodes.
该命令由于指定优先分配内存空间的节点,如果无法将空间分配给该节点的话,应该分配给该节点上的空间将会被分发到其他的节点上
This option takes only a single node number . Relative notation may be used.
该命令选项后面仅接收一个单独的节点标号.相关的表示方式也可以使用.
--show,-s
Show NUMA policy setting of the current process.
该命令用于显示NUMA机制作用在当前运行的那些进程上
--hardware , -H
Show inventory of available nodes on the system.
该命令用于显示当前系统中有多少个可用的节点.
Numactl can set up policy for a SYSV shared memory segmemnt or a file in shmfs/hugetlbfs.
numactl命令也可以作用在系统级的共享内存段上或者是施加在shmfs/hugetlbfs的文件上
This policy is persistent and will be used by all mappings from that shared memory .
numa的这种机制是可以被持久化的,并且将被施加numa机制的共享内存映射到自己地址空间中的进程都具有numa机制
The order of options matters here.
调用命令时所使用的参数选项按照下面的顺序来使用
The specification must at least include either of --shm , --shmid , --file to specify the shared memory segment or file
and a memory policy like described above ( --interleave , --localalloc , --preferred , --membind) .
在使用命令的时候必须至少包括--shm ,--shmid , --file来表明numa机制作用在共享内存段上还是文件上面,
并且还要指定上面介绍过的操作内存的方式(通过这些选项来指定--interleave, --localalloc, --preferred , --membind )

--huge
When creating a SYSV shared memory segment use huge pages . Only valid before --shmid or --shm
当创建一个基于大内存页面的系统级的共享内存段的时候,使用--huge这个选项。
--huge选项仅在--shmid或是--shm命令的后面使用才有效.
--offset
Specify offset into the shared memory segment. Default 0. Valid uints are m (for MB), g (for GB) , k (for KB) , otherwise it specifies bytes.
该参数选项用于指定共享内存段中的位移量的偏移。默认的情况下偏移量是0 。有效的偏移量单位是m (用于表示MB)
g (用于表示GB) , k (用于表示KB ),其他没有指定的被认为是以字节为单位.
--strict
Given an error when a page in the policied area in the shared memory segment already was faulted in with a conflicting policy .
Default is to silently ignore this .
这个参数选项当施加了NUMA调度机制的共享内存段区域的页面被施加了另一个机制而导致错误的时候,
使用--strict选项将会把错误信息显示出来.默认情况是不使用该选项的。
--shmmode shmmode
Only valid before --shmid or --shm When creating a shared memory segment set it to numeric mode shmmode .
该选项仅在--shmid或是--shm之前使用才会生效。当创建一个共享内存段的时候,通过整型数值来指定
共享内存的共享的模式类型.
--length length
Apply policy to length range in the shared memory segment or make the segment length long Default is to use the remaining
length Required when a shared memory segment is created and specifies the length of the new segment then .
Valid units are m ( for MB ) , g( for GB) , k ( for KB) , otherwise it specifies bytes.
--shmid id
Create or use an shared memory segment with numeric ID id .
通过ID号码来创建或使用一个共享内存段。
(如果共享内存段已经存在,那么通过shmid来指定下面要使用某个ID的共享内存段;如果该ID对应的共享内存段并不存在的话,那么就创建一个)
--shm shmkeyfile
Create or use an shared memory segment , with the ID generate using fork(3) from shmkeyfile
通过存放在shmkeyfile(共享内存-键文件)中的ID号码来创建或者是使用一个共享内存段。
访问shmkeyfile文件的进程是通过fork(3 arguments)方法来实现的.
--file tmpfsfile
Set policy for a file in tmpfs or hugetlbfs
将numa机制施加于文件上面,这个文件属于tmpfs或者是hugetlbfs这种特殊的文件系统
--touch
Touch pages to enforce policy early. Default is to not touch them , the policy is applied when a applications maps and accesses a page.
通过将numa机制施加于刚刚页面上来实现内存的早期numa化。
默认情况下是不使用该选项,如果存在映射或是访问页面的应用的话,将会使用该早期实行NUMA机制的这种方法.
--dump
Dump policy in the specified range .
该选项用于废除将已经numa化的特定区域上的NUMA性质.
Valid node specifiers
all All nodes
number Node number
number1{,number2} Node number1 and Node number2
number1-number2 Nodes from number1 to number2
!nodes Invert selection of the following specification .
(--dump )选项后,有效指定node的书写方式
all用于将所有的节点上的NUMA特性移除
number通过指定node后接的数值来废除该数字对应的node
number1(number2) node number1(node number2)上的NUMA特性将会被移除
number1-number2 node number1 -- node number2区间上的所有存在的node的NUMA特性将会被移除
!nodes除了nodes所指定的节点以外的所有节点上的NUMA特性全都会被移除
Examples
使用示例
numactl --physcpubind=+0-4,8-12 myapplic arguments
Run myapplic on cpus 0-4 and 8-12 of the current cpuset .
上述的这个命令用于将myapplic程序进程运行在当前中央处理器集合的0 -4和8-12标号的cpu上面.
numactl --interleave=all bigdatabase arguments
Run big database with its memory interleaved on all CPUs.
将大型数据库系统进程,并且允许该进程使用所有cpu交替分配的内存空间.( round robin内存分配机制)
numactl --cpubind=0 --membind=0,1 process
Run process on node 0 with memory allocated on node0 and 1 .
上述的命令是将进程运行在node0上面,而进程运行所需要的内存空间则是从node0和node1上面分配而来的
numactl --cpubind=0 --membind=0,1 --process -l
Run process as above, but with an option (-l) that would be confused with a numactl option .
运行上述的程序,但是这个命令中有一个-l的选项可能会和numactl的设置选项弄混淆
numactl --preferred=1 numactl --show
Set preferred node 1 and show the resulting state.
将node1这个节点设置为优先运行进程的节点,设置之后调用--show参数来显示当前进程运行的状态信息
numactl -- interleave=all --shmkeyfile /tmp/shmkey
interleave all of the sysv shared memory region specified by /tmp/shmkey over all nodes.
交织/交替将系统中所有在/tmp/shmkey文件夹下创建的系统级的共享内存域(因为内存区间段可能有多个,并且有可能出现不连续的,这个命令是将其全部选上)
分配给系统中的所有节点
numactl --offset=1G --length=1G --membind= 1 --file /dev/shm/A --touch
Bind the second gigabyte in the tmpfs file /dev/shm/A to node1.
在tmpfs文件系统中文件夹/dev/shm/下面创建1 GB大小的文件,并将该文件命名为A ,然后将该1GB的文件与node 1进行绑定.
/也就是说node1中使用的内存是来自于文件系统中的文件.
numactl --localalloc /dev/shm/file
Reset the policy for the shared memory file to the default localalloc policy.
将共享文件的NUMA特性重置成本地默认调度机制
Notes
注意
Requires an NUMA policy aware kernel .
执行numactl命令之前,需要明确知道当前主机的内核是支持NUMA技术的.
Command is not executed using s shell. If you want to use shell metacharacters in the child use sh -c as wrapper.
上述命令在shell脚本中无法被执行。如果想要在子脚本中使用shell元字符的话需要在前面加上用作封装器的-c选项
Setting policy for hugetlbfs file does currently not work because it cannot be extended by truncate.
将NUMA机制施加于hugetblfs文件系统中的文件上的时是不会立即生效的,因为hugetblfs这个文件系统无法以truncate的方式打开文件.
/在普通文件系统中,truncate打开文件的方式是这样的:当文件不在指定路径下存在的时候,会在该路径下创建该文件,然后将其打开;
/当文件存在的时候,会自己打开该文件
Shared memory segments larger than numactl's address space cannot be completely policied.
如果共享内存段的大小要大于执行numactl这一命令进程的地址空间要打的话,不能够确保全部共享内存区域都具有NUMA机制.
This could be a problem on 32bit architectures.
在32位架构主机上就有可能出现这个问题(共享内存段无法完全的实现NUMA机制).
Changing it piece by piece may work .
把(范围区间十分大的)共享内存段分割成多个小段,然后一段一段的NUMA化可能会解决这个问题.
The old --cpubind which accepts node numbers, not cpu numbers, is deprecated and replaced with the new --cpunodebind and --physcpubind optins.
以前的旧命令选项--cpubind接收的数字表示的是node的个数而非cpu的个数,这个命令已经过时了,取而代之的是--cpunodebind和--physcpubind
(分别用于设定绑定的cpu中节点的个数,和绑定的物理cpu的个数)
Files
关于系统文件
/ proc/cpuinfo for the listing of active CPUs.
位于/proc/cpuinfo路径下的文件记录的是当前活跃状态的CPU的信息
/sys/devices/system/node/node*/numastat for NUMA memory hit statistics.
/sys/devices/system/node/node*/ numastat文件用于记录的是使用NUMA调度策略之后,内存命中率等相关统计信息