h2.FLM vs ASSM소개
1) FLM: Free List Management. 수동Mode의 Segment공간 관리
2) ASSM: Automatic Segment Space Management. 자동Mode의 Segment공간 관리

FLM이란 프리블록의 리스트(프리 리스트)에 의해 공간을 관리하는 기법을 말함
프리리스트(freelist)와 프리리스트 그룹(freelist group)을 수동으오 설정하며 세그먼트 공간을 관리함

ASSM에서는 프리 블록 목록을 리스트 형태의 일차원적인 구조가 아닌 비트맵을 이용한 다차원 구조로 관리함
ASSM에서는 익스텐트가 추가될 때 해당 익스텐트에 속하는 데이터 블록을 관리하는 여러 개의 L1 BMB들이 생성되며. 이때 L1 BMB별로 소유 인스턴스(owning instance)를 부여함

Oracle 10gR1 까지는 FLM이 디폴트 속성이었지만, 오라클 10gR2부터는 ASSM이 디폴트 속성임

h2.FLM - Segment구성

세그먼트 레벨에서의 프리블록이란, insert작업을 위해 사용 가능한 여유 블록임

다음과 같은 블록들이 프리블록으로 분류됨

  • 익스텐트 가 추가로 할당되는 과정에서 생긴 HWM 아래에 존재하는 한번도 사용되지 않는 블록
  • Insert문에 의해 로우가 추가되었지만, 아직 pctfree 속성에 의해 지정된 영역을 다 사용하지 않느 블록
  • pctfree 속성에 의해 지정 된 영역을 다 소모한 후, 다시 delete나 update에 의해 pctused 속성에 의해 지정된 영역만큼 사용량이 낮아진 블록

프리블록을 결정하는 요소는 세그먼트 생성시부여하는 pctfree속성과 pctused속성임

세그먼트 헤더 블록에는 프리리스트의 머리(head)와 꼬리(tail)값을 가지고 있으며, 각각의 프리블록의 DBA(data block address)값을 가지고 있음
개별 프리블록들은 블록이 프리리스트에 존재하는지의 여부와 다음 프리블록에대한 DBA값을 가지고 있음

h2.FLM 구성 사례1 - Free List가 하나인 경우

  • 여러 Process가 동일 Free Block에 대해 경쟁

h2.FLM 구성 사례2 - Free List가 여러 개인 경우

  • 여러 Instance가 동일 Segment Header Block에 대해 경쟁

h2.FLM 구성 사례3 - Free List Group이 여러 개인 경우

  • Instance간의 Segment Header Block 경합이 해소됨
  • Node Eviction이나 DML불균형이 생겼을경우 Free Block을 활용하지 못하는 문제

h2.FLM - Freelist 관리방법

1) Segment의 Free Block을 Freelist를 이용해서 관리
2) MFL: Mater Free List. Free Block의 목록을 관리하는 Main List. Segment당 하나
3) PEL: Process Free List. Process당 부여되는 Freelist. Segment의 FREELIST속성에 의해 결정
4) TFL: Transaction FreeList. Transaction의 Update/Delete에 의해 Free Block으로 변한 Block들을 관리하는 List.Transaction 내에서 사용

마스터 프리리스트(master freelist, MFL)
세그먼트당 하나씩 존재하는 메인 프리리스트임
모든 프리블록들은 반드시 마스터 프리리스트를 통해 관리됨
가령 익스텐트 할당이나 HWM이동에 의해 새롭게 할당된 프리블록들은 우선 마스터 프리리리스에 속하게 됨

프로세스 프리리스트(process freelist PFL)
세그먼트 생성시 freelist속성에 의해 부여되는 프리리스트임
가령 freelist속성값을 10으로 주면 총 10개의 프로세스 프리리스트가 생성됨
세그먼트를 사용하는 서버 프로세스들은 10개의 프로세스 프리리스트 중 하나를 사용하게 되며, 각 프로세스 프리리스트들은 마스터 프리리스트로부터 필요한 수만큼의 프리블록을 항당 받아 프로세스에게 분배함

트랜잭션 프리리스트(transaction freelist TFL)
트랜잭션을 수행하는 도중 프리 블록으로 변한 블록들의 목록을 관리함
가령 트랜잭션 내에서 특정 블록에서 로우를 delete한 후 이 블록의 상태가 프리블록으로 변하면, 오라클은 이 블록을 즉시 마스터프리리스트로 반환하는 대신에 트랜잭션 기간동안 트랜잭션 프리리스트 내에 자신만의
프리블록으로 사용하게 됨

h2.FLM - Freelist 에 의한 Free Block관리

세그먼트 별로 기본적으로 하나의 마스터 프리리스트 를 할당
세그먼트 생성시 freelist 속성 값에 할당된 수만큼 프로세스 프리리스트를 사용함
디폴트 값이 1인 경우, 마스터 프리리스트가 프로세스 프리리스트로 할용됨

익스텐트 할당에 따라 신규로 확보된 프리블록들은 우선 마스터 프리리스트에 저장함
개별 프로세스가 프리블록을 필요로 하는 시점에 프로세스 프리리스트가 마스터 프리리스트로 부터 필요한 수의 프리블록을 얻어옴

프로세스는 insert작업을 위해 프리브?이 필요한 경우, 프로세스에 해쉬함수를 적용하여 프로세스 프리리스트를 할당받음
자신에게 할당된 프로세스 프리리스트의 블록을 사용하고, 프리블록이 소진되면 마스터 프리리스트에서 프리블록을 얻어옴
마스터 프리리스트에 더 이상 프리블록이 없으면, HW락을 획득하여 프리블록을 확보하고, 익스텐트에 할당된 블록이 모두 사용되면 익스텐트를 할당함

h2.FLM - MFL,PFL,TFL의관계

1) 서버프로세스는 insert작업과 delete작업을 할 예정임
2) 우선, 서버프로세스가 insert작업을 하기 위해 프로세스 프리리스트에서 프리블록을 할당받음
3) 이후 데이터를 delete함
4) Delete로 인해 기존 full상태의 블록이 프리블록이 되어 트랜잭션 프리리스트에 등록됨
5) 프로세스는 트랜잭션이 유지되는 동안, 트랜잭션 프리리스트를 사용함
6) 트랜잭션이 끝나고 사용이 끝난 프리블록은 다시 마스터 프리리스트로 반환됨

h2.FLM - FREELIST/FREELIST GROUP속성

  • FREELIST속성
    • Process Freelist의 수를 결정
    • FREELIST값이 작으면 여러 Process에 의한 Free Block경합 발생
    • buffer busy waits Event로 관찰됨
  • FREELIST GROUP속성
    • Freelist Group의 수를 결정
    • Freelist Group은 Instance마다 독립적인 Master Freelist를 할당 받는다는 것을 의미
    • (FREELIST GROUP값 = Node수)가 이상적인 설정
    • FREELIST GROUP값이 작으면 Node간에 Segment Header 경합 발생
    • gc buffer busy와 gc current류의 Fixed-up Event로 관찰됨

h2.FLM - FREELIST GROUP속성 변경
h3.FREELIST GROUPS = 1인 경우(Default)

  • 동일한 Segment Header Block을 여러 Node가 변경하는 과정에서 경합발생
  • gc buffer busy와 gc current류의 이벤트가 발생

h3.FREELIST GROUPS =2 인 경우

  • 각 Instance별도의 Freelist를 사용하므로 Instance간 경합이 최소화

h2.ASSM - Segment구성

ASSM은 freelist속성을 지정할 필요가 없으며, 각 블록의 상태를 비트맵 값으로 관리하여 비트맵 블록들에 의해 공간관리가 자동화됨

비트맵블록은 총 3단계로 이루어져 있음
세그먼크 헤더에는 루트 블록인 L3 BMB가 존재하며, L3 BMB는 L2 BMB의 포인터 역활을 함
L2 BMB는 브랜치 블록으로 L1 BMB의 포인터 역활을 함
L1 BMB는 데이터 블록의 주소 값을 관리

다음과 같은 블록들이 프리 블록으로 관리됨
1) 익스텐트가 추가로 할당되는 과정에서 생긴 HWM 아래에 존재하는 한번도 사용되지 않는 블록
2) Insert문에 의해 로우가 추가 되었지만, 아직 pctfree 속성에 의해 지정된 영역을 다 사용하지 않는 블록
3) pctfree 속성에 의해 지정된 영역을 다 소모한 후, 다시 delete 나 update에 의해 사용률이 낮아지되, 블록 영유공간의 상태(freeness stats 이하 FS)가 변하는 경우

FLM에서는 풀 블록이 프리블록으로 바뀌는 기준으로 pctused속성이 사용되는 반면, ASSM에서는 pctused속성이 사용되지 않음
ASSM에서는 풀 상태의 블록에서 데이터가 지워지면 FS의 상태가 바뀌어야만, 가령 FS1(0~25% free)에서 FS2(25~50% free)상태로 바뀌는경우에 다시 프리블록으로 인식된다

h2.ASSM(Automatic Segment Space Management)

  • Segment의 Free Block을 Oracle이 자동관리
  • Tree 형태의 세 단계 Bitmap Block들로 Free Block 목록을 관리
  • L3 BMB (루트 BMB)
    • 최상위 Bitmap Block블록. Segment Header Block에 위치
    • L2 BMB 범위를관리
  • L2 BMB (브랜치 BMB)
    • 2단계 Bitmap Block. L1 BMB범위를 관리
  • L1 BMB (리프 BMB)
    • 여러 개의 Data Block여유 정도(Freeness)를 Bitmap으로 관리
    • Unformatted, FS1(~25%),FS2(~50%),FS3(~75%),FS4(~100%),Full (6단계로 관리함)
  • 하나의 L1 BMB는 세그먼트의 크기에 따라 최소 16개에서 최대 1024개의 데이터 블록을 관리하며,관리하는 데이터 블록의 범위는 익스텐트의 경계를 벗어나지 않음

h2.ASSM - L3 BMB, L2 BMB, L1 BMB의 관계

L1 BMB는 각 블록의 여유도 상태(FS)를 관리함
하나의 L1 BMB가 세그먼트 크기에 따라 16개~1024개의 블록 상태를 관리함

L2 BMB는 L1 BMB의 목록을 관리함
하나의 L2 BMB가 여러 개의 L1 BMB를 관리하게됨
L2 BMB는 L1 BMB의 블록주소와 L1 BMB가 관리하는 데이터블록의 최대 여유도, 소유인스턴스를 관리함
오라클은 공간의 효율성을 높이기 위해 가장 여유도가 높은 L1 BMB를 먼저사용함

L3 BMB는 L2 BMB의 목록을 관리함
하나의 L3 BMB가 여러 개의 L2 BMB를 관리하게됨
L3 BMB의 경우 대부분 별도의 물리적인 블록으로 존재하지 않고, 세그먼트 헤더 블록내부에 존재함
세그먼트의 크기가 매우 커서 하나의 L3 BMB로 관리가 불가능 할 때에만 별도의 L3 BMB가 물리적으로 분리됨

h2.ASSM - L1 BMB의 특징

  • 각 Instance가 독립적인 L1 BMB 목록을 관리
  • 따라서 Instance간에 Free Block을 둘러싼 경합이 줄어듬


ASSM은 익스텐트 추가시, 해당 인스턴스에 속하는 데이터 블록을 관리하는 여러 개의 L1 BMB를 생성함
개별 L1 BMB별로 소유 인스턴스를 부여하고, 개별 L1 BMB가 모두 독립적인 데이터 블록 주소의 범위를 관리함

각 인스턴스가 독립적인 L1 BMB목록을 관리하므로, 인스턴스간에 동일한 프리블록을 사용하지 않아 프리블록을 둘러싼 경합이 줄어듬

또한 ASSM은 프리블록 요청정도가 극심하면, 다른 인스턴스가 소유한 L1 BMB를 훔쳐올 수 있음(L1 BMB stealing)
즉, L1 BMB의 소유주가 동적으로 바뀌어 한 인스턴스에서 과도한 insert작업시 노드 간의 경합이 최소화됨

문서에 대하여