III. Touch Count Based Algorithm

1) Touch Count Based Algorithm

2) Touch Count Based LRU List 개요도

  • 이 알고리즘은 LRU 리스트의 메인 리스트에서 사용한다.

– LRU 리스트의 메인 리스트는 크게 핫 영역(hot region)과 콜드 영역(cold region)으로 나누어 진다.
-- 자주 사용되는 블록은 핫 영역에 머무르며, 사용빈도가 낮은 블록은 콜드 영역에 머무른다.
-- 오라클은 개별 버퍼마다 터치 카운트를 관리하며, 프로세스에 의해 스캔이 이루어질 때마다 터치 카운트를 1씩 증가시킨다.
-- 프리 버퍼를 찾을 때 LRU 보조리스트를 검색한 후 없다면 메인 리스트의 콜드 영역 꼬리에서부터 프리 버퍼를 찾는다.
– LRU 끝에 있는 버퍼의 터치 카운트가 1 이하면서 프리 상태일 경우 프리 버퍼로 사용되고 터치 카운트가 2 이상인 블록은 핫 영역의 머리 부분으로 옮겨지고 터치 카운트는 0으로 초기화 된다.

3) Touch Count Based LRU List 개요

  • Block Header는 Touch Count와 Timestamp 정보 관리
  • Block 에 3초 이후에 다시 Access하면 Touch Count가 증가
  • Free Buffer Scan시에 Touch Count가 2 이상인 Block은 Hot End로 이동
  • 만약 2 미만이면 Free Buffer로 이용됨
  • 새로 Cache되는 Block은 Mid Point (Cold End)로 삽입

Touch Count Based Algorithm 관련 Parameter

  • _DB_PERCENT_HOT_DEFAULT : 핫 영역의 크기를 %로 설정
  • _DB_AGING_FREEZE_CR : CR 블록이 핫 영역으로 이동을 막음 불린(boolean)값 설정
  • _DB_AGING_COOL_COUNT : 핫 영역의 블록이 콜드 영역으로 이동할 경우 touch count 초기화 값
  • _DB_AGING_TOUCH_TIME : 터치 카운트 증가 주기 시간, 터치 카운트 증가 후 3초(기본값) 이후에 접근할 경우 터치 카운트 1 증가
  • _DB_AGING_HOT_CRITERIA : 프리 버퍼로 사용할 버퍼 검색 시 핫 영역으로 이동할 수 있는 터치 카운트 크기
  • _DB_AGING_STAY_COUNT : 핫 영역의 머리로 이동 시 터치 카운트 리셋 값

위의 파라미터들은 오라클 히든 파라미터 이므로 수정 시 성능문제를 유발할 수 있으므로 주의한다.

4) Consistent Read에서의 Touch Count

프로세스가 일관성 읽기(consistent read)를 하기 위해서는 해당 블록의 과거 이미지를 가지고 있는 CR 블록(consistent read block)이 필요하다.

슬라이드 내용

  1. 원하는 블록이 버퍼에 현재 SCN 버전인 상태로만 존재할 경우 CR 블록을 생성하기 위한 프리 버퍼가 필요하므로 LRU 리스트 꼬리에서 프리 버퍼를 검색한다.
  2. 현재 버퍼에 있는 current 블록을 새로운 버퍼에 복사(CR copy) 한다.
  3. CR 블록을 만들기 위해 언두(undo)를 적용 시켜 이전 시점의 SCN 정보를 반영한다.

5) Single Block Read에서의 Touch Count

슬라이드 내용

  1. 싱글 블록 I/O가 발생하게 되면 먼저 버퍼에 블록이 존재하는지 검색한다.
  2. 버퍼 내에 블록이 존재 한다면 해당 버퍼에 대해 터치 카운트를 증가시키고 존재하지 않는다면 블록을 버퍼에 올리기 위해 LRU 리스트를 검색한다.
  3. 이때 터치카운트가 1 이하 이고 프리한 상태의 버퍼에 블록을 적재하고 LRU 리스트의 mid-point인 콜드 영역의 머리 부분에 삽입 한다.
  4. 만약 콜드 영역의 꼬리에 있는 버퍼의 터치 카운트가 2 이상이면 핫 영역의 머리 부분으로 이동시킨 후 터치 카운트를 0으로 초기화한다.
  5. 다른 블록들은 콜드 영역 방향으로 한 칸씩 밀려나게 된다.

6) Multi Block Read에서의 Touch Count

슬라이드 내용

  1. 멀티 블록 I/O로 읽을 경우 오라클은 한번에 블록을 DB_FILE_MULTIBLOCK_READ_COUNT의 크기 만큼 읽게 된다.
  2. 예를 들어 DB_FILE_MULTIBLOCK_READ_COUNT가 4일 경우 LRU 리스트의 꼬리에서 4개의 블록을 찾는다.
  3. 블록을 버퍼에 적재한 후 LRU 콜드 영역의 머리에 위치 시킨다.
  4. 4개의 버퍼를 차례대로 읽으면서 읽은 버퍼는 다시 콜드 영역의 꼬리 쪽으로 보내진다.
  5. 다음 멀티 블록 I/O를 위해 다시 콜드 영역의 꼬리에서 프리 버퍼를 검색한다. 이때 전에 꼬리로 이동된 사용했던 버퍼들을 재사용 하게 된다.
  6. 이 작업을 멀티 블록 I/O 동안 반복하게 되므로 다량의 멀티 블록 I/O가 발생해도 일정 수 만의 버퍼만 사용하게 된다.

문서에 대하여