Latch: cache buffers lru chain

EXEM Knowledge Base

Jump to: navigation, 찾기

목차

[편집] Basic Info

Working Set(LRU + LRUW)을 탐색하거나 변경하려는 프로세스는 항상 해당 Working Set을 관리하는 cache buffers lru chain 래치를 획득해야 한다. cache buffers lru chain 래치를 획득하는 과정에서 경합이 발생하면 latch: cache buffers lru chain 이벤트를 대기하게 된다.

오라클은 다음과 같은 경우에 cache buffers lru chain 래치를 획득해야 한다.

  • 프로세스가 아직 메모리에 올라오지 않은 블록을 읽고자 할 경우에는 프리 버퍼를 할당 받기 위해 LRU 리스트를 탐색하게 되는데, 이 과정에서 cache buffers lru chain 래치를 획득해야 한다.
  • DBWR이 더티 버퍼를 파일에 기록하기 위해 LRUW 리스트를 탐색하고, 해당 버퍼를 LRU 리스트로 옮기는 과정에서도 cache buffers lru chain 래치를 획득해야 한다. DBWR은 다음과 같은 경우에 더티 버퍼를 파일에 기록한다.
    • 오라클 프로세스가 프리 버퍼를 획득하기 위해 DBWR에게 더티 버퍼를 기록해 줄 것을 요청하는 경우
    • 오라클 프로세스가 Parallel Query나 Tablespace Backup, Truncate/Drop 등의 작업을 수행하기 위해 관련된 객체의 더티 버퍼를 기록해줄 것을 요청하는 경우
    • 주기적으로 또는 관리상의 이유로 체크포인트 작업이 수행되는 경우. 오라클은 FAST_START_MTTR_TARGET(또는 LOG_CHECKPOINT_TIMEOUT)에 의해 지정된 시간에 대해 복구(Recovery)를 보장하기 위해 주기적으로 체크포인트를 수행한다. 또는 관리자가 체크포인트 명령을 수행하거나 로그 파일 스위치에 의해서도 체크포인트가 발생할 수 있다.

cache buffers lru chain 래치의 경합은 가장 주된 원인은 과도한 프리 버퍼의 요청이다. 비효율적인 SQL문장이 프리 버퍼를 과도하게 요청하는 가장 전형적인 경우인데, 동시에 여러 세션이 비효율적인 SQL문장을 수행하게 되면 프리 버퍼를 탐색하는 과정에서 그리고 더티 버퍼를 기록하는 과정에서 cache buffers lru chain 래치를 획득하기 위해 경쟁하게 된다.

cache buffers chains 래치와 cache buffers lru chain 래치 경합간의 차이점을 이해할 필요가 있다. 만일 동일 테이블이나 인덱스를 여러 세션이 동시에 스캔하는 경우라면, cache buffers chains 래치 경합이 발생할 확률이 높다. 동일 체인에 대한 경합이 발생하기 때문이다. 하지만, 다른 테이블이나 인덱스들을 여러 세션이 동시에 스캔하는 경우라면 cache buffers lru chain 래치 경합이 발생할 확률이 높다. 여러 세션들이 모두 다른 블록들을 메모리에 올리는 과정에서 프리 버퍼를 확보하기 위한 요청이 많아지고 이로 인해 Working Set에 대한 경합이 발생할 확률이 높아진다. 특히 데이터의 변경이 빈번해서 더티 버퍼의 개수가 많고 이로 인해 DBWR이 체크포인트를 위해 LRUW 리스트를 탐색하는 회수가 잦다면 cache buffers lru chain 래치의 경합은 더욱 심해진다. cache buffers lru chain 래치 경합의 또 다른 중요한 특징은 물리적 I/O를 수반한다는 것이다. 비효율적인 인덱스 스캔에 의한 문제라면 db file sequential read 대기와 lru chain 래치 경합이 함께 발생하게 되고, 불필요한 풀테이블스캔이 많다면 db file scattered read 대기와 lru chain 래치 경합이 함께 발생하게 된다. 실제로는 cache buffers chains 래치 경합과 cache buffers lru chain 래치 경합이 같이 발생하는 경우가 많은데, 복잡한 어플리케이션들에서는 위에서 언급한 패턴들이 복합적으로 사용되기 때문이다.

버퍼 캐시의 크기가 지나치게 작거나 체크포인트 주기가 지나치게 짧은 경우에도 cache buffers lru chain 래치 경합이 증가할 수 있다.

[편집] Parameter & Wait Time

[편집] Wait Parameters

latch free 대기이벤트와 동일하다.

[편집] Wait Time

latch free 대기이벤트와 동일하다.

[편집] Check Point & Solution

[편집] 비효율적인 SQL 문을 튜닝한다.

비효율적인 SQL 문장을 튜닝해서 Logical Reads를 줄이면 자연스럽게 버퍼 캐시에 대한 액세스가 줄어들고 그만큼 cache buffers lru chain latch경합도 감소한다.

[편집] 버퍼 캐시의 크기를 충분히 크게 한다.

버퍼 캐시 크기가 너무 작은 경우 프리 버퍼를 할당하기 위한 작업이 매우 빈번하게 발생하고 이 과정에서 cache buffers lru chain latch에대한 경합이 증가한다.

[편집] 체크포인트 주기를 합리적으로 지정한다

체크포인트 주기가 지나치게 짧으면 DBWR가 왕성하게 더티 버퍼를 기록하게 되고 이 과정에서 cache buffers lru chain latch에 대한 경합이 발생할 수 있다. 이 경우에는 체크포인트 주기를 합리적으로 지정해야 한다. FAST_START_MTTR_TARGET 파라미터를 통해 체크포인트 주기를 조정할 수 있다.

[편집] Event Tip

[편집] 버퍼 캐시 구조

latch: cache buffers chains#버퍼 캐시 구조를 참조한다.

[편집] Working Set

latch: cache buffers chains#Working Set를 참조한다.

[편집] 버퍼 캐시 LRU 리스트의 관리

latch: cache buffers chains#버퍼 캐시 LRU 리스트의 관리를 참조한다.

[편집] 버퍼 탐색 과정

latch: cache buffers chains#버퍼 탐색 과정을 참조한다.

[편집] Analysis Case