{tip:title=렛치는} 메모리 및 일부 핵심 코드 사용의 동시성을 관리하기 위한 락 |
엔큐에 비해 구조 및 획득 메커니즘이 간단, 매우 짧은 시간내 획득/해제가 수행됨
렛치를 획득한 프로세스가 비정상 종료 된 경우 PMON 이 정리
|
영역 | 렛치 | |
---|---|---|
{code:none | borderStyle=solid}버퍼 캐시{code} |
|
{code:none | borderStyle=solid}공유 풀{code} |
|
{code:none | borderStyle=solid}리두 로그{code} |
|
※ 해시테이블 → 해쉬버켓 → 해쉬체인 → 핸들 → LCO
{code:none | borderStyle=solid}배타적 모드(X){code} | 자원 변경 작업, 획득한 프로세스만 단독 사용, 대부분 |
{code:none | borderStyle=solid}공유 모드(S){code} | 자원 정보 읽기, 타 프로세스의 공유 모드만 허용 |
{code:none | borderStyle=solid | borderColor=gray}라이브러리 캐시{code} | ||||||
{code:none | borderStyle=solid | borderColor=red}library cache(latch){code} | ||||||
{code:none | borderStyle=solid | borderColor=red}CPU(획득) ②{code} | {code:none | borderStyle=solid | borderColor=gray}CPU(스핀) ④{code} | {code:none | borderStyle=solid | borderColor=gray}CPU(스핀) ⑥{code} |
{code:none | borderStyle=none | borderColor=red}배타적모드↑ ①{code} | {code:none | borderStyle=none}배타적모드↑ ③{code} | {code:none | borderStyle=none}배타적모드↑ ⑤{code} | ||
{code:none | borderStyle=solid | borderColor=red}프로세스1{code} | {code:none | borderStyle=solid | borderColor=gray}프로세스2{code} | {code:none | borderStyle=solid | borderColor=gray}프로세스3{code} |
---|
※ 프로세스1 은 library cache 렛치를 획득, 뒤 따르는 프로세스2,3 은 획득 가능 할 때까지 스핀
{info:title=스핀} 프로세스가 렛치를 획득 할 때까지 CPU 자원을 사용하며 반복적으로 2000번(_SPIN_COUNT) 요청 하는 행위, 그래도 획득 못하면 슬립 {info} |
{code:none | borderStyle=solid | borderColor=red}라이브러리 캐시{code} | ||||||
{code:none | borderStyle=solid | borderColor=green}library cache(latch){code} | ||||||
{code:none | borderStyle=solid | borderColor=red}CPU(획득해제) ⑧{code} | {code:none | borderStyle=solid | borderColor=gray}CPU(슬립) ⑦{code} | {code:none | borderStyle=solid | borderColor=green}CPU(획득) ⑨{code} |
{code:none | borderStyle=none} ↑ {code} | {code:none | borderStyle=none}배타적모드↑{code} | {code:none | borderStyle=none}배타적모드↑{code} | |||
{code:none | borderStyle=solid | borderColor=red}프로세스1{code} | {code:none | borderStyle=solid | borderColor=gray}프로세스2{code} | {code:none | borderStyle=solid | borderColor=green}프로세스3{code} |
---|
※ 프로세스2 는 슬립(latch: library cache), 프로세스1 이 라이브러리 캐시를 사용하면서 렛치 획득 해제, 프로세스3 렛치 획득 (요청 순서 무관)
슬립
스핀 으로 렛치를 획득치 못하면, CPU 자원 사용을 중지 하고 0.01초(X$KSLLCLASS) 대기 하는 행위, 스핀/슬립이 반복 되면 CPU 과부하를 줄이기 위해 슬립 시간이 점점 늘어 난다
렛치 와 성능 저하
렛치 경합이 발생 하면 CPU 사용량이 급격히 올라 가게되며, 해당 렛치 경합과 관련 없는 다른 SQL 도 CPU 실행 대기열 길이 증가로 인해 성능에 영향을 받게 된다.
구분 | 정보 | 예제 | |
---|---|---|---|
{code:none | borderStyle=solid}단독 렛치{code} | 인스턴스에 한개만 존재, 10g 311개, 11g 551개 | row cache objects, redo copy |
{code:none | borderStyle=solid}부모/자식 렛치{code} | 인스턴스에 하나이상 존재(부모 렛치는 한개), 10g 83개, 11g 76개 | cache buffer chains(_DB_BLOCK_HASH_LATCHES), cache buffers lru chain(_DB_BLOCK_LRU_LATCHS) |
구분 | 정보 | 예제 | |
---|---|---|---|
{code:none | borderStyle=solid}대기 가능(Willing To Wait){code} | 렛치 획득 까지 스핀/슬립 과 함께 대기 | |
{code:none | borderStyle=solid}대기 불가능(No Wait){code} | 렛치 획득 안되면 그만 | 한 개 이상의 자식 렛치가 존재하는 경우, 렛치 레벨 순서로 획득 요청하지 않는 경우 |
{code:none | borderStyle=solid | borderColor=gray}프로세스3{code} | {code:none | borderStyle=solid | borderColor=gray}프로세스3{code} | {code:none | borderStyle=solid | borderColor=red}프로세스3{code} |
---|---|---|---|---|---|---|---|---|
{code:none | borderStyle=none} ↓①(대기불가능){code} | {code:none | borderStyle=none} ↓②(대기불가능){code} | {code:none | borderStyle=none} ↓③(대기가능){code} | |||
{code:none | borderStyle=solid | borderColor=gray}library cache1{code} | {code:none | borderStyle=solid | borderColor=gray}library cache2{code} | {code:none | borderStyle=solid | borderColor=red}library cache3{code} |
{code:none | borderStyle=none} ↑(획득) {code} | {code:none | borderStyle=none} ↑(획득) {code} | {code:none | borderStyle=none}{code} | |||
{code:none | borderStyle=solid | borderColor=gray}프로세스1{code} | {code:none | borderStyle=solid | borderColor=gray}프로세스2{code} |
※ 한 개 이상의 자식 렛치가 있는 경우, 여분의 렛치가 있음에도 스핀/슬립 할 필요가 없기 때문에 마지막 렛치만 "대기 가능" 형태로 요청하고 그전 렛치들은 "대기 불가능" 형태로 요청 한다.
구분 | 사례 | |
---|---|---|
{code:none | borderStyle=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:none | borderStyle=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) "대기 가능" 모드로 요청 후 획득 |
주요 컬럼 | 설명 |
---|---|
LATCH# | 렛치 번호 |
NAME | 렛치 이름 |
HASH | 렛치 해시 값 |
주요 컬럼 | 설명 |
---|---|
ADDR | 렛치 주소 값 |
GETS | 대기 가능 모드로 렛치를 요청한 횟수 |
MISSES | 대기 가능 모드로 렛치를 요청했을 때 렛치를 바로 획득하지 못하고 대기 횟수 즉, 스핀한 횟수 |
SLEEPS | 대기 가능 모드로 렛치를 요청했을 때 슬립한 횟수 |
IMMEDIATE_GETS | 대기 불가능 모드로 렛치를 요청한 횟수 |
IMMEDIATE_MISSES | 대기 불가능 모드로 렛치를 요청하였을 때 렛치 획득에 실패한 횟수 |
SPIN_GETS | 대기 가능 모드로 요청했을 때 스핀을 수행하다가 렛치를 획득한 횟수 |
WAIT_TIME | 대기한 총 시간(단위: 1/100,000초) |
주요 컬럼 | 설명 |
---|---|
PID | 렛치를 획득하고 있는 세션의 프로세스 ID |
SID | 렛치를 획득하고 있는 세션의 세션 ID |
LADDR | 획득한 렛치 주소 값, 다른 렛치 관련 동적 뷰의 ADDR 컬럼과 조인 가능 |
NAME | 획득한 렛치 이름 |
주요 컬럼 | 설명 |
---|---|
PARENT_NAME | 부모 렛치 이름 |
NWFAIL_COUNT | 대기 불가능 렛치 획득 실패 횟수 |
SLEEP_COUNT | 슬립 횟수 |
WTR_SLP_COUNT | 렛치 획득 대기자가 슬립한 횟수 |
LOCATION | 획득 실패가 발생한 정확한 위치 |