NUMA(Non-Uniform Memory Access)는 멀티소켓 서버에서 각 CPU가 자신의 로컬 메모리에 더 빠르게 접근하는 메모리 아키텍처다. 원격 메모리 접근은 로컬보다 2~4배 느리기 때문에 NUMA-aware 프로그래밍이 성능에 중요하다.
구조
노드 0 (CPU 0-7): 노드 1 (CPU 8-15):
├─ CPU 0~7 ├─ CPU 8~15
├─ 로컬 메모리 64GB ├─ 로컬 메모리 64GB
└─ L1/L2/L3 캐시 └─ L1/L2/L3 캐시
↕ QPI/UPI 인터커넥트 ↕
원격 메모리 접근: 2~4배 느림
NUMA 토폴로지 확인
bash
numactl --hardware
# available: 2 nodes (0-1)
# node 0 cpus: 0 1 2 3 4 5 6 7
# node 0 size: 64430 MB
# node distances:
# node 0 1
# 0: 10 21 ← 원격 접근은 2.1배 느림
# 1: 21 10
lstopo # hwloc 그래픽 토폴로지
최적화 전략
bash
# 프로세스를 특정 NUMA 노드에 고정
numactl --cpunodebind=0 --membind=0 ./program
# Java NUMA 설정
java -XX:+UseNUMA -XX:+UseParallelGC MyApp
# 리눅스 NUMA 자동 밸런싱
echo 1 > /proc/sys/kernel/numa_balancing
관련 개념