<가상 어드레스 공간의 관리>
프로세스에 할당된 가상 어드레스 공간의 모든 영역은 다음 세개의 상태중 하나의 상태에 있다.
1. COMMITED
2. RESERVED
3. FREE
1.COMMITED
가상 어드레스 공간 내에서 실제로 사용되고 있는 영역이다.
이 영역에 대해서는 윈도우 오퍼레이팅 시스템이 물리메모리의 영역을 할당하고 있다.
즉, 커밋된 상태의 메모리 영역은 물리 메모리에 확보되어 있다.
2.RESERVED
나중의 사용에 대비해서 가상 어드레스 공간의 영역이 예약된 상태이다. 이 상태에서는 물리 메모리는 전혀 할당되어 있지 않다.
SQL 서버는 실행 시에 필요 최소한의 영역만은 커밋된(Commited) 상태로 하고 나머지 부분을 예약된(Reserved) 상태로 둔다.
메모리 할당 동작에서 커밋된(Commited) 상태로 하려면 보다 많은 시간이 걸리 때문에 우선 필요한 최소한의 사이즈만을 Commited로 설정하고 나머지 부분은 필요할 때
적당히 Reserved에서 Commited 로 변경하는 방법이 채용되고 있다.
3.FREE
Free 한 상태에 있는 영역에는 자유롭게 메모리 할당이 가능한 영역이다.
프로세스는 자기자신에게 필요한 용도로 해당 영역을 사용할 수 있다.
다만 원칙적으로 SQL 서버는 컴퓨터에 탑재되어 있는 크기(물리적 메모리 크기)보다 큰 크기의 가상 어드레스 공간을 사용하지 않는다. (메모리 영역이 페이지 아웃되는 것을 방지하기 위함)
따라서 2GB 사용 가능해도 물리 메모리의 사이즈에 따라서는 실제는 많은 영역이 Free 인채 남아 있을 수도 있다.
즉, SQL server 에서는 물리 메모리 이상의 크기를 Reserved 또는 Commited 로 할당하지 않는다.
<가상 어드레스 공간의 관리해주는 함수>
가상 어드레스의 공간을 관리해주는 함수는 아래와 같다.
1. VIRTUALALLOC FUNCTION
2. PAGING FUNCTION
1. VIRTUALALLOC FUNCTION
SQL 서버가 가상 어드레스 공간의 영역을 조작할 때는 Win32 API인 VirtualAlloc함수를 사용한다.
VirtualAlloc 함수를 MEM_RESERVE 플래그와 함께 사용하면 지정된 가상 어드레스 공간 내의 영역은 Reserved 상태가 된다.
VirtualAlloc 함수를 MEM_COMMIT 플래그와 함께 사용한 경우에는 지정된 영역의 상태는 Commited 가 된다.
MEM_RESERVE 플래그를 지정한 경우에는 확보하는 영역의 크기는 64KB의 배수만 허가된다.
또한, MEM_COMMIT 플래그와 함께 지정할 수 있는 영역의 크기는 4KB 의 배수이다.
두 플래그의 크기가 다르기 때문에, 예를들어 64KB 의 영역을 Reserved 한 후 8KB 의 영역을 Commited로 해서 사용한 경우 나머지 56KB 의 영역은 확보한 채 사용하지 않는다.
이것은 가상 *어드레스 공간의 단편화(Fragmentation)를 발생시켜 메모리의 효율적인 사용을 저해하기 때문에 애플리케이션을 작성할 때는 주의가 필요하다.
*어드레스 공간의 단편화(Fragmentation) => 메모리 단편화(Memory Fragmentation)
메모리의 공간이 작은 조각으로 나뉘어져 사용가능한 메모리가 충분히 존재하지만 할당(사용)이 불가능한 상태를 메모리 단편화가 발생했다고 한다.
메모리 단편화는 내부 단편화(Internal Fragmentation)와 외부 단편화(External Fragmentation)로 나눌 수 있다.
내부 단편화 (Internal Fragmentation)
- 메모리를 할당할 때 프로세스가 필요한 양보다 더 큰 메모리가 할당되어서 프로세스에서 사용하는 메모리 공간이 낭비 되는 상황
- 예를 들어 메모장을 켰는데 OS가 4kb를 할당해줬다. 그런데 사실상 1kb만큼만 사용하고 있을 때 필요 이상으로 프로세스가 메모리를 할당받았으므로 내부 단편화가 3kb만큼 생긴 것.
외부 단편화 (External Fragmentation)
- 메모리가 할당되고 해제되는 작업이 반복될 때 작은 메모리가 중간중간 존재하게 된다. 이 때 중간중간에 생긴 사용하지 않는 메모리가 많이 존재해서 총 메모리 공간은 충분하지만 실제로 할당할 수 없는 상황
- 예를 들어 메모리 처음 주소에 8mb짜리 프로세스가 할당되었고 바로 이어서 16mb짜리 프로세스가 할당되었다고 가정했을 때 8mb짜리 프로세스를 종료시키면 메모리 처음 주소부터 8mb만큼 공간이 생긴다.
이런 식으로 계속해서 빈 메모리가 쌓이는데 예를 들어서 빈 메모리의 공간중에 제일 큰 빈 메모리가 8mb라고 한다면 9mb짜리 프로세스를 할당을 해야할 때 마땅한 공간은 없지만 전체적으로 메모리 여유는 있을 때 외부단편화가 생겼다고 한다.
2. PAGING FUNCTION
모든 프로세스가 자기자신의 가상 어드레스 공간을 물리 메모리에 전개하는 것은 물리적인 메모리 크기의 제약으로 인해 제한된다.
가상 어드레스 공간과 물리 메모리의 크기 간에 있는 갭을 메우기 위해 윈도우 오퍼레이팅 시스템에서는 페이징(paging)이라 불리는 수단이 채용되고 있다.
페이징에서는 물리 메모리가 부족한 경우 오퍼레이팅 시스템에 의해서 그 시점에서 불필요하다고 판단된 메모리상의 데이터가 페이지 단위로 하드디스크상의 페이지 파일에 기록된다.
페이지 파일에 기록된 영역은 다른 데이터를 물리 메모리상에 읽어들이기 위해 사용된다. 또한 일단 페이지 파일에 기록한 데이터도 다시 필요하면 페이지 파일에서 물리 메모리로 읽어들인다.
위와 같은 오퍼레이션은 가상 기억 영역을 실현하기 위해 필요한 동작이기는 하지만, 퍼포먼스에 악영향을 미친다.
예를들어 SQL 서버가 사용하고 있는 메모리 영역이 페이징 대상이 된 경우를 생각해보자.
SQL 서버는 데이터를 효율적으로 처리하기 위해 디스크에서 읽어들인 데이터를 메모리에 저장하고 있다.
이 메모리가 페이징의 대상이 되어 페이지 파일에 기록되어 버리면 물리 메모리상에 저장되어야할 데이터에 엑세스하고자 할 때 페이지 파일에서 읽어들이게 된다.
따라서 SQL 서버가 데이터를 메모리상에 저장함으로써 얻을 수 있는 퍼포먼스상의 이점이 사라지게 된다.
이러한 경우의 대처 방법으로 SQL 서버가 사용하는 메모리의 대부분을 물리 메모리로부터 페이지 파일에 적는 것을 제어하는 수단이 준비되어 있다.
메모리의 페이지 잠금(Lock Pages In Memory) 특권을 SQL 서버의 실행 어카운트에 추가하면 페이징의 대상이 되는 것을 피할 수 있다.
그러나 SQL 서버가 사용하는 메모리를 물리 메모리상에 상주시킴으로써 다른 프로세스의 메모리 획득에 악영향을 미칠 가능성도 있기 때문에 신중하게 대처해야한다.
'DB ARCHITECTURE' 카테고리의 다른 글
sql server 메모리 관리(4) - 프로세스 내부 메모리 관리 방법 (0) | 2022.03.27 |
---|---|
sql server 메모리 관리(3) - NUMA(Non-Uniform Memory Architecture) (0) | 2022.03.26 |
sql server 메모리 관리(1) - 가상 어드레스 공간 (0) | 2022.03.22 |
SQL SERVER 가 수행하는 I/O의 특징적 동작 (0) | 2022.01.22 |
SQL SERVER 액세스 패턴 (0) | 2022.01.21 |