– 오라클 프로세스가 Free Buffer 를 찾는 과정 –


Database Buffer Cache

최근에 사용된
데이타베이스의 데이타 블록을 저장하고 있는 Database Buffer 영역으로 DBWR(Database Writer Process) 에 의해서 관리된다

Free
Buffer
는 오라클 서버 프로세스에 할당되어 사용되고, 사용 후 Dirty Buffer가 된 Buffer들은 DBWR에 의해 디스크에 쓰여진 후 다시 Free Buffer가 되어
오라클 서버 프로세스에 의해 재사용되는 작업을 반복하게 된다.


Free Buffer 를 찾는 과정

1. 오라클 프로세스가 LRU List Lock을 걸고 LRU의 끝부분부터
Free Buffer
블록을 찾기 시작한다. 이를 찾는 중에 Dirty Buffer를 만나면, Dirty Buffer LRUW List에 옮긴다.

2. LRU List를 찾을 때도 끝까지 다 찾는 것은 아니고, Kernel에서
지정하는 어느 특정 값만큼 Depth를 정하여 스캔하며,
개수(foreground scan depth) 내에서 찾지 못하면 오라클 프로세스는 더 이상 LRU List 는 읽지 않고 , DBWR에게 Dirty Buffer를 모으도록 하는 메시지를 보내는 작업이 수행되고 LRU
Latch
는 해제된다.

3. 메시지를 받은 DBWR LRU
Latch Lock
을 걸고, LRU 꼬리 부분에서
DBWR Scan Depth
만큼의 디스크에 쓰여져야 할 Dirty Buffer들을 모으는 Large Batch Write를 수행한다.

4. LRUW에 모인 Dirty Buffer DBWR에 의해 디스크로 쓰여지고 나면 이 Buffer Free Buffer로 되어 다시 사용될 수 있도록 LRU의 끝부분에
위치하게 된다.



* 오라클 Database Buffer Cache 안의 블록들은
모두가 LRU List / LRUW List 둘중 하나에 속하게 된다.


용어 설명

 – LRU(Least Recently Used) List : 최근에 읽혀진 Datafile Block Buffer Cache  보관하고, 새로운 Block 이 파일에서 읽혀질 필요가 있으면 사용한지 가장 오래된 버퍼들부터 메모리에서 없어지도록 관리하기 위한
Buffer Cache 내의 Block List를 유지관리함.

 – Dirty List(LRUW List) : Buffer Cache 안의 Block들은 그 상태에 따라서 다음 세가지 상태를
가진다.

   1. Free Buffer   : Dirty Buffer가 디스크에 쓰여진 후 Free로 마크되어 사용할 수 있는
상태로 되었거나 처음 Load 된 이후 내용이 변경되지 않아 사용 가능한 Buffer

   2. Dirty Buffer  : Datafile 에서 Buffer Cache 로 읽혀진 이후 블록에 변경사항이 발생했는데, 다시 Datafile
Write
되지 않은 상태의 버퍼

   3. Pinned Buffer : 서버프로세스에 의해 사용된 상태의 버퍼

Dirty Buffer들은 오라클 프로세스들이 자신이 사용할 Free Buffer를 찾기 위해 LRU List를 꼬리 부분(LRU)부터 찾아나가다 Dirty Buffer를 만나면 이를 LRUW List에 옮겨놓은
것들로, Buffer들은 결국 DBWR(DB Writer)에 의해 디스크에 쓰여지고 다시 Free
마크되어 LRU List로 가게 된다.


By haisins

오라클 DBA 박용석 입니다. haisins@gmail.com 으로 문의 주세요.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다