본문 바로가기

IT/Linux

numactl

numactl


- 프로세스나 공유메모리의 NUMA 정책을 control 한다.


- numactl 은 특정한 NUMA 스케줄링이나 메모리 배치 정책으로 프로세스를 실행시킨다. 정책은 명령어로 정해지고 모든 children 에게도 상속된다. 또한, 공유메모리 segments 나 파일에 지속적으로 작용한다.


- 명령어 옵션이 헷갈리면 --를 사용해라. ex) numactl --


node 는 N,N,N or N-N or N,N-N or N-N,N-N 등으로 지정할 수 있다. '+' 는 현재 cpuset 에 허용된 node 들의 프로세스 set 에 관련된 것만 이용하겠다는 것을 나타낸다. '!' 는 inverse 이므로 !N-N 은 N-N 의 반대를 나타낸다.


node 숫자 대신에 다음도 명시 가능하다.

netdev:DEV                      network device DEV 를 node 로 명시

file:PATH                          PATH 의 file을 (block device) node 로 명시 

ip:HOST                           HOST의 network device 를 node 로 명시

bloack:PATH                    PATH 의 block device를 node 로 명시 

pci:[seg:]bus:dev[:func]   PCI device를 node 로 명시


정책 설정


--interleave=nodes, -i nodes

memory interleave 정책으로 설정. 메모리는 여러 node 들에 round robin하게 할당된다. 현재 할당 순서인 node 에 할당할 수 없으면 다른 node 로 간다.


--membinde=nodes, -m nodes

지정된 node 들에만 메모리를 할당한다. 메모리가 충분하지 않으면 할당 실패.


--cpunodebind=nodes, -N nodes

지정된 node 들의 CPU에서만 명령을 실행한다. 각 node 는 여러 개의 CPU를 가지고 있음에 유의.


* 위의 3 가지 정책을 혼용하여 사용 가능하다. 그러나 interleave와 membind를 혼용할 순 없다.

ex) numactl -i 0 -N 0 -> O / numactl -i 0 -m 0 -> X


--physcpubind=cpus, -C cpus

지 정된 CPU 에서만 실행하도록 한다. /proc/cpuinfo 의 processor 필드의 숫자나 현재 cpuset 에 관련된 CPU 숫자를 사용할 수 있다. CPU 숫자 대신 'all' 을 지정하면 현재 cpuset 에서 모든 CPU를 사용한다.


--localalloc, -l

항상 현재 node 에 할당한다.


--preferred=node 

지정된 node 에 우선적으로 할당하지만, 메모리가 부족할 경우 다른 node 에 할당한다. 이 옵션은 하나의 node 숫자만 지정할 수 있다. relative notation 도 사용될 수 있다.


--show, -s

현재 프로세스의 설정된 NUMA 정책을 보여준다.


--hardware, -H

시스템의 이용 가능한 node 들을 보여준다.


numactl 은 shmfs / hugetlbfs 의 SYSV (UNIX System V) 공유 메모리 segment 나 파일을 위한 정책을 설정할 수 있다.

이 정책은 지속적이며 공유 메모리의 모든 mapping 에 사용될 수 있다. 공유 메모리 segment, 파일, 메모리 정책(위 정책 설정에서 설명한)을 명시하기 위해 --shm, --shmid, --file 옵션 중 반드시 하나는 지정되어야 한다.

* shmfs / hugetlbfs : RAM-based filesystem 으로 일단 간략하게 ㅠㅠ

http://en.wikipedia.org/wiki/Tmpfs

http://lwn.net/Articles/375096/

/Documentation/vm/hugetlbpage


--huge

SYSV 공유 메모리 segment 를 생성할 때 huge page 를 이용한다. 먼저 --shmid 나 --shm 옵션이 있어야 유효함.


--offset

공유 메모리 segment 의 offset 을 명시. 기본값은 0이며, byte 를 직접 설정할 수 있고 m(MB), g(GB), k(KB)도 사용가능하다.

 

--strict

page의 공유 메모리 segment 의 정책이 정책 충돌로 인해 fault 가 나면 오류를 출력한다. 기본값은 오류가 나도 출력하지 않는 것이다.


--shmmode shmmode

공유 메모리 segment 를 numeric mode shmmode 로 생성한다. 먼저 --shmid 나 --shm 옵션이 필요.


--length length

공 유 메모리 segment 에 지정된 크기 만큼의 범위에 정책을 적용하거나, 적용된 segment 의 범위를 넓힌다. 기본값은 공유 메모리 segment 가 생성될 때 남아있는 segment 에 적용하는 것이다. 길이는 byte 단위로 직접 설정할 수 있고 m(MB), g(GB), k(KB)도 사용 가능하다.


--shmid id

지정된 숫자로 된 ID 를 가진 공유 메모리 segment 를 생성한다.


--shm shmkeyfile

shmkeyfile 에서 ftok 함수을 사용하여 생성된 ID를 가지고 공유 메모리 segment 를 생성하거나 이용한다.

* ftok : 경로이름과 project 식별자를 이용하여 System V IPC key 를 생성한다. http://www.linuxmanpages.com/man3/ftok.3.php

http://jinynet9.tistory.com/561


--file tmpfsfile

tmpfs 나 hugetlbfs 의 파일을 위한 정책을 설정한다.


--touch

정책이 미리 시행될 수 있도록 page 를 touch 한다. 기본값은 touch 하지 않는 것이다. 이 정책은 응용프로그램이 page 를 mapping 하거나 접근할 때 적용된다.


--dump

지정된 범위의 메모리의 정책을 dump 한다.


--dump-nodes

지정된 범위의 모든 node 들을 dump 한다.




출처 : http://novum21.tistory.com/entry/numactl