#렛치

{tip:title=렛치는}
메모리 및 일부 핵심 코드 사용의 동시성을 관리하기 위한 락

엔큐에 비해 구조 및 획득 메커니즘이 간단, 매우 짧은 시간내 획득/해제가 수행됨
렛치를 획득한 프로세스가 비정상 종료 된 경우 PMON 이 정리

|

SGA를 관리하는 주요 렛치

영역렛치
{code:noneborderStyle=solid}버퍼 캐시{code}
  • cache buffers chains - Cache Buffer Chain을 탐색시 필요 (하나의 래치가 여러 체인을 보호)
  • cache buffer handles
  • cache buffer lru chain - LRU List 탐색시 필요 (메모리에 블록을 올리기 위한 Free Buffer Scan)
{code:noneborderStyle=solid}공유 풀{code}
  • library cache - Library Cache Chain 검색 시 필요
  • library cache lock - LCO 접근/변경 시 Handle에 대해 획득 필요, LCO의 스펙 보호 (파싱 중 LCO 정의 변경 방지)
  • library cache pin - LCO 접근/변경 시 LCO 에 대해 획득 필요, LCO의 실행정보 보호(실행 중 LCO 실행 정보 변경 방지)
  • library cache load lock
  • row cache objects
  • shared pool - Shared Pool 의 Heap Area 탐색 및 Free Chunk 할당 작업 보호, Shared Pool 당 1개 (하드파싱으로 경합 발생 가능)
{code:noneborderStyle=solid}리두 로그{code}
  • redo allocation - 리두 엔트리를 저장 할때 리두 버퍼 내 공간 할당시 필요 (인스턴스에 한개)
  • redo copy - 할당된 공간에 리두 엔트리를 복사 할때 필요 (병렬 처리를 위해 인스턴스에 복수개)
  • redo writing - 리두 버퍼 내용을 LGWR에 쓰기 요청 할때 필요(인스턴스에 한개)

※ 해시테이블 → 해쉬버켓 → 해쉬체인 → 핸들 → LCO

두가지 모드

{code:noneborderStyle=solid}배타적 모드(X){code}자원 변경 작업, 획득한 프로세스만 단독 사용, 대부분
{code:noneborderStyle=solid}공유 모드(S){code}자원 정보 읽기, 타 프로세스의 공유 모드만 허용


렛치 획득 알고리즘#1

{code:noneborderStyle=solidborderColor=gray}라이브러리 캐시{code}
{code:noneborderStyle=solidborderColor=red}library cache(latch){code}
{code:noneborderStyle=solidborderColor=red}CPU(획득) ②{code}{code:noneborderStyle=solidborderColor=gray}CPU(스핀) ④{code}{code:noneborderStyle=solidborderColor=gray}CPU(스핀) ⑥{code}
{code:noneborderStyle=noneborderColor=red}배타적모드↑ ①{code}{code:noneborderStyle=none}배타적모드↑ ③{code}{code:noneborderStyle=none}배타적모드↑ ⑤{code}
{code:noneborderStyle=solidborderColor=red}프로세스1{code}{code:noneborderStyle=solidborderColor=gray}프로세스2{code}{code:noneborderStyle=solidborderColor=gray}프로세스3{code}

※ 프로세스1 은 library cache 렛치를 획득, 뒤 따르는 프로세스2,3 은 획득 가능 할 때까지 스핀



{info:title=스핀}
프로세스가 렛치를 획득 할 때까지 CPU 자원을 사용하며 반복적으로 2000번(_SPIN_COUNT) 요청 하는 행위, 그래도 획득 못하면 슬립
{info}




렛치 획득 알고리즘#2

{code:noneborderStyle=solidborderColor=red}라이브러리 캐시{code}
{code:noneborderStyle=solidborderColor=green}library cache(latch){code}
{code:noneborderStyle=solidborderColor=red}CPU(획득해제) ⑧{code}{code:noneborderStyle=solidborderColor=gray}CPU(슬립) ⑦{code}{code:noneborderStyle=solidborderColor=green}CPU(획득) ⑨{code}
{code:noneborderStyle=none}  ↑ {code}{code:noneborderStyle=none}배타적모드↑{code}{code:noneborderStyle=none}배타적모드↑{code}
{code:noneborderStyle=solidborderColor=red}프로세스1{code}{code:noneborderStyle=solidborderColor=gray}프로세스2{code}{code:noneborderStyle=solidborderColor=green}프로세스3{code}

※ 프로세스2 는 슬립(latch: library cache), 프로세스1 이 라이브러리 캐시를 사용하면서 렛치 획득 해제, 프로세스3 렛치 획득 (요청 순서 무관)

슬립

스핀 으로 렛치를 획득치 못하면, CPU 자원 사용을 중지 하고 0.01초(X$KSLLCLASS) 대기 하는 행위, 스핀/슬립이 반복 되면 CPU 과부하를 줄이기 위해 슬립 시간이 점점 늘어 난다




렛치 와 성능 저하

렛치 경합이 발생 하면 CPU 사용량이 급격히 올라 가게되며, 해당 렛치 경합과 관련 없는 다른 SQL 도 CPU 실행 대기열 길이 증가로 인해 성능에 영향을 받게 된다.


렛치의 분류

구분정보예제
{code:noneborderStyle=solid}단독 렛치{code}인스턴스에 한개만 존재, 10g 311개, 11g 551개row cache objects, redo copy
{code:noneborderStyle=solid}부모/자식 렛치{code}인스턴스에 하나이상 존재(부모 렛치는 한개), 10g 83개, 11g 76개cache buffer chains(_DB_BLOCK_HASH_LATCHES), cache buffers lru chain(_DB_BLOCK_LRU_LATCHS)


렛치의 요청 형태

구분정보예제
{code:noneborderStyle=solid}대기 가능(Willing To Wait){code}렛치 획득 까지 스핀/슬립 과 함께 대기
{code:noneborderStyle=solid}대기 불가능(No Wait){code}렛치 획득 안되면 그만한 개 이상의 자식 렛치가 존재하는 경우, 렛치 레벨 순서로 획득 요청하지 않는 경우




한 개 이상의 자식 렛치가 존재하는 경우
{code:noneborderStyle=solidborderColor=gray}프로세스3{code}{code:noneborderStyle=solidborderColor=gray}프로세스3{code}{code:noneborderStyle=solidborderColor=red}프로세스3{code}
{code:noneborderStyle=none}  ↓①(대기불가능){code}{code:noneborderStyle=none}  ↓②(대기불가능){code}{code:noneborderStyle=none}  ↓③(대기가능){code}
{code:noneborderStyle=solidborderColor=gray}library cache1{code}{code:noneborderStyle=solidborderColor=gray}library cache2{code}{code:noneborderStyle=solidborderColor=red}library cache3{code}
{code:noneborderStyle=none}  ↑(획득) {code}{code:noneborderStyle=none}  ↑(획득) {code}{code:noneborderStyle=none}{code}
{code:noneborderStyle=solidborderColor=gray}프로세스1{code}{code:noneborderStyle=solidborderColor=gray}프로세스2{code}

※ 한 개 이상의 자식 렛치가 있는 경우, 여분의 렛치가 있음에도 스핀/슬립 할 필요가 없기 때문에 마지막 렛치만 "대기 가능" 형태로 요청하고 그전 렛치들은 "대기 불가능" 형태로 요청 한다.



렛치 레벨 순서로 획득 요청하지 않는 경우
  • 각각의 렛치는 0(하위) ~ 13(상위) 레벨을 가졌으며, 프로세스는 한 개 이상의 렛치를 레벨 순서로 요청 가능
  • 하위 레벨 렛치 획득 후 "대기 가능" 모드로 상위 레벨 렛치 획득 요청 가능 (데드락 방지)
  • 상위 레벨 렛치 획득 후 "대기 불가능" 모드로 하위 레벨 렛치 획득 요청 가능 (렛치 획득 시간 감소)
구분사례
{code:noneborderStyle=solid}상위→하위 간단 사례{code}1. 프로세스1 이 cache buffers lru chain(LEVEL 2) 을 획득함
2. 프로세스1 이 cache buffers chains(LEVEL 1) 를 "대기 불가능" 모드로 요청
3. 프로세스1 이 cache buffers chains(LEVEL 1) 를획득
{code:noneborderStyle=solid}상위→하위 복잡 사례{code}1. 프로세스1 이 cache buffers lru chain(LEVEL 2) 을 획득함
2. 프로세스1 이 cache buffers chains(LEVEL 1) 를 "대기 불가능" 모드로 요청 했으나 이미 프로세스2 가 획득한 상태
3. 프로세스1 이 cache buffers lru chain(LEVEL 2) 획득 해제
4. 프로세스1 이 cache buffers chains(LEVEL 1) 를 "대기 가능" 모드로 요청 후 획득
5. 프로세스1 이 cache buffers lru chain(LEVEL 2) "대기 가능" 모드로 요청 후 획득




렛치 관련 동적 뷰

V$LATCHNAME (렛치 기본 정보)
주요 컬럼설명
LATCH#렛치 번호
NAME렛치 이름
HASH렛치 해시 값


V$LATCH (렛치 통계 정보, 부모(V$LATCH_PARENT)/자식(V$LATCH_CHILDREN) 렛치 통계는 통합되어 보여짐)
주요 컬럼설명
ADDR렛치 주소 값
GETS대기 가능 모드로 렛치를 요청한 횟수
MISSES대기 가능 모드로 렛치를 요청했을 때 렛치를 바로 획득하지 못하고 대기 횟수 즉, 스핀한 횟수
SLEEPS대기 가능 모드로 렛치를 요청했을 때 슬립한 횟수
IMMEDIATE_GETS대기 불가능 모드로 렛치를 요청한 횟수
IMMEDIATE_MISSES대기 불가능 모드로 렛치를 요청하였을 때 렛치 획득에 실패한 횟수
SPIN_GETS대기 가능 모드로 요청했을 때 스핀을 수행하다가 렛치를 획득한 횟수
WAIT_TIME대기한 총 시간(단위: 1/100,000초)


V$LATCHHOLDER (현재 렛치를 획득하고 있는 세션 정보)
주요 컬럼설명
PID렛치를 획득하고 있는 세션의 프로세스 ID
SID렛치를 획득하고 있는 세션의 세션 ID
LADDR획득한 렛치 주소 값, 다른 렛치 관련 동적 뷰의 ADDR 컬럼과 조인 가능
NAME획득한 렛치 이름


V$LATCH_MISSES (렛치 획득 실패 통계)
주요 컬럼설명
PARENT_NAME부모 렛치 이름
NWFAIL_COUNT대기 불가능 렛치 획득 실패 횟수
SLEEP_COUNT슬립 횟수
WTR_SLP_COUNT렛치 획득 대기자가 슬립한 횟수
LOCATION획득 실패가 발생한 정확한 위치