numactl - NUMA CPU 및 메모리 바인딩 치트시트
numactl은 프로세스에 대한 NUMA (Non-Uniform Memory Access) 정책을 제어합니다. 다중 소켓 서버에서 한 CPU 소켓 (노드)에 연결된 메모리는 다른 노드의 메모리보다 그 소켓이 더 빠르게 접근합니다. 노드 사이를 바운싱하는 프로세스는 지연 페널티를 지불합니다. numactl은 특정 NUMA 노드에 프로세스를 바인드할 수 있습니다 — CPU와 메모리를 동일 노드에 고정 — 이는 데이터베이스 및 HPC 작업과 같은 메모리 바운드 워크로드의 성능을 크게 향상시킬 수 있습니다.
설치
| 플랫폼 | 명령어 |
|---|
| Debian/Ubuntu | sudo apt install numactl |
| Fedora/RHEL | sudo dnf install numactl |
| Arch Linux | sudo pacman -S numactl |
| 확인 | numactl --version |
토폴로지 검사
| 명령어 | 표시 |
|---|
numactl --hardware (-H) | NUMA 노드, 노드당 CPU, 노드당 메모리, 거리 |
numactl --show (-s) | 현재 프로세스의 NUMA 정책 |
numastat | 노드당 메모리 할당 hit/miss 통계 |
lscpu | CPU 대 노드 매핑 (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 | 노드당 할당 효율성 모니터링 |
taskset | CPU 친화성 (NUMA 메모리 정책 없음) |
cpupower | CPU 빈도/governor 튜닝 |
커널 numa_balancing | 자동 NUMA 밸런싱 (/proc/sys/kernel) |
numactl을 cpupower와 쌍을 이루어 빈도 제어하세요. numastat을 사용하여 바인딩이 실제로 노드 간 미스를 줄였는지 확인하세요.
승리 확인
# 전/후: 바인딩 후 numa_miss / numa_foreign가 떨어지는 것 확인
numastat -p $(pgrep -n app)
높은 numa_miss / numa_foreign은 메모리가 원격 노드에서 제공되는 것을 의미합니다 — 정확히 바인딩이 수정하는 것입니다.
자료