SQL 서버는 자기자신의 메모리 영역을 효율적으로 사용하기 위해 워크스페이스라 불리는 영역을 할당해서 관리한다.
워크스페이스는 다양한 용도별로 준비되는 영역이다.
워크스페이스의 사이즈 조정, 획득 및 내부 컴포넌트 할당 등의 메모리 관리 작업은 메모리 매니저라 불리는 컴포넌트가 담당한다.
< 메모리 매니져 >
SQL 서버 프로세스의 내부에서는 유저의 요구와 내부 컴포넌트 등의 다양한 TASK가 실행되고 있다.
각 태스크는 다양한 처리를 실행하기 위해 메모리를 획득할 필요가 있다.
예를들면, 컴파일된 쿼리 실행 플랜을 메모리상에 배치하는 영역이 필요하다.
또는 클라이언트의 요구로 결과 세트의 정렬이 필요한 경우는 해당 TASK 영역이 메모리상에 필요하다.
(이러한 용도 외에도 메모리를 필요로하는 수많은 TASK가 존재한다.)
메모리 매니저는 TASK에서 메모리 획득 요구를 받으면 워크스페이스에서 메모리를 할당한다.
< 워크스페이스의 내부 구조 >
워크스페이스 내에는 Fixed Size Block Allocator라 불리는 컴포넌트가 존재한다. Fixed Size Block Allocator는 미리 몇 가지 사이즈의 메모리 영역을 준비해둠으로써 메모리를 필요로 하는 컴포넌트에 신속하게 건네는 장치이다.
Fixed size Block Allocator 가 준비해두는 메모리 영역의 사이즈는 8KB, 16KB, 32KB, 128KB 4종류이다.
만약 요구된 메모리의 사이즈가 이들 4종류와 일치하지 않는 경우는 그 사이즈를 포함하는 가장 작은 메모리 블록이 할당된다 (BEST FIT 방식)
가령 10KB의 메모리 획득 요구가 있는 경우는 16KB 의 Fixed Block Allocator 메모리를 할당한다.
본래 필요한 사이즈보다 큰 사이즈의 메모리를 할당하는 일이 있기 때문에 언뜻 불편하게 생각된다.
그러나 여분의 메모리 할당을 방지하려면 메모리 획득 요구를 받을 때마다 각 요구에 맞는 사이즈의 메모리 블록을 할당하기 위한
처리를 실행해야 하기때문에 CPU 리소스 등의 부하를 발생시킨다.
시스템 전체의 스루풋이라는 관점에서 양자를 비교한 경우 내부컴포넌트에서 메모리를 요구할 때마다 딱 맞는 사이즈의 메모리를 할당하는 것보다는 Fixed Size Block Allocator 를 사용하는 편이 낫기 때문에 해당 방식을 선택하고 있다.
Fixed Size Block Allocator는 계층 구조로 되어있다.
개개의 Fixed Size Block Allocator가 관리하는 사이즈의 메모리 블록이 비어 있지 않은 경우는 계층 구조상 보다 상위의 Fixed Size Block Allocator로부터 메모리를 획득하고 그중에서 할당을 수행한다.
워크스페이스는 프래그먼트(예약 영역)로서 프래그먼트 매니저라 불리는 컴포넌트에 의해서 관리된다.
예약 영역의 사이즈는 아키텍처에 따라 다르게 구성된다.
Fixed Size Block Allocator 최상위에 있는 Top Level Block Allocator라 불리는 컴포넌트가 프래그먼트에서 메모리를 획득한다. Top Level Block Allocator 가 획득하는 사이즈는 고정되어 있어 32BIT 버전에서는 4MB, 64비트 버전에서는 128MB 이다.
'DB ARCHITECTURE' 카테고리의 다른 글
sql server 데이터베이스 구조의 원리(1) - 데이터 파일 (0) | 2022.05.25 |
---|---|
sql server 메모리 관리(5) - 메모리의 용도 (0) | 2022.03.28 |
sql server 메모리 관리(3) - NUMA(Non-Uniform Memory Architecture) (0) | 2022.03.26 |
sql server 메모리 관리(2) - 가상 어드레스 공간의 관리 (2) | 2022.03.25 |
sql server 메모리 관리(1) - 가상 어드레스 공간 (0) | 2022.03.22 |