콘텐츠로 이동

numactl - NUMA CPU 및 메모리 바인딩 치트시트

numactl - NUMA CPU 및 메모리 바인딩 치트시트

numactl은 프로세스에 대한 NUMA (Non-Uniform Memory Access) 정책을 제어합니다. 다중 소켓 서버에서 한 CPU 소켓 (노드)에 연결된 메모리는 다른 노드의 메모리보다 그 소켓이 더 빠르게 접근합니다. 노드 사이를 바운싱하는 프로세스는 지연 페널티를 지불합니다. numactl은 특정 NUMA 노드에 프로세스를 바인드할 수 있습니다 — CPU와 메모리를 동일 노드에 고정 — 이는 데이터베이스 및 HPC 작업과 같은 메모리 바운드 워크로드의 성능을 크게 향상시킬 수 있습니다.

설치

플랫폼명령어
Debian/Ubuntusudo apt install numactl
Fedora/RHELsudo dnf install numactl
Arch Linuxsudo pacman -S numactl
확인numactl --version

토폴로지 검사

명령어표시
numactl --hardware (-H)NUMA 노드, 노드당 CPU, 노드당 메모리, 거리
numactl --show (-s)현재 프로세스의 NUMA 정책
numastat노드당 메모리 할당 hit/miss 통계
lscpuCPU 대 노드 매핑 (NUMA 노드 CPU)
# 몇 개의 NUMA 노드가 있고 어느 CPU/메모리가 각각에 속하는지 확인
numactl --hardware

프로세스 바인딩

명령어효과
numactl --cpunodebind=0 --membind=0 ./app노드 0의 CPU와 메모리에서 실행
numactl -N 1 -m 1 ./app단축형: 노드 1 CPU + 메모리
numactl --physcpubind=0-7 ./app특정 CPU 코어에 바인드
numactl --membind=0,1 ./app노드 0과 1에서 메모리 허용
numactl --interleave=all ./app모든 노드 전체에 메모리 분산 (라운드로빈)

메모리 정책

정책플래그의미
바인드--membind=NODES이들 노드에서만 할당 (가득 차면 실패)
선호--preferred=NODE노드 선호, 필요하면 폴백
인터리브--interleave=NODES노드 전체에 라운드로빈 (대역폭)
로컬--localalloc스레드가 실행되는 노드에 할당

어느 것을 언제 사용할 것인가

목표정책
지연 민감, 한 노드에 맞음--cpunodebind=N --membind=N (공동 배치)
대역폭 바운드, 큰 풋프린트--interleave=all
주로 한 노드, 가끔 오버플로우--preferred=N
커널이 로컬로 결정하도록 함--localalloc

일반적인 워크플로우

# 데이터베이스를 노드 0에 고정하여 노드 간 메모리 지연 피하기
numactl --cpunodebind=0 --membind=0 postgres -D /data

# 대역폭 많은 분석: 모든 노드에 메모리 인터리브
numactl --interleave=all ./analytics-job

# 실시간 프로세스용 특정 코어 예약
numactl --physcpubind=8-15 --membind=1 ./rt-app

# 실행 중인 설정이 어떤 정책을 사용하는지 확인
numactl --show

관련 튜닝 도구

도구역할
numactl프로세스당 NUMA CPU/메모리 정책 설정
numastat노드당 할당 효율성 모니터링
tasksetCPU 친화성 (NUMA 메모리 정책 없음)
cpupowerCPU 빈도/governor 튜닝
커널 numa_balancing자동 NUMA 밸런싱 (/proc/sys/kernel)

numactl을 cpupower와 쌍을 이루어 빈도 제어하세요. numastat을 사용하여 바인딩이 실제로 노드 간 미스를 줄였는지 확인하세요.

승리 확인

# 전/후: 바인딩 후 numa_miss / numa_foreign가 떨어지는 것 확인
numastat -p $(pgrep -n app)

높은 numa_miss / numa_foreign은 메모리가 원격 노드에서 제공되는 것을 의미합니다 — 정확히 바인딩이 수정하는 것입니다.

자료