NUMA에서 버퍼 풀 증가 및 축소
이 항목에서는 NUMA(Non-Uniform Memory Access) 사용 시 버퍼 풀의 메모리 페이지가 할당되는 방법에 대해 설명합니다. 이 정보를 통해 SQL Server에서 NUMA를 사용하는 방법과 Buffer Node 개체의 카운터를 해석하는 방법을 이해할 수 있습니다.
메모리 배포
각 물리적 NUMA 노드에 대해 하나의 SQL Server 메모리 노드가 있습니다. 메모리 노드는 서로 독립적으로 증가하지만 메모리를 균일하게 나눕니다. SQL Server의 로컬 및 외부 메모리 배포를 비교해서 보여 주기 위해 이 항목에서는 컴퓨터에 16GB의 메모리가 있다고 가정하는 예를 사용합니다. Windows를 포함한 다른 응용 프로그램에서 각 노드의 일부 메모리를 사용했으며 SQL Server는 일부 메모리를 버퍼 풀 외부의 프로세스에 할당했습니다. 또한 SQL Server에는 버퍼 풀에 할당할 10GB의 메모리가 있습니다. 버퍼 풀 메모리는 4개의 물리적 NUMA 노드인 N0, N1, N2, N3에 분할되며 각 노드에서 사용할 수 있는 로컬 메모리는 다음과 같습니다.
N0 - 1GB
N1 - 3GB
N2 - 3GB
N3 - 3GB
위의 구성에서 모든 노드는 결국 2.5GB의 메모리를 할당 및 사용합니다. 그러나 노드 N0은 자체 메모리 1.0GB와 다른 노드의 메모리 1.5GB를 갖게 됩니다.
시작 시 메모리 할당
NUMA 사용 시 SQL Server는 초기 여유 메모리가 노드에 균일하지 않게 배포된 경우에도 비-NUMA 시스템과 같은 속도로 운영 체제에서 메모리를 받습니다. 버퍼 풀은 각 노드에 대해 가능한 한 많은 로컬 메모리를 가져오려고 하지만 현재 Windows에 특정 노드에서 메모리를 할당하는 API가 없기 때문에 작업이 쉽지 않습니다.
메모리가 SQL Server에 할당될 때 일부 노드에 다른 NUMA 노드의 페이지(외부 페이지)가 많이 제공될 수 있습니다. 그러나 이러한 페이지는 소유 노드로 자주 전송되어 해당 노드의 로컬 페이지가 될 수 있으므로 램프 업(ramp-up) 중에 사용되지 않습니다. max server memory 값에 도달할 경우 일부 노드에 외부 메모리가 포함될 수도 있지만 메모리 대상이 획득되면 버퍼 풀에서 로컬 메모리와 외부 메모리를 동일하게 처리합니다. 예를 들어 메모리 부족 시 버퍼 풀에서 로컬 메모리 페이지보다 먼저 외부 메모리를 해제하려고 시도하지 않습니다.
메모리를 특정 노드로 제한
SQL Server가 사용 가능한 NUMA 노드의 하위 집합에서 실행되도록 구성되어 있으면 버퍼 풀은 해당 노드의 메모리로 자동으로 제한되지 않습니다. 이 경우 버퍼 풀을 제한하려면 max server memory 옵션을 사용합니다. max server memory에 대한 자세한 내용은 서버 메모리 옵션을 참조하십시오.
노드에서 메모리 해제
NUMA 사용 시 max server memory 값과 min server memory 값은 NUMA 노드에서 균일하게 분할됩니다. 예를 들어 4개의 노드가 있는 시스템에서 max server memory를 16GB로 설정하면 버퍼 풀은 각 노드에 4GB의 메모리를 할당합니다. affinity mask 설정을 변경하여 노드 중 하나를 오프라인으로 설정하면 max server memory 설정이 나머지 노드에 재배포됩니다. 예를 들어 앞의 4개 노드 예에서 노드 두 개를 오프라인 상태로 만들면 해제된 8GB의 메모리는 나머지 노드에 균일하게 배포됩니다. 버퍼 풀에서 외부 페이지를 사용할 수 있으므로 나머지 노드에 충분한 메모리가 없을 경우 원격 메모리가 사용됩니다. SQL Server가 더 이상 실행되지 않는 노드의 메모리를 사용하지 않도록 하려면 노드를 오프라인 상태로 만든 후 max server memory 설정을 줄여야 합니다.
외부 페이지
노드는 대체로 서로 독립적으로 작동합니다. 노드에 대한 모든 메모리 할당 및 메모리 할당 취소는 해당 노드와 연결된 메모리를 사용하여 수행됩니다. 그러나 노드 N1에서 실행 중인 작업자가 노드 N2의 메모리에 있는 데이터베이스 페이지에 액세스해야 하는 경우에는 로컬이 아닌 메모리에 액세스합니다.
버퍼 풀의 로컬 메모리 및 외부 메모리 확인
Buffer Node 개체를 통해 버퍼 풀을 살펴 볼 수 있습니다. SQL Server에 대한 버퍼 풀의 전체 메모리는 Buffer Manager 개체의 Target pages 카운터로 표시됩니다. 각 노드에 대한 버퍼 풀의 메모리는 Buffer Node 개체의 Target pages 카운터로 표시됩니다. 다른 노드의 메모리는 Foreign pages 카운터로 표시됩니다. 자세한 내용은 SQL Server, Buffer Node 개체 및 SQL Server, Buffer Manager 개체를 참조하십시오.
각 노드에서 자체 메모리에 대해 검사점 수행
각 메모리 노드에는 자체 지연 기록기 스레드가 있습니다. 이 스레드는 암시적 검사점과 명시적 검사점에 대해 모두 호출됩니다. SMP(Symmetric Multiprocessing) 컴퓨터에는 검사점 스레드가 하나뿐이므로 NUMA 사용 시 여러 스레드를 사용하면 검사점의 속도가 향상됩니다.
테이블 검색 동작
여러 노드의 CPU에서 병렬로 검색을 실행하지 않는 경우 노드 N1에서 실행되는 테이블 검색은 노드 N1과 연결된 메모리만 채웁니다. 검색이 단일 노드에서만 실행되는 경우에는 해당 노드의 버퍼 페이지만 사용됩니다. 이 기능은 응용 프로그램에 대한 작업 분할에 도움이 됩니다.