1. DBMS 와 Oracle 이야기
메모리에서 작업하고 디스크에 저장한다.
2. Oracle Server 의 전체구조 살펴보기
(1) Oracle Server 전체구조
Oracle 프로그램을 설치한 후에 실행시키면 Oracle 은 메모리와 디스크에 자신만의 특별한 구조를 만든다.
이렇게 메모리와 디스크에 생성되는 구조를 Oracle 용어로 Oracle Server 라고 한다.
Oracle Server 에서는 메모리 부분에 생성되는 구조를 인스턴스 (Instance), 디스크에 있는 여러가지 파일 중에서 특별히 데이터가 저장되는 데이터파일들 (Data files), DB 전체의 관리정보가 들어있는 컨트롤 파일들 (Control files), 장애복구 시에 사용되는 리두 로그파일 (Redo log files) 을 합쳐서 데이터베이스 (Database)라고 부른다.
Oracle Server 는 크게 Instance 와 Database 로 나눌 수 있다.
메모리에 생성되는 인스턴스 (Instance) 는 다시 SGA (System Global Area) 와 여러가지의 백그라운드 Process (Background Process) 들로 나뉘게 된다.
이 중에 SGA 라는 공간은 실제 작업들이 수행되는 공간이고, 백그라운드 Process 들은 Oracle Server 가 잘 운영되도록 해주는 역할을 한다.
< Oracle Instance >
INSTANCE - SGA - Shared Pool - Library Cache
ㄴ Dictionary Cache
ㄴDatabase Buffer Cache
ㄴStreams Pool
ㄴ Redo Log Buffer
ㄴ Large Pool
ㄴ Java Pool
ㄴ Background Process - DBWR
ㄴ LGWR
ㄴ PMON
ㄴ SMON
ㄴ CKPT
ㄴ ETC
(2) Oracle Instance 의 할당 및 관리
Oracle Instance 는 SGA 라는 부분과 Background Process 들로 구성되어 있다. (11g 기준)
startup 요청을 받은 최초의 Oracle Server Process 가 초기화 파라미터 (pfile 이나 spfile) 에 적혀있는 설정을 참고해서 OS Kernel 에게 공유 메모리를 사용할 수 있도록 할당해 달라고 요청을 하게 된다.
Kernel 은 자신이 알고 있는 OS Kernel 파라미터를 조회해서 (리눅스 /etc/sysctl.conf, 솔라리스 /etc/system 파일) 설정 내용으로 공유메모리 (SGA) 를 할당해주고 , 세마포어 설정 값 등을 기반으로 하여 다른 프로그램 등에서 사용을 못하게 하는 등의 관리를 시작한다. Oracle 이 요청을 해도 OS Kernel 이 자신만의 설정 파일을 보고 거기 지정되어 있는 용량만 허락해 준다.
이처럼 SGA 생성은 최초의 Oracle Server Process 가 요청하고 만들지만 일단 만들어진 후 에는 OS Kernel 이 관리하게 되고,
최초 Kernel 에게 SGA 생성을 요청한 Oracle Server Process 가 종료되어도 SGA 는 종료되지 않고
Instance 가 종료되어야 SGA 가 공유메모리에서 사라지게 된다.
공유 메모리를 관리를 위해 OS 에서 제공하는 몇 가지 사항
세마포어(Semaphore)
어떤 자원의 현재 사용 여부를 표현, set/unset 두가지 값을 가지고 있다.
* 세마포어 관련 주요 Kernel 파라미터
SEMMSL
하나의 세마포어 세트당 세마포어 최대 개수 정의, 초기화 파라미터 파일의 PROCESSES 변수의 최대값에 10을 더한 값을 사용할 것을 권장하고 있으며 기본값은 100 이상을 권장
SEMMNI
리눅스 전체에서 설정 가능한 세마포어 세트의 최대 개수. 오라클 권장 값은 100 이상
SEMMNS
리눅스 전체에서 사용 가능한 세마포어 최대 개수. SEMMSL X SEMMNI 값보다 크거나 같아야 함
SEMOPM
1call 이 초당 호출 가능한 최대 세마포어 개수를 정의. 한개의 세마포어 셋에서 가질 수 있는 세마포어의 최대값은 SEMMSL 파라미터를 통해 정의된다.
SEMOPM 을 SEMMSL 과 동일하게 설정하는 것을 권장한다.
설정 확인
$ ipcs -ls
위부터 SEMMNI, SEMMSL, SEMMSN, SEMOPM 값이다.
SHMMAX
공유 메모리 세그먼트의 최대 크기 (바이트 단위) 를 정의
현재 시스템에 설정되어 있는 SHMMAX 변수의 설정값을 확인하려면
# cat /proc/sys/kernel/shmmax
일반적으로 SHMMAX 의 default 값은 32MB 이다. ORACLE SGA 로 활용하기에는 너무 양이 부족하기 때문에 보통 2GB 로 설정한다.
파라미터 변경하는 방법
1) /proc 파일시스템에 변경사항을 직접 반영시켜 Server 의 재부팅 없이 SHMMAX 의 값을 변경한다.
# echo "2147483648" > /proc/sys/kernel/shmmax
# cat /proc/sys/kernel/shmmax
2) sysctl 명령어를 사용하여 SHMMAX 의 값을 변경할 수 있다.
# sysctl -w kernel.shmmax=2147483648
3) /etc/sysctl.conf 파일에 Kernel 변수 값들을 추가함으로써 변경사항을 영구적으로 적용할 수 있다.
재부팅 없이 즉시 적용하려면
# sysctl -p
SHMMNI
공유 메모리 세그먼트의 최대 개수를 설정하는데 사용되며, 디폴트 값은 4096이다.
# cat /proc/sys/kernel/shmmni
SHMALL
특정 시점에 시스템에서 사용 가능한 공유메모리의 최대 크기 (페이지 단위) 를 설정하는데 사용된다.
이 매개변수는 최소한 아래 값보다 큰 값을 사용할 것을 권장
CEIL(SHMMAX/PAGE_SIZE)
# cat /proc/sys/kernel/shmall
SHMMIN
단일 공유메모리 세그먼트의 최소크기를 의미
SHMSEG
1개의 Process 에 부여될 수 있는 공유메모리 세그먼트의 최대 개수를 의미
SHMMNI 는 시스템 전체에서 사용 가능한 공유 메모리 세그먼트의 최대 개수이고,
이 파라미터는 1개의 Process 가 사용할 수 있는 공유 메모리 세그먼트의 최대 개수이다.
Kernel 이 위에서 살펴본 파라미터들을 기초로 해서 SGA로 사용할 공유메모리를 Oracle에 할당해줄 때 아래의 3가지 방법으로 할당할 수 있다.
첫째, 공유 메모리로 사용할 물리적 메모리가 충분할 경우 하나의 segment 에 전체 SGA 가 할당될 수 있고,
둘째, 만약 하나의 segment 에 다 할당할 수 없다면 연속된 여러 segment 로 분산시켜 할당할 수 있으며,
셋째, 두번째 방법조차 여의치 않으면 연속적이 아닌 segment 에 분산시켜 할당할 수 있다.
SGA가 연속적인 메모리 공간을 할당 받는 것이 가장 성능에 좋다.
(3) SGA 의 주요 구성 요소
SGA 라는 공간은 Oracle 에서 실제로 거의 대부분의 작업이 일어나는 공간이다.
SGA 를 잘 이해해야 하며 잘 관리하면 아주 성능 좋은 오라클이 되지만 잘못 관리하면 아주 나쁜 성능이 되는 요인이 되기도 한다.
1) Database Buffer Cache
Buffer Cache 라고 부르기도 하며 SGA의 중요한 구성요소이다.
데이터의 조회와 변경 등의 실제 작업이 일어나는 공간으로 사용자가 조회하거나 변경하려는 모든 데이터는 이 곳에 있어야 한다.
사용자가 데이터를 입력하면 그 데이터는 하드 디스크의 데이터 파일에 저장이 된다.
저장되어있는 데이터를 조회하거나 변경하려면 그 저장되어 있는 데이터파일의 블록을 복사한 후 Database Buffer Cache 로 가져와서 작업을 수행한다.
디스크에서 작업하는 속도보다 메모리에서의 속도가 비교가 안될만큼 빠르기 때문이다.
Database Buffer Cache 는 SGA 의 가장 중요한 구성요소로 여러명의 사용자가 이 곳을 공유해서 사용하는 특징을 가지고 있다.
여러 명의 사용자가 같은 곳의 메모리 블록을 동시에 사용하려고 하는 경우 심각한 장애 (Kernel Panic) 가 발생할 수 있기 때문에 공유메모리에 생성되는 구조들은 서로 중복사용이 되지 않도록 잘 관리가 되어야 한다.
오라클은 Block 의 상태를 3가지로 나누어 리스트를 통해 관리한다.
- Pinned Buffer
다른 사용자가 현재 사용하고 있는 Buffer 블록을 의미한다. 접근 불가
- Dirty Buffer
현재 작업은 진행되지 않지만 다른 사용자가 내용을 변경한 후 아직 데이터 파일에 변경된 내용을 저장하지 않은 Buffer 를 의미. 접근 불가
- Free Buffer
사용되지 않았던지 (Unused) 또는 Dirty Buffer 였다가 하드 디스크로 저장이 완료되어 재사용할 수 있는 블록을 의미한다.
일반적으로 Database Buffer Cache 는 아주 많은 수의 Buffer Block 들로 구성되어 있는데 Buffer 들의 상태를 관리하기 위해 LRU (Least Recently Used) List 라는 것을 만들어서 사용한다.
LRU List
- 메인 리스트: 사용된 Buffer 들의 리스트. Hot 영역 (Dirty) 과 Cold 영역 (Free) 으로 나뉜다.
- 보조 리스트: 미 사용된 Buffer 들이나, DBWR 에 의해 기록된 Buffer 들의 리스트 (Free list). Free Buffer
LRUW List
- 메인 리스트: 변경된 Buffer 들의 리스트 (Dirty List 라고도 한다.)
- 보조 리스트: 현재 DBWR 에 의해 기록 중인 Buffer 들의 리스트
유한한 자원을 여러 Process 가 한꺼번에 사용하려고 할 경우에 순서를 지키는 것이 아주 중요한데 이런 경우 사용 순서를 관리하기 위해 오라클은 Latch 라는 것을 사용하게 된다. 마치 은행의 번호표와 같이 순서를 정해주는 역할을 한다.
2) Redo Log Buffer
데이터에 변경사항이 생길 경우 (DDL 이나 DML 이 실행될 경우 등) 해당 변경 내용을 기록해 두는 역할을 하게 된다.
기록해 두는 이유는 장애가 발생했을 경우 복구를 하기 위함이다.
Redo Log 관련 설정을 잘못해서 데이터가 장애가 났다면 복구가 안될 수 도 있다.
변경 내용을 기록하는 메모리 공간을 Redo Log Buffer 라고 하고 Redo Log Buffer 의 내용을 디스크에 저장해 주는 파일을 Redo Log File 이라고 부른다.
Redo Log 관련 사항은 Oracle Recovery 의 핵심적인 요소이다. 장애가 발생할 경우 믿을 건 Redo log 밖에 없으므로 아주 잘 이해해야 한다.
3) Shared Pool
다른 사용자와 어떤 대상을 공유해서 사용하기 위해 만들어진 곳이다.
Library Cache, Data Dictionary Cache (Row Cache) 등의 여러 공간으로 나누어진다.
Library Cache 는 Soft Parse 할 때 사용되는 공간으로 이미 수행되었던 SQL 문장이나 PL/SQL 문장의 Parse Code 와 해당 SQL, PL/SQL 문장, 실행계획 등이 저장되어 있고 LRU 알고리즘으로 관리가 된다.
Dictionary Cache 에는 구문분석이나 옵티마이져가 실행계획을 세울 때 사용되는 주요 Dictionary 들이 Row 단위로 Cache 되어 있다.
이 곳 역시 LRU 알고리즘으로 관리된다.
(4) Dynamic SGA 기능
관리자가 필요에 의해서 SGA 의 구성요소의 크기를 변경한 후 Oracle Instance 의 재시작 없이 즉시 적용할 수 있는 기능이다.
(단, Redo log buffer 를 포함한 몇 가지는 제외된다.)
SYS> ALTER SYSTEM SET DB_CACHE_SIZE = 100M ;
Database Buffer Cache 의 크기를 동적으로 바꿀 때 사용하기 위해 오라클에서는 메모리를 할당하는 새로운 단위를 만들었는데 바로 그래뉼 (Granule) 이란 단위다.
(5) Program Global Area (PGA) 의 주요 구성요소
SGA 가 모든 Process 들이 공유해서 사용되는 메모리 공간
PGA 는 각 Process 들이 개별적으로 사용하는 메모리 공간
1) Private SQL Area
Private SQL Area는 Persistent Area와 Runtime Area 로 구성된다.
Persistent Area 는 Bind 변수를 저장해 두는 공간이고,
Runtime Area 는 SQL 문장을 수행하는 도중에 데이터를 임시로 저장해야 할 경우 사용하는 공간이다.
2) SQL Work Area
이 공간은 Sort 관련 작업 (Sort Area) 이나 Hash 관련 작업이 있을 경우 이 곳에서 작업을 수행하게 되는 공간이다.
오라클 튜닝 가이드에서 제공하는 적절한 PGA 용량 계산 방법
- OLTP 시스템 환경일 경우
PGA_AGGREGATE_TARGET = (<총 물리 메모리 용량> * 80%) * 20%
- DSS 시스템 환경일 경우
PGA_AGGREGATE_TARGET = (<총 물리 메모리 용량> * 80%) * 50%
위 공식을 토대로 총 물리 메모리가 16G 인 Server 의 PGA 를 계산
- OLTP (OnLine Transaction Procession) 시스템 환경일 경우
PGA_AGGREGATE_TARGET = (16G X 0.8 ) X 0.2 = 2.56 G
- DSS (Decision Support System) 시스템 환경일 경우
PGA_AGGREGATE_TARGET = (16G X 0.8 ) X 0.5 = 6.4 G
위 공식들은 가이드라인이며 정확한 값은 아니니 운영중인 시스템에 맞도록 튜닝작업이 추가로 필요할 수도 있다.
현재 서버의 PGA 관련 값을 조회하려면
SYS> select * from v$pgastat ;
오라클을 정말 잘하려면 구조는 완벽하게 파악하고 있어야 한다!!