NUMA 아키텍처의 필요성
HPC(High Performance Computing)나 GPU 연계 서버에서는 CPU와 메모리 간의 대역폭, 지연 시간(latency)이 전체 워크로드 성능에 직접적인 영향을 미칩니다.
NUMA(Non-Uniform Memory Access)는 이러한 고성능 서버에서 흔히 사용되는 메모리 아키텍처로, 각 CPU 소켓이 자신만의 메모리 뱅크를 가지고 있고, 로컬 메모리 접근은 빠르지만 다른 소켓의 메모리를 접근할 때는 QPI/UPI 링크를 거쳐야 하므로 지연 시간이 증가합니다.
단일 NUMA 노드에서 모든 작업을 처리하면 지연을 최소화할 수 있지만, HPC 환경에서는 멀티 노드 구조가 일반적이어서 **CPU 바인딩(CPU Affinity)**과 메모리 바인딩(Memory Binding) 전략이 필수적입니다.
NUMA 구조와 CPU 바인딩 기법
아래 표는 2소켓(각 8코어) NUMA 서버의 구조 예시입니다.
| NUMA 노드 | CPU 코어 범위 | 로컬 메모리 용량 | 원격 메모리 접근 지연 |
| Node 0 | CPU0–CPU7 | 128 GB | 약 70~80ns |
| Node 1 | CPU8–CPU15 | 128 GB | 약 110~130ns |
NUMA 환경에서 효율적인 자원 활용을 위해서는 다음과 같은 바인딩 방법을 사용합니다.
- CPU 바인딩: 특정 코어나 NUMA 노드에 프로세스를 고정
- 메모리 바인딩: 프로세스 메모리 할당을 특정 NUMA 노드로 제한
- Interleaving: 여러 노드에 균등하게 메모리를 분산하여 할당
# NUMA 노드와 CPU 매핑 확인
numactl --hardware
# PID 1234 프로세스를 Node 0에 바인딩
numactl --cpunodebind=0 --membind=0 --pid=1234
바인딩 전략과 데이터 흐름
NUMA 환경에서 프로세스와 메모리 배치가 잘못되면 **원격 메모리 접근(Remote Memory Access)**이 증가하여 성능이 급격히 저하됩니다.
예를 들어, Node 0에서 실행되는 프로세스가 Node 1의 메모리를 지속적으로 읽는다면, UPI 링크의 병목과 추가 지연이 발생합니다.
효율적인 HPC 워크로드를 위해서는 다음과 같은 전략을 사용합니다.
- 프로세스와 데이터의 위치 일치: 계산 스레드가 접근하는 데이터는 같은 NUMA 노드에 배치
- MPI Rank와 NUMA 매핑: MPI 기반 병렬 처리 시 각 Rank를 NUMA 노드별로 할당
- GPU 연계 시 NUMA 인식: GPU가 PCIe를 통해 특정 NUMA 노드에 물리적으로 연결되어 있는 경우, 해당 노드에서만 CPU–GPU 간 데이터 전송을 처리

실제 적용 사례
SK hynix 내부 AI 트레이닝 클러스터에서, 멀티 소켓 CPU와 8개의 GPU가 장착된 서버를 운영할 때 CPU 바인딩 최적화를 적용했습니다.
초기에는 모든 MPI 프로세스가 OS 기본 스케줄링에 의해 무작위 코어에 배치되어, 로컬 메모리 접근 비율이 60% 수준에 불과했습니다.
이를 NUMA 바인딩으로 조정하여 GPU별로 연결된 NUMA 노드의 CPU와 메모리를 고정한 결과, 학습 속도가 평균 15~20% 향상되었습니다.
# OpenMPI 실행 시 NUMA 바인딩 예시
mpirun --bind-to numa --map-by numa:PE=4 ./train_model
장점과 단점
장점
- 성능 향상: 메모리 지연 감소로 HPC/GPU 워크로드 처리 속도 증가
- 자원 예측 가능성: 동일한 코어·메모리 환경에서 재현성 높은 성능
- 네트워크 부하 감소: 원격 메모리 접근 감소로 UPI/QPI 트래픽 절감
단점
- 유연성 감소: 특정 자원 고정으로 스케줄링 유연성이 낮아짐
- 설정 복잡성: NUMA 토폴로지와 워크로드 특성을 잘 이해해야 함
- 잘못된 바인딩 시 역효과: 과도한 고정으로 일부 노드가 과부하될 수 있음
실무 팁과 주의사항
- lscpu, numactl, hwloc-ls 등을 사용해 NUMA 구조를 먼저 파악
- CPU–GPU 물리 연결 관계를 nvidia-smi topo -m으로 확인
- 컨테이너 환경(Kubernetes)에서는 cpuManagerPolicy=static과 TopologyManager를 활용
- 성능 측정 전후로 perf stat, numastat을 사용해 로컬/원격 메모리 비율 모니터링
- HPC Job Scheduler(Slurm)에서는 --cpu-bind, --mem-bind 옵션을 적극 활용
# Slurm에서 NUMA 바인딩 예시
srun --cpu-bind=cores --mem-bind=local ./hpc_task
정리하며
NUMA 아키텍처는 현대의 멀티 소켓 HPC 서버와 GPU 노드에서 피할 수 없는 구조이며, 이를 잘 이해하고 CPU/메모리 바인딩 전략을 적용하는 것은 성능 최적화의 핵심입니다.
특히 AI 트레이닝, CFD, 빅데이터 분석처럼 메모리 접근 패턴이 중요한 워크로드에서는 바인딩 전략 하나만으로도 두 자릿수 성능 향상을 경험할 수 있습니다.
운영자는 NUMA 토폴로지를 숙지하고, 워크로드 특성에 맞춘 바인딩을 통해 HPC 환경의 자원을 최대한 효율적으로 활용해야 합니다.