Linux의 NUMA 아키텍처도 메인 메모리를 공유합니까?

Linux의 NUMA 아키텍처도 메인 메모리를 공유합니까?

NUMA(Non-Uniform Memory Access) 아키텍처에 대해 읽고 있습니다. 하드웨어 아키텍처는 다음과 같습니다. 다중 프로세서 시스템에서 각 코어는 원격 메모리에 액세스할 수 있는 것보다 더 빠르게 내부 로컬 메모리에 액세스할 수 있습니다.

내가 모르는 것은: 메인 메모리(RAM)도 노드 간에 나누어져 있는 것 같습니다. 동일한 CPU 내의 모든 노드가 동일한 속도로 메인 메모리에 액세스할 수 있다고 생각했기 때문에 이는 혼란스럽습니다. 그렇다면 Linux는 왜 각 노드의 메인 메모리를 분할합니까?

답변1

면책 조항: 이틀 전에는 NUMA가 무엇인지 전혀 몰랐습니다. 저는 NUMA 플랫폼을 얻은 후 어제 이 모든 것을 배워야 했습니다.

노드마다 액세스 속도가 다릅니다

동일한 CPU 내의 모든 노드가 동일한 속도로 주 메모리에 액세스한다고 가정합니다. 그렇다면 Linux는 왜 각 노드의 메인 메모리를 분할합니까?

귀하의 질문에 대한 빠른 대답은 Linux가 각 노드에 대해 메인 메모리를 분할한다는 것입니다. 왜냐하면 각 노드에는 자체 전용 메모리 컨트롤러, 심지어 외부(메인) 메모리도 있기 때문입니다. 모든 노드의 액세스 속도가 동일하다는 전제는 잘못되었습니다.

예를 들어 내 싱글을 사용하겠습니다.AMD 옵테론 6386 SE128GiB RAM을 갖춘 시스템. 이 16코어 1 프로세서는 실제로 두 개의 독립적인 프로세서로 구성됩니다.사망 한고속 상호 연결이 특징이며 동일한 물리적 패키지에 있는 두 개의 독립 프로세서로 볼 수 있습니다.

AMD 문서

~에서AMD의눈에 띄는 방식으로 내 아키텍처를 설명하세요.AMD 시리즈 15h 모델 00h-0Fh 프로세서용 BIOS 및 커널 개발자 가이드(BKDG) 35페이지, 그림 2:

듀얼 노드 프로세서

  • 하나(물리적으로는 소켓에 설치하는 것입니다)
  • …2개 포함마디(노드는 단일과 같습니다.주사위)
  • 마디4개가 들어있습니다컴퓨팅 유닛
  • 컴퓨팅 유닛두 가지가있다정수 코어그리고 FPU와 L2 캐시를 공유합니다.
  • 마디자신의 것이있다노스 브릿지
  • 노스 브릿지DDR 메모리 채널이 2개 있습니다.

이는 노드 0의 코어가 DDR 채널 C 또는 D에 연결된 RAM을 사용하려면 노드 1의 노스 브리지를 통과해야 함을 의미합니다.

내 시스템에는 8개의 16GiB 물리적 RAM 스틱이 있으므로 각 컨트롤러(AD)는 32GiB에 액세스할 수 있습니다.

Linux에서 어떻게 보이는지

BIOS에서 투명한 NUMA 지원을 활성화했기 때문에 Linux는 내 컴퓨터가 다음과 같다고 생각합니다.

lstopo의 토폴로지

나는 다음을 사용하여 이미지를 생성합니다.이스토포2 명령하드웨어 잠금 패키지.

여기서 계층 구조는 명확합니다. Linux는 두 가지가 있다는 것을 알고 있습니다.마디, 모든 사람은 총 64GiB의 RAM에 로컬로 액세스할 수 있습니다(GiB 또는 2GiB 제공 또는 감소). L3 캐시를 공유하는 각 노드, 각 노드로 더 나누어지는 모습을 볼 수 있습니다.컴퓨팅 유닛자체 L2 및 L1 명령어 캐시와 각 명령어 캐시 보유핵무기전용 L1 데이터 캐시가 있습니다.

해당 CPU의 "왼쪽 절반"에서 실행되는 프로세스가 "오른쪽 절반"에 할당된 메모리를 사용하려면 몇 가지 과정을 거쳐야 하기 때문에 커널이 이 레이아웃을 이해하는 것이 중요합니다. 이 속도는 모든 것을 방해하거나 방해하지 않을 만큼 빠른 것에서부터 시스템의 나머지 부분이 얼마나 바쁜지에 따라 달라집니다.

어떻게할 수 있다Linux 보기 - 노드 인터리빙

내 서버에는 NUMA를 "비활성화"하고 전체 패키지를 16개 코어와 128GiB RAM이 있는 CPU로 처리하는 옵션이 있습니다. 내가 이해한 바로는 한 노드에서 실행되는 프로세스가 노드 0의 메모리 절반과 노드 1의 메모리 절반을 볼 수 있도록 노드 간에 메모리 주소를 인터리브함으로써 이를 수행합니다.

첫째, 운영 체제나 워크로드가 NUMA 3 을 지원하지 않는 경우 필요할 수 있습니다 . 둘째, 메모리를 올바르게 할당하는 것은 실제로 어렵습니다. 워크로드에 프로세스 간 통신이 많은 경우 최적의 레이아웃을 찾는 것이 항상 가능한 것은 아닙니다. 또한 한 노드에서 프로세스가 다른 노드에 연결된 하드웨어에 대해 많은 I/O를 수행하게 될 수도 있습니다. 노드 전체에 RAM을 고르게 분산시키면 액세스의 절반 이상이 로컬에서 이루어지므로 최악의 시나리오가 발생하지 않습니다.


각주:
1. 인텔은 이를 8/16 코어라고 부릅니다.이번 소송
2. 맞추기 위해 lstopo --no-io --no-legend --no-index=PU,core --gridsize 5 --no-attrs=cache --horiz
3을 사용했습니다. 아키텍처는 2011년 아키텍처이고 아마도 동일한 OS를 유지하면서 오래된 하드웨어를 교체하는 데 사용되었을 것입니다.

관련 정보