Latch free

EXEM Knowledge Base

Jump to: navigation, 찾기

목차

[편집] Basic Info

프로세스가 Willing-to-wait 모드로 _SPIN_COUNT 만큼 스핀을 수행하고도 latch 획득에 실패하여 sleep한다는 것을 의미한다.

오라클은 SGA 구조를 보호하기 위하여 latch를 사용한다. SGA는 로컬 인스턴스 단위로 존재하므로 래치는 해당 인스턴스에서만 관찰 가능하다. Latch의 획득 방식은 Willing-to-wait 과 No-Wait방식 2가지가 있다.

Willing-to-wait 방식은 래치를 획득할 수 있을 때까지 대기하는 방식으로 Spin 방식과 Posting 방식으로 나뉘어 진다. Spin 방식은 latch를 획득하려는 프로세스가 latch를 획득하는데 실패하면 적절한 회수만큼 루프를 돌고 래치를 다시 획득하기 위해 시도하는데 이 시도를 _SPIN_COUNT(기본값 2000) 파라미터 값 만큼 반복(스핀)하며 latch 획득을 시도한다. Posting 방식으로 동작하는 latch는 Spin방식에 비해 장시간 대기하는 latch이며 선행 프로세스가 latch를 해지할 때까지 wait list에서 대기하는 방식이다. 여기서 주의할 점은 wait list를 사용한다고 하여 순서가 보장되지는 않는다. Posting 방식을 사용하는 대표적인 latch는 shared pool latch와 library cache latch가 있다.

대부분의 래치 획득은 Willing-to-wait 모드를 사용하지만 다음과 같은 특수한 경우에는 No-wait 모드를 사용한다. 현재 다른 래치들을 보유하고 있는 프로세스가 현재 보유한 래치중 가장 최근에 획득한 래치보다 더 낮거나 같은 레벨의 래치를 획득하고자 할 때는 No-wait 모드로 획득을 시도한다.

Willing-to-wait과 No-Wait의 두 가지 모두를 사용하는 이유는 latch의 데드락을 방지하기 위해서이다. 가장 최근에 획득한 latch의 level과 같거나 낮은 레벨의 latch를 획득할 때 는 No-wait 모드로 요청하고 가장 최근에 획득한 latch의 level보다 높은 level의 latch를 획득하고자 할 때는 Willing-to-wait 모드로 요청한다. Latch의 데드락 발생시 ORA-600에러가 발생한다.

Latch는 기본적으로 exclusive 모드를 사용하여 한 순간에 하나의 프로세스만이 latch를 점유할 수 있으나 특정 latch에서는 shared 모드로 점유할 수도 있다. 9i 이상에서는 cache buffers chains latch의 경우 읽기 작업일 때 shared 모드를 사용한다.

9i까지는 모든 latch 대기 현상이 latch free로 표시되었으나 10g부터는 중요한 latch들은 별도의 대기이벤트로 정의 되었다. latch 이름을 직접 알 수 없는 latch free 대기이벤트의 경우에는 P2의 값이 latch# 이므로 이 값을 V$LATCHNAME.LATCH#과 조인하면 latch 이름을 얻을 수 있다.

10g에서 분리된 latch 이벤트를 확인하려면 아래의 쿼리로 확인할 수 있다.

SQL> select event#, name from v$event_name
         where name like 'latch:%';
EVENT# NAME
---------- ----------------------------------------------------------------
        58 latch: cache buffers chains
       106 latch: redo writing
       107 latch: redo copy
       191 latch: Undo Hint Latch
       193 latch: In memory undo latch
       194 latch: MQL Tracking Latch
       204 latch: row cache objects
       210 latch: shared pool
       211 latch: library cache
       212 latch: library cache lock
......

- latch: cache buffers chains
버퍼 캐시(Buffer cache)에서 특정 블록을 탐색하고자 하는 프로세스는 cache buffers chains 래치를 획득해야 한다. 이 과정에서 경합이 발생하면 latch: cache buffers chains 이벤트를 대기하게 된다.

- latch: cache buffers lru chain
버퍼 캐시(Buffer cache)에서 프리 버퍼와 더티 버퍼를 탐색하고자 하는 프로세스는 cache buffers lru chain 래치를 획득해야 한다. 이 과정에서 경합이 발생하면 latch: cache buffers lru chain 이벤트를 대기하게 된다.

- latch: shared pool
Shared Pool의 힙(Heap)영역에서 새로운 청크(Chunk)를 할당받고자 하는 프로세스는 shared pool 래치를 획득해야 한다. 이 과정에서 경합이 발생하면 latch: shared pool 이벤트를 대기한다.

- latch: library cache
Library Cache 영역을 탐색하고자 하는 프로세스는 library cache 래치를 획득해야 한다. 이 과정에서 경합이 발생하면 latch: library cache 이벤트를 대기한다.

- latch: redo copy
DML에 의한 변동사항을 리두 버퍼(Redo buffer)에 기록하고자 하는 프로세스는 작업의 전 과정 동안 redo copy 래치 획득해야 한다. 이 과정에서 경합이 발생하면 latch: redo copy 이벤트를 대기한다.

[편집] Parameter & Wait Time

[편집] Wait Parameters

latch free 대기 이벤트의 파라미터 정의는 다음과 같다.

  • P1: 프로세스가 대기하고 있는 래치의 메모리 주소.
  • P2: 래치 번호 (V$LATCHNAME.LATCH# 와 동일) 래치번호에 해당되는 래치 명(latch name)을 찾기 위해서는 아래의 SQL문을 수행하면 된다.
SELECT * FROM v$latchname WHERE latch# = &p2_value;
  • P3: 시도횟수. 즉 래치를 획득하기 위해 프로세스가 시도한 횟수를 나타낸다.

[편집] Wait Time

이벤트의 대기시간은 기하급수적(exponential)으로 증가한다.

[편집] Check Point & Solution

latch free 이벤트의 발생 이유와 해결책은 latch의 종류에 따라 다르다. 개별 latch free 이벤트에 대한 설명을 참조한다.

[편집] Event Tip

[편집] Latch에 관련된 Dynamic Performance Views

  • V$LATCH : 래치(latch)의 종류별 통계 값
    • GETS : willing-to-wait 모드에서 슬립 하기 전에 래치 요청 횟수
    • MISSES : willing-to-wait 모드에서 슬립 하기 전에 래치 획득 실패 횟수
    • SPIN_GETS : willing-to-wait 모드에서 슬립 하기 전의 스핀단계에서의 래치 획득 성공 횟수
    • SLEEPS : willing-to-wait 모두에서의 슬립 횟수
    • IMMEDIATE_GETS : no-wait 모드에서 래치 획득 성공 횟수
    • IMMEDIATE_MISSES : no-wait 모드에서 래치 획득 실패 횟수
    • SLEEP1 ~ SLEEP4 : 1~3 회의 슬립횟수와 4회 이상의 슬립 횟수. 오라클 10gR2부터는 V$EVENT_HISTOGRAM 뷰로 대체
    • WAITERS_WOKEN : posting 에 의한 래치 획득 방식을 사용할 경우 세션이 깨어난 횟수. 오라클 10gR2부터는 사용되지 않음.
    • WAIT_TIME : 래치를 획득하기 위해 대기한 시간(microsecond 단위)
  • V$LATCH_PARENT : 독립 래치와 부모 래치의 통계
  • V$LATCH_CHILDREN : 자식 래치 별 통계 값
  • V$LATCH_HOLDER : 래치 홀더(holder)에 대한 정보
  • V$LATCH_MISSES : 래치 획득 실패가 발생한 오라클 커널 코드의 위치에 대한 정보를 제공

[편집] Analysis Case