Non-uniform memory access
불균일 기억 장치 접근(Non-Uniform Memory Access, NUMA)는 멀티프로세서 시스템에서 사용되고 있는 컴퓨터 메모리 설계 방법중의 하나로, 메모리에 접근하는 시간이 메모리와 프로세서간의 상대적인 위치에 따라 달라진다. NUMA구조에서 프로세서는 자기의 로컬 메모리에 접근할 때가 원격 메모리에 접근할 때보다 더 빠르다. 원격 메모리는 다른 프로세서에 연결되어 있는 메모리를 말하고 로컬 메모리는 자기 프로세서에 연결되어 있는 메모리를 말한다.
NUMA 아키텍처는 이론적으로 SMP아키텍처로부터 확장된 개념이다. Burroughs large systems에 의해서 첫 상용화되었으며 이후 유니시스, Convex Computer(이후 휴렛 패커드), 실리콘 그래픽스, Sequent Computer Systems, Data General 그리고 DEC에서 상품화되었다. 이러한 회사들이 개발해 놓은 기술들은 유닉스 계열 운영 체제에 도입되었으며 일부는 윈도 NT에도 도입되었다.
기본 개념
현대의 CPU는 주 메모리보다 훨씬 빠르게 동작한다. 그렇지만 컴퓨터 초기에는 CPU는 일반적으로 메모리보다 천천히 동작을 했다. 1960년대에 첫 슈퍼컴퓨터와 고속 컴퓨터가 개발되면서 역전이 되었다. 그 이후, 계속해서 데이터를 더 많이 사용해야 하는 CPU는 메모리에서 데이터를 다 가지고 올 때까지 기다려야 했다. 1980년대와 1990년대에 개발된 많은 슈퍼컴퓨터는 빠르게 메모리에 접근하는 방법을 제공했고 이것으로 대용량 데이터 집합에 대한 처리를 그 어떤 다른 시스템들보다 빠르게 할 수 있었다.
메모리에 접근하는 경우의 수를 줄이는 것이 현대 컴퓨터에서 성능을 높이는 한 방법이다. 예를 들면, 고속의 캐시 메모리를 지속적으로 증가시키는 것과 캐시 미스를 줄이기 위한 뛰어난 알고리즘을 사용하는 것이다. 그렇지만 운영체제 크기의 비약적인 증가와 그 위에서 돌아가는 애플리케이션 크기의 증가는 캐시를 통한 성능 향상을 압도하게 된다. 특히나 다중 프로세서 시스템에서는 이 문제가 더 심각하다. 하나의 프로세서만이 메모리에 접근할 수 있기 때문에 많은 다른 프로세서들은 기다려야만 하기 때문이다.
NUMA는 각각의 프로세서에 독립적인 별도의 메모리를 제공함으로써 이러한 문제를 해결하려 한다. 이렇게 하면 여러 프로세서들이 동일 메모리 주소에 접근하려 할때 성능 충돌을 피할 수 있다. 서버와 애플리케이션에서 아주 일반적인 펼쳐진 데이터를 처리하는 문제의 경우에, NUMA는 하나의 공유 메모리의 경우 대비 대략적으로 프로세서의 수나 아니면 메모리 뱅크수 만큼 성능을 향상시킬 수 있다. 그렇지만 하나 이상의 프로세서가 동일 데이터를 필요로 하는 경우에 NUMA시스템은 메모리 뱅크들 사이로 데이터를 이동시켜야 하는 경우가 발생한다. 이러한 동작은 NUMA의 성능을 떨어뜨리는 요인이다. 따라서 전반적인 성능은 주어진 시간에 동작하고 있는 일의 특성에 달려있다. 어떻게 프로세스가 원격 메모리 대신 로컬 메모리를 사용하게 하느냐가 프로그램의 최적화에 대한 문제이다.
Automatic numa balancing
Shows multiple nodes:
Shows NUMA in the flags:
To disable automatic NUMA balancing, use the following command:
To enable automatic NUMA balancing, use the following command:
수동 설정 방법
numactl 사용
numactl은 NUMA 정책을 설정할 수 있는 유틸리티입니다.
-
--cpunodebind=1
- 프로세스를 1번 NUMA 노드의 CPU에 고정합니다. -
--membind=1
- 프로세스가 사용하는 메모리를 1번 NUMA 노드에서만 할당받도록 설정합니다.
taskset 사용
taskset은 CPU affinity를 설정하는 데 사용됩니다.
-
-c 1
- 1번 CPU에서만 실행되도록 설정합니다.
이 두 가지 방법 모두 Python 스크립트를 실행할 때 특정 CPU에 고정시킬 수 있습니다. numactl은 메모리까지 고정시킬 수 있다는 점에서 좀 더 세부적인 설정이 가능합니다.
환경변수 설정
NUMA 환경에서 성능 최적화를 위해 Python 실행 전에 환경 변수를 설정할 수도 있습니다.
이러한 설정은 멀티스레딩 라이브러리들이 사용되는 경우에 성능을 향상시킬 수 있습니다.
See also
Favorite stie
- Wikipedia (en) Non-uniform memory access
- Red Hat Enterprise Linux - 6.8 - 성능 조정 가이드 - 4장. CPU
- 나무위키 - NUMA
- [https://technet.microsoft.com/ko-kr/library/ms178144(v=sql.105.aspx MSDN - NUMA(Non-Uniform Memory Access) 이해]
MS Windows
- [https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa363804(v=vs.85.aspx MSDN - NUMA Support]
- [https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa965223(v=vs.85.aspx MSDN - Allocating Memory from a NUMA Node]
- [https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms684251(v=vs.85.aspx MSDN - Multiple Processors]
Linux
- NUMA with Linux 1
- NUMA 에서 실험을 돌리기 위한 작업 (numactl, numastat, taskset를 사용함)
- [추천] NUMA, 메모리관리의 새로운 세계 2