LRU/TCH 알고리즘
- 새로운 블록을 메모리에 적재할 때 TCH(touch count) 기반의 modified LRU 알고리즘 사용
- 이전의 LRU 알고리즘은 오브젝트가 사용될 때마다 MRU로 오브젝트가 이동 됨에 따라 래치 활동성 문제(경합)가 있었으며, 이를 해결하기 위해 버퍼 헤더(x$bh)에 카운터(TCH) 및 타임스탬프(TIM) 정보를 추가 함 (버퍼 접근시 마지막 접근 으로부터 3초 지났으면 TCH, TIM 변경)
{note}
보통 cache buffers chains 래치 경합 원인 블록(hot block)을 식별 하기 위해 터치 카운트(TCH)를 이용하나 정답은 아님 (_db_hot_block_tracking, Tanel Poder 의 LatchProf 툴 이용)
30분 동안 초당 1회씩 접근한 버퍼의 TCH : 600 vs 최근 5분간 천만번 접근한 버퍼의 TCH : 100
{note}
LRU/TCH 동작 방식
- 변경사항 : 터치카운트(tch), midpoint 포인터(cold_hd)
- 시나리오 (a) : working data set 으로 새로운 블록 적재
1. 새로운 블록을 working data set 에 적재하기 위해 LRU 끝부터 프리 버퍼 탐색
2. LRU 끝에 위치한 버퍼 선택 (tch=1, pinned 상태 여부(맞으면 패스), 디스크 기록 필요 여부(맞으면 write list 연결) 확인) 하여 배타적으로 pin 설정
3. 해당 버퍼에 블록을 읽어 들이고, 버퍼 헤더 변경
4. LRU 끝에 위치한 버퍼 unlink 후, midpoint(cold_hd)에 다시 연결 후 unpin - 새롭게 LRU 끝에 위치한 버퍼가 x$kcbwds 바라 보고, x$kcbwds.prv_repl 가 해당 버퍼를 바라 보도록 변경
- midpoint 로 이동한 블록 적재 버퍼의 양쪽 버퍼 헤더 변경 및 x$kcbwds.cold_hd 변경
- 이전 cache buffer chain 으로 부터 버퍼 헤더 분리 및 신규 cache buffers chain 에 연결
- 이전 오브젝트 큐로부터 버퍼를 분리, 신규 오브젝트 큐에 연결
{panel:title=LRU/TCH 알고리즘|borderStyle=dashed|bgColor=#FFFFFF|titleBGColor=#F0F0F0}!LRU_TCH 알고리즘.PNG|vspace=4!{panel}
{note}
다수의 working data set 상황 이면, 세션은 프리 버퍼를 제공하는 working data set 중 하나를 선택한 후 cache buffer lru chain 래치를 immediate 모드로 획득 시도 (실패 할 경우 래치 획득 시까지 다음 set 으로 이동)
{note}
버퍼 재 연결
- 시나리오 (b) : working data set 내에 두 번째 블록을 적재하기 위해 수행되는 첫 단계
1. 시나리오 (a) 반복 ( LRU 끝에 위치한 버퍼의 tch 가 4 일 때 어떻게 동작 할까? )
2. 새로운 블록을 working data set 에 적재하기 위해 LRU 끝부터 프리 버퍼 탐색
3. LRU 끝에 위치한 버퍼의 tch 가 4 이므로 MRU 로 이동 (tch 는 반으로 줄임) 후 다음 버퍼의 tch 확인- 자주 사용되는 블록이 MRU 끝으로 이동하는 시점은 LRU 에서 밀려 나갈 때임
- 다수 버퍼가 MRU 끝으로 이동 해서 hot 영역의 버퍼가 midpoint 를 넘어 서게 되면, 버퍼의 tch 가 1 이 됨
- MRU 이동, PIN 상태, 디스크 기록 여부 등을 체크 함 으로서 프리 버퍼 찾는 작업의 지연이 발생 하게 되며 이를 위해 REPL_AUX 제공
REPL_AUX
- 보조 교체 리스트는 즉시 재사용이 가능한 버퍼들의 리스트 이며, 세션이 새로운 블록을 읽어 들일 때, REPL_MAIN 리스트 대신 REPL_AUX 리스트의 LRU 끝 부터 검색 함 (REPL_MAIN 검색시 발생 할 수 있는 지연 요소 제거)
- 인스턴스 시작시 모든 버퍼는 REPL_AUX 연결 됨 ( REPL_MAIN 은 버퍼 없음, alter system flush buffer_cache; )
- REPL_AUX 리스트 에서 선택된 버퍼는 REPL_AUX 리스트에서 분리 후 REPL_MAIN 리스트에 연결
- REPL_MAIN 리스트의 버퍼가 REPL_AUX 리스트로 이동 하기도 함 (dbwr 이 더티 버퍼를 디스크로 기록한 후 등...)
- REPL_AUX 리스트의 목표 크기는 working data set 의 25% 임, 쿼리가 수행 될 수록 x$kcbwds.anum_repl 이 감소 하지만 일정 시간이 지나면 목표 크기 까지 증가 함 (REPL_MAIN 리스트의 LRU 끝에 버퍼가 REPL_AUX 리스트의 MRU 끝으로 이동 하는것으로 추정), 링크드 리스트 검색 시간을 최소화 하기 위해 REPL_AUX 리스트를 관리 하는 것 같음
- _db_percent_hot_default 파라미터 : 기본 버퍼 풀 내의 hot 영역 비율 (default : 50), 이 파라미터의 ½ 이 REPL_AUX 리스트의 목표 크기가 됨
참조 문서
이 자료는 (오라클 코어)를 참고 하여 작성했습니다.