Latch
설명
오라클이 사용하는 제어 구조 중 하나. 자원에 대한 접근을 직렬화 (Serialize) 하는 것이 목적. SGA의 특정 메모리 구조체에 대한 액세스 (Libaray Cache Latch, Cache Buffers Chains Latch) 혹은 메모리 할당 (Shared pool Latch) 에 사용되거나 Redo 로그 쓰기 작업 (Redo Writing Latch) 에도 사용됨
특징
- Enqueue와는 다르게 큐로 관리되지 않으므로 먼저 요청한 프로세스가 먼저 Latch를 얻는다는 보장이 없음 (대부분 Exclusive 모드로 얻음)
- 그러므로 Enqueue 보다 하위 레벨에서 Locking 자체의 부하를 최소화하며 작동함
Latch 종류 확인
--19c 기준으로 약 1100개가 있음
SELECT * FROM V$LATCHNAME;
Latch 정보 확인
--각 Latch의 얻은 횟수, Sleep에 들어간 횟수 확인
--얻은 횟수 (GETS) 와 Sleep (SLEEPS) 의 비율, Sleep이 몇 번의 사이클이 돌았는지 여부 (사이클이 많을 수록 심각성 증가)
SELECT * FROM V$LATCH;
/*
ADDR LATCH# LEVEL# NAME HASH GETS MISSES SLEEPS IMMEDIATE_GETS IMMEDIATE_MISSES WAITERS_WOKEN WAITS_HOLDING_LATCH SPIN_GETS SLEEP1 SLEEP2 SLEEP3 SLEEP4 SLEEP5 SLEEP6 SLEEP7 SLEEP8 SLEEP9 SLEEP10 SLEEP11 WAIT_TIME CON_ID
...
(VARBYTES) 23 7 process allocation 2600548697 5453 17 1 0 0 0 0 16 0 0 0 0 0 0 0 0 0 0 0 8067 0
...
*/
Latch 얻는 방식
- Willing to Wait 모드
- Latch를 얻는데 실패한다면 얻을 수 있을 때까지 재시도를 하는 방식
- 일반적으로는 Willing to Wait 모드로 Latch를 얻는 경우가 많음 (Redo Copy Latch는 예외)
- 일반적인 재시도 흐름
- 정해진 횟수만큼 재시도
- Sleep에 들어간 뒤 타임아웃이 되어 재시도 (Sleep에 들어가면 Latch Free 대기 이벤트가 발생)
- No Wait 모드
- Latch를 얻는데 실패한다면 해당 Latch에 대해서 얻는 것을 포기하는 방식
- 그러모르 Latch 관련 대기가 발생하지 않음
- 일반적으로 사용되는 경우
- 동일한 Latch가 여러 개 존재할 때 그 중 하나만 얻으면 문제가 없는 경우 (전부 실패한다면 Willing to Wait 모드로 전환)
- Dead Lock을 피해야 하는 경우
- 모든 Latch에는
LEVEL
이 있어서 해당LEVEL
에 따라 Latch를 얻어야 함 - 이 순서가 깨지는 경우 No Wait 모드로 시도를 함
- 만약 Latch를 얻는데 성공했다면 그대로 진행
- 만약 Latch를 얻는데 실패했다면 No Wait 모드이기 때문에 Dead Lock 상태에 들어가지 않음
- 모든 Latch에는
Parent Latch
--Parent Latch
SELECT * FROM V$LATCH_PARENT;
하나의 Latch로만 운영되는 Latch를 말함 (예를 들어 Shared Pool Latch의 경우 Shared Pool 안에서 메모리 할당을 위해 얻어야하는 Latch로 시스템에 하나만 있음)
Child Latch
--Child Latch
SELECT * FROM V$LATCH_CHILDREN;
동일한 기능을 가진 Child Latch들이 Set로 운영되는 Latch를 말함 (예를 들어 Cache Buffers Chains Latch의 경우 같은 이름의 Latch들이 서로 나누어서 담당함)