3. 캐시와 공유 메모리

Kyu·2023년 2월 21일
0

캐시와 공유 메모리

  • 캐시 기능(버퍼 캐시)에 관해 살펴보는 장
  • 캐시 공유를 위한 특수한 메모리 기능 (공유 메모리)

캐시는 왜 필요하고 캐시란 무엇인가?

  • 일반적으로 생각하는 캐시의 의미랑 같음
  • 참고로 캐시에 "히트한다/안한다" 라는 표현을 사용
  • 데이터베이스에서의 캐시란 메모리 공간의 사용을 말함
  • 버퍼 캐시라는 용어를 사용

데이터의 보관 규격 - 블록

  • 테이블의 수천만 row 의 데이터를 어떻게 보관할까? -> 블록이라는 개념이 존재한다
    • 그림3.6 42p
  • 블록 크기는 2, 4, 8, 16, 32KB 중에서 선택

Q) 42p 마지막
크기가 큰 테이블을 시퀀셜 액세스로 읽어와야하는 DW 등에는 16KB, 32KB 같은 큰 크기를 선택한다?
me A) 크기가 크니까 최대한 I/O 를 줄여야할 것이다. 즉, 최대한 많은 데이터를 하나의 블록에 넣어야한다.

캐시와 인덱스

  • 인덱스도 블록으로 구성
  • 인덱스가 클 땐 두블록 이상이 될 수도 있음
  • 캐시에 있지 않으면 그만큼 시간이 더 많이 걸림
    • 그림 3.8 44p

프로세스는 캐시를 공유

  • 프로세스마다 캐시를 가지면 문제가 다른 프로세스에서 변경된 데이터를 볼수없고 낭비가 심해짐
  • 그래서 메모리를 공유한다
  • OS 에서 공유 메모리라는 기능을 제공
    • 오라클에서 이를 SGA(System Global Area)

Q) PGA 란 무엇인인가? 책에 따르면 공유하지 않는 메모리의 일부라고 하는데 그러면 다른 프로그램 메모리들은 뭘 하는것? 특별히 PGA는 또 무엇을 하는것?
Q) 46p,47p 그림이 잘 이해가안감. PGA 를 거쳐서 SGA 의 데이터를 변경한다고 하는것인가?

공유 메모리 설정

  • spfileXXX.ora (XXX에는 데이터베이스를 식별하는 ID가 들어감) 에서 가능 DB_CACHE_SIZE 라는 게 있다
  • 공유 메모리에는 버퍼 캐시 말고도 공유 풀 로그 버퍼 같은 영역도 존재

버퍼 캐시의 크기는 어떻게 정하나?

  • 임시로 처음 크기는 크게 잡는다.
    • 이후에 통계 기반 조정
      • 버퍼 캐시 크기마다 물리 읽기 수를 예측하는 버퍼 캐시 어드바이저 (V$DB_CACHE_ADVICE)
      • 버퍼 캐시 내에서 요청받은 블록을 꺼내 온 빈도를 의미하는 버퍼 캐시 히트율
  • 버퍼 캐시를 아예 설정하지 않는다. (49p) 어려운 이야기.

공유 메모리는 어떤 식으로 보이는가?

  • ps 명령어로 VSZ 항목을 확인해보면 각 프로세스들이 대량의 메모리가 있는 것처럼 보이지만 공유메모리도 같이 포함한다는 것을 알아야한다.
  • 세마포어: 자원의 수에 비해 사용하고자하는 프로세스의 수가 많을 경우 순서대로 자원을 사용할 수 있게 제어해주는 장치의 일종

버퍼 캐시를 정리하는 LRU 알고리즘

  • 공간이 한정적이므로 정리가 필요함
  • LRU (Least Recently Used) - 최근에 사용하지 않은 데이터부터 제거
  • SELECT -> 그림 3.11 A 가 가장 오래 사용하지 않은 데이터이고 이를 E 로 변경하는 그림
  • UPDATE -> 그림 3.12 은 업데이트 친다고 바로 디스크에 쓰는 게 아니라 정기적으로 DBWR 이 업데이트 해주는 모습을 보여줌
  • BULK SELECT -> 그림 3.13 풀 스캔 했을 때 모든 데이터들이 버퍼 캐시에 오면 자주 사용하던 캐시들이 버려지는 일이 발생한다고도 생각할 수 있다.
    • 그런데 오라클에서는 풀스캔했을 때의 데이터는 일반적으로 버퍼캐시에 적재하지 않는다.

OS 가상 메모리

  • 가상메모리: 물리 메모리가 아닌 디스크의 일부를 스왑영역(메모리에 데이터를 보관하는 영역)으로 사용
  • 페이징: 스왑영역에서 데이터가 왔다갔다하는 것을 page out(디스크에 기록), page in(읽기) 라고 한다.
  • 가상메모리는 버퍼캐시와 달리 메모리 영역을 늘리기 위해 디스크에서 사용되므로 당연히 속도는 그만큼 느리다.
  • 오라클은 물리 메모리만 사용하도록 설정할 것을 권함.
  • 59p 재기동 I/O 빨라지는 수수께끼 이해불가.

Q) 가상메모리도 결국에 디스크를 사용하는 거라면 무슨 의미가 있는 것인가?
me A) 어쨌든 버퍼캐시(블록)으로 만들어 둔거니까 접근하는데 아예 디스크에서 불러오는 것보단 빠를것이다?
K A) 가상 메모리는프로세스에게 하드웨어 독립적인 메모리 공간을 제공하는게 우선적인 목표입니다. 그래서 OS 환경 위에서 프로그래밍하는 프로그래머에게 하드웨어의 실제 메모리 할당 위치를 고려할 필요 없게 해주는 것이죠.

이렇게 해서 메모리를 가상화하면 프로세스가 실제 하드웨어의 물리 메모리 보다 많은 메모리 공간을 사용할 수 있습니다. 이때 되면 자연스럽게 물리 메모리 공간이 부족하니 디스크를 메모리로 활용하는거구요.

이를 허용할지 말지가 시스템 운영하는 사람의 선택입니다.

profile
TIL 남기는 공간입니다

0개의 댓글