NUMA

EXEM Knowledge Base

Jump to: navigation, 찾기

목차

[편집] 정의

Numa의 구조

NUMA는 멀티 프로세서에서 사용되는 메모리 구조의 한가지로, 이 구조에서는 메모리의 접근 시간이 CPU 대비 메모리의 상대적인 위치에 의해 결정된다. 즉, CPU의 로컬 메모리일 경우 메모리 접근 시간이 매우 빠르며, 다른 CPU의 로컬 메모리거나, 여러 프로세스가 공유하는 메모리일 경우 접근 시간이 느려지는 특성을 가지고 있다.

[편집] 기본 개념

컴퓨터가 개발된지 얼마 안된 1950~60년대에는 CPU의 속도가 메인 메모리 속도보다 느렸다고 한다. 그러던 것이, 1970년대를 지나면서 CPU 속도가 메모리 속도를 추월하게 되었다. 결과적으로 메모리에서 데이터를 제때 가져오지 못해 CPU가 일처리를 못하고 지연되는 현상이 발생했다. 따라서 1980~90년대 슈퍼 컴퓨터들은 빠른 속도로 메모리에 접근할 수 있는 방법에 초점을 두고 디자인됐다. 최근의 컴퓨터들은 메인 메모리로의 접근 횟수를 제한하여 높은 성능을 내고 있다. 이는 속도가 빠른 캐시 메모리를 장착하고 세련된 알고리즘을 사용하여 캐시 미스(cache miss)를 피하는 방법을 의미한다. 그러나 운영체제와 운영체제에서 동작하는 어플리케이션들이 예전과는 비교할수 없을 정도로 그 크기가 커짐에 따라서 캐시를 이용하여 성능을 높이는 방법은 한계에 다달았다. 멀티 프로세서 시스템에서는 상태가 더더욱 나빠졌다. 메인 메모리에 동시에 접근할 수 없기 때문에 동시에 접근한 몇몇 프로세서들은 메모리를 사용하지 못하고 지연되는 사태가 발생한 것이다.

NUMA에서는 각각의 프로세서에 메모리를 분할하여 제공함으로써 여러 프로세서들이 동시에 메모리에 접근할때 발생하는 성능상의 문제를 회피하도록 시도하고 있다. 널리 분포된 데이터에 대해서는 프로세서 개수 혹은 메모리 뱅크의 개수에 비례하여 단일 공유 메모리에 저장함으로써 속도를 높이고 있다.

물론 모든 데이터들이 특정한 하나의 태스크(task)에 종속되지는 않는다. 즉 하나 이상의 프로세서에서 같은 데이터가 필요한 상황도 있다. 이러한 경우 NUMA는 분리된 메모리 뱅크 사이에 데이터를 이동하도록 추가적인 하드웨어나 소프트웨어를 사용한다. 따라서 다른 메모리 뱅크의 데이터를 사용하게 되면 속도가 느려지게 되는 것이다. 그러므로 NUMA의 성능은 전적으로 해당 시스템에서 돌아가는 태스크의 특징에 달려있다.

[편집] Cache coherent NUMA(ccNUMA)

거의 대부분의 CPU에서는 메모리 참조의 지역성을 활용하기 위하여 캐시라는 작고도 빠른 메모리를 사용한다. 즉, 자주 쓰이는 메모리의 데이터는 속도가 빠른 로컬 메모리에 옮겨 놓고 사용하는 것이다. 캐시를 사용하면 캐시의 일관성(cache coherence)을 유지하는 것이 매우 중요하다. 즉, 메모리의 데이터와 각 CPU의 캐시 값이 일관성을 갖아야만이 시스템을 신뢰할 수 있다. NUMA에서도 공유 메모리의 캐시 일관성을 유지하기 위한 오버헤드가 매우 크다. 물론 간단한 하드웨어 디자인을 위하여 캐시 일관성을 고려하지 않은 NUMA 시스템을 생각할 수도 있지만, 폰 노이만 구조의 프로그래밍 모델을 사용할 수 밖에 없는 현재의 프로그램들로서는 프로그래밍 하기가 매우 복잡해진다. 따라서, 상업적인 모든 NUMA 시스템들은 캐시의 일관성을 유지하기 위한 특수 목적의 하드웨어를 사용하고 있다. 그리고 이러한 부류를 ccNUMA(cache coherent NUMA)라고 한다.

캐시의 일관성을 유지하기 위한 방법은 으례 캐시 컨트롤러 간에 프로세서 통신을 통해 이루어진다. 이러한 연유로 인하여 여러 프로세서들이 같은 메모리 구역을 동시에 빠른 속도로 접근할 경우 NUMA의 속도는 매우 늦어지게 된다. 따라서, 이러한 종류의 메모리 접근을 줄이기 위하여 운영 체제에서는 프로세서와 메모리를 NUMA 답게 할당하거나 NUMA 답지 못한 스케쥴링이나 locking 방법을 피하는 등의 지원이 필요하다.


[편집] Numa관련 Oracle Bug