Latch 개요
Latch
- 가벼운 Lock(Light-weight Lock)
- 공유 Memory 영역(SGA)을 보호하기 위한 동기화 객체
- SGA 내부에 정보가 존재하며, 로컬 인스턴스에서만 볼 수 있다.
- 단순한 CPU 명령어를 사용하여 구현.(구현이 쉽고 가벼움)
- Willing-to-wait과 no-wait 두 가지 모드로 요청 가능.
- 아주 짧은 시간만 지속(microsecond 단위)
- 래치는 데드락이 발생되지 않도록 구현
- (래치의 데드락 발생시 ora-600 에러 발생)
- 래치는 기본적으로 exclusive 모드로 동작
- (9i 이후 버전은 cache buffer chains 래치는 경합을 줄이기 위해 shared 모드 지원)
<p.3 슬라이드 - 래치 획득 과정>
1. Process A가 래치 획득 시도 (해당 래치를 점유한 Process가 존재하지 않으므로 래치 획득)
2. 래치가 보호하고 있는 SGA 리소스 Area1, Area2를 사용
3. Process B가 래치 획득 시도 (Process A가 래치를 점유하고 있으므로 래치 획득 실패)
Latch 개요
- Latch가 보호하는 Resource
- Latch는 SGA의 모든 하위 Memory 영역을 보호
예) Cache Buffer, Shared Pool, Library Cache, Redo Buffer, ... - SGA 영역을 탐색하는 모든 행위는 래치 획득 후에만 가능
- 래치는 SGA 메모리 영역을 보호하는 메모리 구조체이므로, 새로운 SGA 메모리 영역이 추가되면, 이를 보호하는 래치도 추가 된다.
- 메모리 영역의 속성에 따라 하나의 래치 혹은 여러 개의 래치로 보호
- 독립 래치와 부모 래치의 정보는 V$LATCH_PARENT 에서 확인
- 자식 래치의 정보는 V$LATCH_CHILDREN 에서 확인.
- Memory 영역의 속성에 따라 하나 혹은 여러 개의 Latch 사용
- 여러 개의 Latch를 사용하는 경우 Parent/Child의 관계
- Cache Buffer : 수천 개 ~ 수 만 개의 Latch
- Shared Pool : 하나의 Latch
- Library Cache : CPU 개수에 비례
- Redo Buffer : 하나 ~ 여러 개의 Latch
- Cache buffers chains 래치
- 버퍼 캐시의 크기가 16M이상 1G 이하까지의 cache buffers chains 래치의 개수는 1024
- 버퍼 캐시의 크기가 증가함에 따라 단계적으로 증가
- cache buffers chains 래치의 개수는 _DB_BLOCK_HASH_LATCHES 파라미터 값을 이용하여 조절 가능
- Shared pool 래치
- Shared pool 래치는 하나의 shared pool에 하나만 존재
- 오라클 9i이상부터는 CPU_COUNT 파라미터 값이 4 이상이고 shared pool의 크기가 250M 이상인 경우 _KGHDSIDX_COUNT 파라미터 값만큼 서브 풀(sub pool)을 생성하여 shared pool을 관리할 수 있다.
- 오라클 9i 이전 버전에서는 하나의 shared pool 래치를 오라클 9i 이상부터는 다수의 shared pool 래치를 사용할 수 있다.
- 라이브러리 캐시 래치
- CPU_COUNT 파라미터 값보다 큰 소수 중 가장 작은 수만큼 라이브러리 캐시 래치를 사용.
- CPU 개수가 4인 시스템에서는 5개의 라이브러리 캐시 래치를 사용한다.
Latch 획득 Mechanism
- Spin vs Posting
- Spin
- Short wit 래치
- Exponential backoff sleep algorithm(기하급수적 증가) 사용
(1, 1, 2, 2, 4, 4, 8, 8, 16, 16, 32, 32, ....(1/100초 단위)) - Latch 획득 실패 시 Spin을 수행하며 재시도
- Spin에 의한 재시도에서 실패 시에는 Sleep & Wake
- 슬립할 수 있는 최대 시간은 _MAX_EXPONENTIAL_SLEEP 파라미터의 수치까지 증가 (default 2초)
- 하나 이상의 래치를 소유하고 있는 프로세스가 슬립 하게 되면 _MAX_SLEEP_HOLDING_LATCH 파라미터에 정의된 수치만큼만 슬립 가능(default 0.04초)
- 순서 보장 안됨
- CPU가 하나일 경우는 스핀을 수행하지 않음
- Spin 방식을 사용하는 래치(대부분의 래치)
- cache buffers chains 래치
- cache buffers lru chain 래치
- row cache objects 래치
- Posting
- Long wait 래치
- Latch 획득 실패 시 Wait List에서 대기
- Latch Holder가 Post(알려줌)해주면 Latch 획득 다시 시도
- 순서 보장 않됨
- library cache latch, shared pool latch 등에서 사용
Sping에 의한 Latch 획득
<p.6 슬라이드>
1. Process A 래치 획득 시도 (해당 래치를 점유한 Process가 존재하지 않으므로 래치 획득)
2. Process B 래치 획득 시도 (Process A가 래치를 점유하고 있으므로 래치 획득 실패)
3. Process B는 _SPIN_COUNT의 수 만큼 스핀을 수행(스핀을 수행한 후 다시 래치 획득 시도)
spin으로 인한 CPU 사용률 증가
4. 만일 여러 번의 스핀을 반복한 후에도 래치를 획득하지 못할 경우, Process B는 슬립 상태로 전환
5. Process B는 일정시간이 지나면 깨어나서 다시 래치 획득 시도
Posting에 의한 Latch 획득
<p.7 슬라이드>
1. Process A 래치 획득 시도 (해당 래치를 점유한 프로세스가 존재하지 않으므로 래치 획득)
2. Process B 래치 획득 시도 (Process A가 래치를 점유하고 있으므로 래치 획득 실패)
3. Process B를 대기목록(wait list)에 등록
4. Process A가 자원을 해제할 때 대기목록으로 알려 줌
5. 대기목록에서 대기하던 프로세스 중 하나가 래치를 획득
(순서보장을 하지 않기 때문에 대기목록에 존재하지 않는 프로세스가 래치를 획득할 수도 있음)
문서에 대하여