DataBase/그림으로 공부하는 오라클 구조

3장 캐시와 공유 메모리

우드의개발개발 2023. 9. 20. 15:55

캐쉬의 역할

캐쉬의 역할은 서버 프로세스에게 데이터를 전달하는 역할을 한다. 본래는 서버 프로세스가 디스크까지 가서 데이터를 가지고 와야 되지만 캐시가 있음으로써 클라이언트에게 빠르게 데이터를 전달해 줄 수 있다.

 

캐쉬 내 데이터의 저장 단위 블록

캐쉬에 데이터를 저장할 때 블록이라는 최소 저장 단위(I/O)를 기준으로 저장된다. 비유하자면 여러 작은 상자를 담기 위한 큰 상자이다.  여기서 작은 상자는 데이터 큰 상자는 블록을 의미한다. 해당 단위는 데이터베이스가 생성될 때 초기화 파라미터로 설정해주어야 하며 데이터베이스를 다시 생성하지 않는 이상 변경할 수 없다.

 

블록의 저장단위는 2KB, 4KB, 8KB, 16KB 32KB 중에 선택할 수 있다. 값을 지정하지 않을 경우 운영체제 시스템 블록의 배수 단위로 정해진다(보통 4KB, 8KB). 블록 단위로 캐시에 저장되기 때문에 하나의 데이터를 읽어오는 작업이 발생하더라도 캐쉬에는 블록과 그리고 블록 내 읽어온 데이터가 들어가 있다.

 

인덱스 블록

인덱스 또한 인덱스 블록을 버퍼 캐쉬에 저장함으로써 I/O 작업을 빠르게 처리한다(인덱스 활용한 데이터 탐색의 경우 그 상세 과정을 잘 이해하지 못하겠음).

 

공유 메모리와 버퍼 캐시

오라클의 데이터베이스 인스턴스가 메모리에 올라간 후, 프로세스 마다 갖는 고유 메모리인 PGA(Program Global Area)와는 다르게. SGA(System Global Area)를 공유한다. 프로세스마다 갖는 버퍼캐쉬는 SGA의 한 부분이다. SGA 에는 Buffer Cache 뿐만 아니라 Shared Pool(for SQL statements and data dictionary caching), Redo Log Buffer(for storing changes made to the database) 등 이 있다.

 

버퍼 캐시의 공유

전에도 이야기했지만 버퍼 캐시를 공유하는 이유는 DBMS에 여러 프로세스가 같은 메모리를 사용함으로써 클라이언트의 요청을 병렬적으로 처리하기 위함이다.

 

버퍼 캐쉬 크기의 설정

오라클 설정파일 initxxxx.ora에서 DB_CACHE_SIZE 크기를 결정하면 된다. 9i/10g 기준 48MB이다. 크면 클수록 성능이 좋아진다.

 

세마포어의 설정

오라클 DBMS에서 세마포어 설정이 필요한 이유는 한정된 자원에 대한 여러 프로세스의 요청으로 인해 해당 프로세스에게 순서대로 자원에 접근할 수 있게 하기위해 세마포어의 파라미터 설정이 필요하다.

 

Oracle 버퍼 캐쉬 작동 순서

  1. SQL문 수신
  2. SQL문 파싱
  3. 버퍼 캐시에 찾으려는 데이터 확인
  4. 버퍼 캐시에 없을 경우 디스크에서 데이터 획득
  5. 버퍼 캐시에 데이터 보관 및 LRU(Least Recently Used) 알고리즘을 통해 제일 빈도수가 낮은 데이터를 버릴지 정한다. 빈도수가 낮은 데이터를 버릴 수 있는 이유는 오라클은 LRU를 토대로 블록의 목록을 가지고 있어 최근 빈도수가 가장 낮은 블록을 알고 있기 때문입니다.
  6. SQL문 결과 회신

 

쓰기 I/O 작업 발생 시 디스크에 기록하는 DBWR

오라클 데이터베이스에서 서버 프로세스의 빠른 응답을 위해 디스크에 쓰는 작업을 백그라운드 프로세스에게 맡긴다고 했습니다. 그 작업을 수행하는 백그라운드 프로세스가 DBWR입니다. 

 

Storage 캐시 흐름

  1. CPU에서 스토리지 캐시에 데이터가 있는지 확인한다
  2. 스토리지 캐시에 없을 경우 디스크에서 데이터를 가지고 온다(1밀리초가 걸리지 않는다)
  3. 스토리지 캐시에 데이터를 적재한다
  4. CPU로 데이터를 전달한다

데이터를 쓸 때 스토리지 캐시에 기록하면 OS에서 I/O 작업은 끝났다고 볼 수 있다.

읽을 때에서 스토리지 캐시에 데이터가 있으면 즉시 응답할 수 있다.

 

OS 버퍼 캐시 흐름

  1. CPU에서 버퍼 캐시에 찾는 데이터가 있는지 확인한다
  2. 버퍼 캐시에 없을 경우 디스크에서 데이터를 가지고 온다
  3. 버퍼 캐시에 데이터를 적재한다
  4. CPU에게 데이터를 전달한다

 

가상 메모리와 페이징

  1. 메인 메모리에서 사용하지 않는 데이터를 디스크의 스왑 영역으로 옮김(페이지 아웃)
  2. CPU가 자주 사용하지 않는 데이터를 메모리에서 찾는데 없어 스왑 영역에서 다시 페이지를 메모리로 가지고 온다(페이지 인)
  • 페이징은 메모리와 디스크 사이에서 주고 받는 블록(페이지)를 의미한다
  • 디스크 중 일부를 스왑 영역으로 사용한다. 스왑 영역이란 메모리에서 자주 사용하지 않는 데이터를 보관하는 메모리이다. 이를 페이지 아웃이라고 한다. 해당 페이지를 다시 찾을 경우 다시 메모리로 페이지를 옮긴다. 이를 페이지 인이라고 한다.

 

OS 버퍼 캐시, 스토리지 캐시 그리고 Oracle 버퍼 캐시 공통점 

공통점

  • 데이터를 저장함으로써 I/O latency를 줄여준다.

 

Oracle 버퍼 캐시와 가상 메모리 페이징의 차이점

  • Oracle 버퍼 캐시는 I/O 성능 향상을 위해 버퍼 캐쉬의 메모리의 데이터를 없애 메모리 양을 줄이고 가상 메모리는 필요한 프로세스를 위한 메모리가 부족할 때 자주 사용하지 않는 프로세스의 데이터를 페이지 아웃 시켜 디스크에 보관해 메모리의 양을 늘립니다다. 즉 전자는 메모리를 줄이고 후자는 메모리를 늘린다는 특징이 서로 다릅니다.
  • Oracle의 버퍼 캐시와 가상 메모리의 차이점을 인식하는 것이 중요한 이유는 Oracle의 버퍼 캐시를 물리 메모리보다 많이 잡았을 때 발생하는 문제점 때문입니다. 스왑영역까지 고려하여 버퍼캐시를 메모리 크기보다 많이 잡을 경우 새로운 프로세스의 생성으로 인해 메모리가 필요할 때 페이지 아웃 현상이 발생해 Oracle에서 자주 사용하지 않는 데이터가 스왑 영역으로 들어갈 수 있어 I/O의 성능을 떨어트릴 수 있기 때문이다.
  • 따라서 Oracle의 버퍼 캐시를 메모리 보다 많은 용량을 잡아서 성능 이슈 문제가 발생한다면 버퍼 캐시가 잡는 메모리의 양을 줄이거나 램을 추가해서 성능 이슈를 해결해야한다.