study:oracle:adv_owi_10g:latch_and_lock
목차
Latch and Lock
- 오라클은 latch 와 lock 이라는 Synchronization(동기화) 매커니즘을 이용하여 리소스를 보호한다.
- latch 와 lock 를 둘 다 동시작업으로부터 자원을 보호하는 것이다.
- OWI를 이용하면 latch와 lock에 의한 경합현상을 직관적으로 파악할 수 있다.
latch와 lock의 차이점
| 분류 | 래치(latch) | 락(lock) |
|---|---|---|
| 목적 | 메모리구조에 대한 베터적인 접근 | 1. 동일리소스 공유(호환O) 2. 배타적인 접근(호환X) |
| 사용범위 | SGA내부구조 | 데이타베이스 데이타 메타데이터 접근제어 트랜젝션 단위 |
| 획득방식 | 2가지 모드 | 6가지 모드 |
| 범위 | SGA 내부 | 데이터베이스 내부 |
| 복잡도 | 단순 | 복잡 |
| 지속기간 | 아주 짧은 순간 (microsecond 단위) | 일정시간 동안 지속 (트랜잭션 단위) |
| 큐(Queue) | Queue로 관리 안함 | Queue로 관리 |
| DeadLock | 발생안함 | 발생함 |
Latch
Latch 정의
- 가벼운 락(Lock)
- 오라클 메뉴얼에서 분류하는 방법
- 아주 빠른 속도로 작동하게끔 구현된 경량화된 락
- 일반적으로는 Latch와 Lock 을 전혀 다른 객체로 분류
- 물리적으로 Shared Pool 영역에 존재하는 일종의 메모리 구조체
- 매우 간단하고 작은 메모리영역 사용
Latch가 보호하는 Resource
- Latch가 보호하는 Resource : SGA
- SGA의 특정영역을 탐색하거나 변경하고자 하는 프로세스는 반드시 해당 영역을 관장하는 latch를 획득해야 한다.
- Latch를 통해서 Oracle의 SGA자원을 보호한다.
- Shared Pool 래치
- 새로운 SQL문을 실행하고자하는 프로세스는 해당 SQL을 Shared Pool의 library cache 영역에 올린다.
이 때 필요한 Heap Memory 영역을 할당받기 위해 획득하는 래치이다. - Shared Pool 래치는 보통 전체 인스턴스에 하나만 존재하므로
한번에 하나의 프로세스만이 Heap으로부터 Chunk를 할당 받을 수 있다.
- Cache Buffers Chains 래치
- Select 문을 통해서 특정 datablock을 읽기 위해서
datablock의 DBA(Data Block Address)와 Class에 해당하는 Hash Chain에 접근하고자 하는 모든 프로세스는
반드시 해당 해시 체인을 관장하는 cache buffers chains 래치를 획득한다.
- redo copy 래치
- DML을 통해서 데이터를 변경한 모든 프로세스는 PGA영역에 Redo 데이터를 생성하는데,
이 리두 데이터를 Redo buffer로 복사하기 위해서 획득하는 래치이다.
latch 분류
| 분류기준 | 설명 | 조회 뷰 |
|---|---|---|
| Parent latch(부모래치) | 여러 개의 자식래치를 거느리는 래치 | V$LATCH_PARENT |
| Solitary latch(독립래치) | 전체 인스턴스에 단 하나만 존재하는 래치 | |
| Child latch(자식래치) | 부모래치에 속한 래치 | V$LATCH_CHILD |
Latch 동작 매커니즘
latch level(래치레벨)
- 래치 획득과정에서 데드락을 원천적으로 방지하기 위해 모든 래치에 레벨을 부여
- 레벨을 14가지 ( 0 ~ 13 )
- 자식래치들은 부모래치와 동일한 레벨값을 갖는다.
latch mode
- 기본적으로 Exclusive 모드 (한 순간에 하나의 프로세스만이 래치를 보유)
- 그러나, cache buffers chains 래치는 읽기작업의 경우 Shared 모드를 사용한다.
latch 획득
Willing-to-wait 모드의 래치 획득
- 기본모드(Willing-to-wait 모드)
- 래치를 획득할 수 있을 때까지 대기한다.
- 최초 래치 획득 실패시 곧바로 SLEEP 하지 않고 SPIN을 수행하는 이유 2가지 ? (ㅋㅋ)
- 스핀을 시도하고도 래치를 획득하는데 실패한 프로스세스는 SLLEP 상태로 바뀐다.
SLEEP 상태의 프로세스가 깨어나는 방법 2가지 ? - latch wait posting
- 조회 뷰 : V$LATCH
- 컬럼 : GETS, MISSES, SPIN_GETS SLEEPS
No-wait 모드의 래치 획득
- 다음과 같은 특수한 경우에 No-wait 모드를 획득
- 현재 다른 래치들을 보유하고 있는 프로세스가 현재 보유한 래치 중 가장 최근에 획득한 래치보다 더 낮거나 같은 레벨의 래치를 획득하고자 할때
- redo copy 래치와 같은 특수한 래치
latch Cleanup
- Shared Memory 훼손(매우 심각한 문제)로 래치를 Cleanup하는 메커니즘
- 프로세스가 래치를 보유한 채로 종료되면 PMON은 각 래치마다 구현되어 있는 Cleanup function을 호출한다.
- 각 래치의 Cleanup function은 래치복구영역에 기록된 정보를 이용해서 공유메모리영역을 원래상태로 복구하고,
이 작업이 끝나면 PMON은 래치를 해지한다.
Latch 관련 Dynamic Views
| V$LATCH | 모든 래치들의 통계에 대한 합계치 정보 |
|---|---|
| V$LATCH_MSSES | 래치 MISS가 발생한 커널코드의 영역에 대한 정보 |
일반적인 Latch 관련 대기이벤트들
| latch: cache buffers chains | buffer cache 에서 특정 블록을 탐색하고자 하는 프로세스가 획득 |
|---|---|
| latch: cache buffers lru chains | buffer cache 에서 free buffer와 dirty buffer 를 탐색하고자 하는 프로세스가 획득 |
| latch: shared pool | Shared Pool의 Heap 영역에서 새로운 Chunk를 할당받고자 하는 프로세스가 획득 |
| latch: library cache | Library Cache 영역(TABLE,VIEW 등 SQL문수행관련모든정보 보관)을 탐색하고자 하는 프로세스가 획득 |
| latch: redo copy | DML에 의한 변동사항을 Redo buffer에 기록하고자 하는 프로세스가 작업하는 동안 획득 |
- 그 외 래치정보는 V$LATCHNAME 뷰에서 조회가 가능한다.
Lock
Lock의 분류
- Enqueue 락
- User Type Lock :
- System Type Lock :
- 일반 락
- row cache lock
- library cache lock
- library cache pin
- buffer locok
Lock이 보호하는 Resource
| latch | SGA 보호 |
|---|---|
| lock | 데이터베이스 전체 보호 |
| Enqueue 락 | V$LOCK |
|---|---|
| 일반 락 | V$SESSION_WAIT |
Lock 동작 매커니즘
lock mode
락모드(0~6)
| 모드 | 설명 |
|---|---|
| 0 | None |
| 1 | NULL(N) |
| 2 | Sub-Shared(SS) Row-Shared(RS) |
| 3 | Sub-Exclusive(SX) Row-Exclusive(RX) |
| 4 | Shared(S) |
| 5 | Shared-Sub-Exclusive(SSX) Shared-Row-Exclusive(SRX) |
| 6 | Exclusive(X) |
락모드호환성
| N | SS | SX | S | SSX | X | |
|---|---|---|---|---|---|---|
| N | O | O | O | O | O | O |
| SS | O | O | O | O | O | X |
| SX | O | O | O | | X | X |
| S | O | O | | O | X | X |
| SSX | O | O | X | X | X | X |
| X | O | X | X | X | X | X |
lock 획득
Lock 관련 Dynamic Views
| V$LOCK |
|---|
| V$LOCKED_OBJECT |
| V$ENQUEUE_LOCK |
| DBA_WAITERS |
일반적인 Lock 관련 대기이벤트들
| row cache lock |
|---|
| buffer busy waits |
| read by other session |
| library cache lock |
| library cache pin |
| DFS lock handle |
study/oracle/adv_owi_10g/latch_and_lock.txt · 마지막으로 수정됨: 저자 starlits
