글
Chap 1. Oracle server 구조
- Oracle 서버는 크게 인스턴스(Instance) 와 데이터베이스(Database) 로 나눌 수 있는데, Instance 는 메모리 / database 는 실제 파일이 저장되는 공간이라고 볼 수 있다. 메모리에 생성되는 Instance 는 다시 SGA (Systeam Global Area) 와 Background process 로 나눌 수 있다.
1. SGA (System Global Area) 생성 과정
- SGA (Systeam Global Area) 는 모든 process 들이 공유해서 사용되는 공유 메모리 같은 개념이다.
- 사용자가 Oracle 을 startup 할때 이 SQL 명령을 받은 최초의 Oracle process 가 초기화 파라미터 (pfile / spfile)에 적혀있는 설정 값들을 참고해서 OS Kernel 에게 공유메모리 (즉, SGA) 를 생성해 달라고 요청한다.
- 요청을 받은 Kernel 은 OS Kernel 파라메터를 조회해서 (Linux 일 경우, /etc/sysctl.conf) 설정되어 있는 값들을 기반으로 공유 메모리(SGA) 를 만들게 되고, 세마포어 (Semaphore) 설정 값들을 기반으로 하여 SGA 관리를 시작한다.
2. SGA 관리 (세마포어 설정 값을 이용한)
- OS Kernel 은 RAM 의 일부를 Oracle 에게 할당해 준 뒤에도 (SGA 생성 후에도) 다른 server process 들이 해당 공간을 사용하지 못하게 관리를 해주는데, 이럴 때 사용되는 것이 세마포어 이다.
- 세마포어에 관련된 주요 Kernel 파라메터는 아래와 같다. (Linux 를 기준으로 설명하겠다. /etc/sysctl.conf 파일)
1) kernel.sem
Oracle 11g 를 Linux 에 설치하고 나서 /etc/sysctl.conf 에 아래와 같은 설정을 해주었었다.
kernel.sem = 250 32000 100 128
이 4가지 숫자의 의미를 살펴보면,
* SEMMSL (250) - 보통 서버에서 여러 개의 process들이 세마포어를 동시에 사용하기 때문에 세마포어 사용량이 많다. 그래서 세마포어를 여러개의 셋트로 묶어서 사용하는데, 이 때 하나의 세마포어 셋트 당 세마포어의 최대 갯수 이다.
* SEMMNI (128) - 리눅스에서 설정 가능한 세마포어 셋트의 최대 갯수를 의미한다.
* SEMMNS (32000) - 리눅스에서 사용 가능한 세마포어의 최대 갯수를 의미한다. 즉, SEMMSL X SEMMNI 가 되거나 그 이상이 되어야 한다.
* SEMOPM (100) - 하나의 시스템 호출이 초당 호출 가능한 최대 세마포어 갯수를 의미한다.
시스템에서 어떻게 설정 되어 있는지 확인하려면 아래와 같은 명령어를 사용하면 된다.
[oracle@my ~]$ ipcs -ls
------ Semaphore Limits --------
max number of arrays = 128 ## --> SEMMNI
max semaphores per array = 250 ## --> SEMMSL
max semaphores system wide = 32000 ## --> SEMMNS
max ops per semop call = 100 ## --> SEMOPM
semaphore max value = 32767
2) kernel.shmmax (SHMMAX)
보통 Kernel 이 응용 프로그램들에게 메모리를 할당 해 줄 때 큰 덩어리로 한꺼번에 주게 되는데, 이런 덩어리들을 세그먼트라고 하고, shmmax 변수는 Kernel 이 Oracle 에게 공유 메모리를 할당해 줄 때 주는 큰 덩어리의 사이즈를 의미한다.
만약 Oracle 이 RAM 을 100MB 를 쓸 수 있는데 kernel.shmmax 값을 20MB 라고 지정을 해버리면, 이론적으로 100MB 의 메모리를 5개의 세그먼트로 나누어서 사용해야 한다. 이럴 경우 성능이 좋지 않을 것이다.
또한, 값을 너무 크게 줘 버리면 메모리의 낭비가 너무 심해져서 이 또한 성능에 좋지 않다.
일반적으로 shmmax 의 default 값은 32MB 이지만, Oracle SGA 로 사용하기에는 너무 양이 부족 하기 때문에 보통은 2G 로 준다.
이 값을 변경하는 방법은 아래 처럼 3가지가 있다.
* 방법 1 > /proc 파일 시스템에 변경 사항을 직접 반영시켜 서버의 재부팅 없이 변경.
[root@chacha ~]# echo "2147483648" > /proc/sys/kernel/shmmax
* 방법 2 > sysctl 명령어를 사용하여 변경
[root@chacha ~]# sysctl -w kernel.shmmax=2147483648
* 방법 3 > /etc/sysctl.conf 를 변경 후 sysctl -p 로 변경 내용 적용
3) SHMMNI
공유 메모리 세그먼트의 최대 갯수를 의미하며, default 값은 4096 개 이다. 이미 충분한 값이므로 보통은 변경하지 않는다.
4) SHNALL
공유 메모리의 최대 크기 (페이지 단위) 를 의미하며 최소한 ceil(shmmax/page_size) 보다 큰 값을 사용하길 권장한다. default size 는 2097152 bytes (2MB) 이며, 아래 명령으로 현재 설정 된 값을 볼 수 있다.
[root@chacha ~]# cat /proc/sys/kernel/shmall
2097152
5) SHMMIN
단일 공유 메모리 세그먼트의 최소 크기 (byte) 를 의미한다.
6) SHMSEG
1개의 process 에 부여 될 수 있는 공유 메모리 세그먼트의 최대 갯수를 의미한다. SHMMNI 와 다른 점은 SHMMNI 는 시스템 전체에서 사용 가능한 공유 메모리의 세그먼트의 최대 갯수 이고, SHMSEG는 1개의 process 에서 시용 가능한 공유 메모리 세그먼트의 최대 갯수이다.
3. SGA 의 주요 구성 요소
- SGA 구성 요소 중 Database Buffer cache, Redo Log Buffer, Shared Pool 은 중요한 요소들이다.
1) Database Buffer Cache
- 실제 데이터의 조회와 변경 등의 작업이 일어나는 공간으로 사용자가 조회하거나 변경하려는 모든 데이터는 이 곳에 있어야만 한다. 즉, 파일에 저장되어 있는 어떤 데이터를 조회하거나 변경하려면, 해당 데이터가 있는 블록을 복사해서 이 곳으로 가져와서 작업을 진행한다는 의미이다. 이렇게 하는 이유는 디스크에서 작업하는 속도와 메모리에서 작업하는 속도를 비교했을 때 메모리가 훨씬 빠르기 때문이다.
- SGA 는 공유 메모리 이기 때문에 여러 명의 사용자가 한꺼번에 동일한 메모리 블록을 사용 할 수도 있는데, 이럴 경우 심각한 장애가 발생 할 수도 있다. 이런 장애를 막기 위해서는 어떤 메모리 블록이 비어있는지 아닌지를 관리해야 하는데, Oracle 에서는 database butter cache block 의 상태를 3가지로 나누어 두고 리스트를 통해 관리한다.
* Pinned buffer - 현재 사용중인 블록을 의미한다. 즉, 다른 사용자는 사용할 수 없다.
* Dirty buffer - 메모리에서의 작업은 완료 되었지만 (메모리에서는 변경되었지만), 아직 파일에 적용이 안 된 상태의 블록을 의미한다. 이 상태 역시 다른 사용자가 사용할 수 없다.
* Free buffer - 현재 비어있는 상태의 블록을 의미한다. 즉, 사용할 수 있는 블록이다.
- Oracle 에서는 이런 block 들을 상태를 관리하기 위해 LRU (Least Recently Used) list 라는 것을 만들어서 사용한다. (LRU 알고리즘은 가장 최근까지 많이 사용된 것은 지키고 가장 사용이 안 된 것은 버리는 알고리즘이다.)
- 또한 이 LRU List 의 효율성을 위해 LRU 와 LRUW 리스트로 나누고 각각 세부적으로 메인/보조 리스트로 나누어서 관리를 한다. 이것을 합쳐서 Working Data Set 이라고 부른다.
LRU |
[2] 메인 리스트 |
Dirty list + Free list |
[1] 보조 리스트 |
Free list | |
LRUW |
메인 리스트 |
Dirty list (변경된 buffer 들의 리스트) |
보조 리스트 |
현재 DBWR에 의해 기록중인 buffer 들의 리스트 |
- 어떤 데이터를 파일로 부터 db buffer cache 로 가져와야 할 경우, 위의 표를 기준으로 설명을 하자면, 일단 비어있는 메모리 block 을 검사하기 위해 LRU 보조 리스트에서 ([1]) 비어 있는 block 을 먼저 조회하고, 비어 있는 block 이 없을 경우, LRU 메인 리스트에서 ([2]) 비어있는 영역을 검사한다. 10g 의 기준으로 약 40% 정도를 검사했는데도 비어있는 block 을 찾지 못할 경우는 scan 을 멈추고 Database Writer (DBWR) 에게 dirty buffer 를 내려 쓰라고 요청을 한다. 이렇게 해서 데이터 파일로 저장이 완료된 dirty buffer 는 상태가 다시 free buffer 로 바뀌면서 LRU 보조 리스트에 추가가 된다.
2) Redo Log Buffer
- DDL이나 DML 이 실행될 경우 (즉, 데이터의 변경이 생길 경우) , 해당 변경 내용을 기록해 두는 역활을 한다. (장애시 복구 위해서)
3) Shared Pool
- 다른 사용자들과 어떤 대상을 공유하기 위해 만들어진 곳이다. 아래와 같이 여러개의 공간으로 나누어 진다.
* Library Cache - Soft parse 할 때 사용되고, 이미 수행되었던 SQL, PL/SQL 문장과 실행 계획등이 저장되어 있다.
* Data Dictionary Cache - 구문분석이나 옵티마이져가 실행계획을 세울 때 사용되는 주요 Dictionary 들이 row 단위로 cache 되어 있다.
* Server Result Cache (11g 부터) - SQL 의 결과 값을 cache 해 두는 공간이다.
* Reserved Pool - Shared pool 에 5KB (11g 기준) 가 넘는 오브젝트가 적재되어야 할 경우 사용하기 위해 예약된 공간.
4. Dynamic SGA
- 보통 SGA 의 설정 값들을 변경하기 위해서는 8i 때 까지는 변경 후 서버를 꼭 재시작 해주어야 했는데, 9i 부터는 Dynamic SGA 가 나오면서 재시작 하지 않고 바로 적용이 가능하게 되었다. 예를 들어 DB buffer cache 크기를 100MB 로 변경한다고 하면,
SYS> alter system set db_cache_size=100M;
위의 명령어로 가능하다. 또한, 현재 사용중인 SGA 크기를 확인하려면 아래와 같이 조회하면 된다.
SYS> show sga;
5. PGA (Program Global Area)
- SGA 가 공유 메모리라면, PGA 는 각 process 들이 개별적으로 사용하는 메모리 공간이다. 즉, 모든 server process 나 background process 들은 전부 각각의 PGA 를 가지고 있다.
- 아래는 PGA 의 구성요소이다.
1) Private SQL Area
SQL 문장 수행 시 bind 변수 값이나 Query 의 실행 상태정보, Query 를 수행하면서 임시로 정보를 저장해야 하는 경우 (ex, join ) 이 공간을 사용한다. Private SQL Area 는 Persistent Area 와 Runtime Area 로 구성이 된다.
* Persistent Area - Bind 변수 값을 저장
* Runtime Area - SQL 문장을 수행하는 도중에 데이터르 임시로 저장해야 할 경우 사용.
2) SQL Work Area
Sort 관련 작업이나 Hash 관련 작업이 있을 경우 이 곳에서 작업을 수행한다.
'Oracle > Admin' 카테고리의 다른 글
[Oracle Admin] Chap 3. Oracle background process (0) | 2013.09.08 |
---|---|
[Oracle Admin] Chap 2. SQL 문장의 실행 원리 (0) | 2013.09.08 |
Archive/No Archive log mode (0) | 2013.08.02 |
Export, Import (0) | 2013.07.24 |
Table Space 및 DATA file 관리 (0) | 2013.07.16 |