ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Oracle] 오라클 DB 버퍼 캐시_(캐시 버퍼 체인)
    IT/etc 2022. 3. 29. 20:00

    오라클 DB 버퍼 캐시_(캐시 버퍼 체인)


    캐시 버퍼 체인
     
    해시 체인은 래치에 의해 보호된다. DB 버퍼 캐시는 공유 메모리 영역인 SGA 내에 존재하므로 여러 프로세스에 의한 동시 액세스가 일어날 가능성이 크다. 따라서 같은 리소스에 대한 액세스를 반드시 직렬화해야하고, 이를 위해 구현된 일종의 Lock 메커니즘을 래치 라고 부른다.
     
    래치를 획득한 프로세스만이 그 래치에 의해 보호되는 자료구조로의 진입이 허용된다. 두 개 이상의 프로세스가 같은 해시 체인으로 진입해 새로운 버퍼 블록을 연결하고 해제 하는 작업을 동시에 진행한다면 문제가 발생할 수 있고, 이를 방지하기 우이해 사용하는 것이 cache buffers chains 래치다. 하나의 cache buffers chains 래치가 여러 개 해시 체인을 동시에 관리한다는 사실도 기억할 필요가 있다. 필자가 현재 접속해 있는 시스템에는 해시 버킷 개수가 65,536개다. 따라서 하나의 래치가 32개의 버킷을 관리하고 있음을 알 수 있으며, 이는 버퍼 캐시 크기와 버전에 따라 달라진다. ( 해시 버킷과 래치 개수는 가각 _db_block_hash_buckets 과 _db_block_hash_latches 파라미터 값을 통해 확인 가능하다.)
     
    하나의 체인에 여러 개의 버퍼가  연결되도록 그렸지만 실제로는 하나의 체인에 하나의 버퍼만 달리도록 하는 것을 목표로 삼아야 하며, 그래야 목표한 해시 체인을 찾고서 추가적으로 스캔하는 비용을 최소화 할 수 있다. 그러려면 해시 버킷 개수가 충분히 많아야 한다.
     
    오라클 9i 부터 읽기전용 작업일 때는  cache buffers chains 래치를 Share 모드로 획득할 수 있다고 한다. 주의할 것은, 여기서 읽기전용 작업이란 select  문을 의미하는 것이 아니라 해시 체인을 스캔하면서 필요한 블록을 찾는 작업을 말한다. 그러므로 9i 이후 버전에서 Share 모드 래치를 사용하는 것과 상관없이, select 문장을 동시에 수행하면 여전히 cache buffers chains 래치 경합이 발견된다. 래치는 데이터 자체를 보호하는게 아니라 SGA에 공유돼 있는 자료구조를 보호하는 것이며,그 중 cache buffers chains 래치는 버퍼 캐시에 연결된 체인구조를 보호한다. 즉, 해시 체인을 스캔하거나 거기에 블록을 추가, 제거할 때 래치가 요구된다.
     
    cache buffers chains 래치의 중요한 용도가 한 가지 더 있는데, 버퍼 헤더에 Pin을 설정 할 때다. 오라클이 공식적으로 설명하지 않는 한 확인이 불가능한 사항이지만, 9i 부터 해시 체인을 스캔할 때는 Share 모드롤 래치를 획득했다가 체인 구조를 변경하거나 버퍼 헤더에 Pin을 설정할 때만 Exclusive 모드로 올리도록 커널 코드가 변경 된 거 같다.
     

     

    ※ 오라클 아키텍처에 대해 다시 Remind 하기 위해 2009년에 발간된 "오라클 성능 고도화 원리와 해법 1"을  책장에서 꺼내어 블로그로 옮겨 보았다. 

Designed by Tistory.