1. 오라클 전체 구조
Oracle Server : 메모리와 디스크에 생성되는 구조
- 인스턴스 : 메모리 부분에 생성되는 구조
ü SGA : Shared pool, 버퍼 캐쉬, 리두로그 버퍼로 이루어짐.
실제 작업들이 수행되는 공간
ü 백그라운드 프로세스
- 데이터베이스: 디스크 부분에 생성되는 구조
ü 데이터 파일 : 데이터 저장
ü 컨트롤 파일 : DB 전체의 관리정보 저장
ü 리두로그 파일 : 장애복구시에 사용되는 파일
1) 오라클 인스턴스 생성 과정
① 오라클 서버 프로세스
초기화 파라미터(pfile, spfile) 참고하여 OS커널에 공유메모리 할당 요청.
② 커널에서는..
- OS 커널파라미터 조회해서, 그 파일들에 설정되어 있는 내용으로 공유메모리 할당하여 SGA 생성.
- 세마포어 설정값 기반하여 다른 prgm에서 사용 못하게 하는 등의 관리
③ SGA 생성 후에는..
- 최초 생성은 서버 프로세스에 의해서지만.. 해당 프로세스 종료되어도 SGA는 종료되지 않음.
è 인스턴스가 종료되어야 SGA가 사라짐
- 만들어진 이후에는 OS 커널이 관리.
è 다른 PRGM이 사용할 수 없도록..
2) 공유메모리 관리
OS에서 제공
① 세마포어 (Semaphore)
Flag의 의미. 어떤 자원의 현재 사용 여부 표현.
하나의 메모리 블록에 동시에 여러 프로세스가 액세스하면 커널 패닉이나 블루스크린이 발생할 수 있다네..(몰랐음..)
- 메모리 블록 사용 전에, 현재 사용중인지 알기 위해 해당 블록의 세마포어 상태를 확인
è 사용중(set 플래그 설정) : 프로세스는 대기를 하고 있다가 release되어 unset이 되는 순간 세마포어를 set으로 세팅하고 자원 사용 가능.
- 세마포어와 관련된 주요 커널 파라미터 (모두 리눅스 기준임.)
l SEMMSL
세마포어 사용량이 많기 때문에 묶어서 세트로 사용.
하나의 세마포어 세트당 세마포어의 최대 가수 정의한 파라미터.
권장값 : P/SPFILE의 PROCESSES변수의 최대값에 10을 더한 값.
기본값은 100이상 설정. (11g는 150)
l SEMMNI
OS 전체에서 설정 가능한 세마포어 세트의 최대 개수
권장값 : 100 이상
l SEMMNS
OS 전체에서 사용 가능한 세마포어의 최대 가수.
SEMMNS >= SEMMSL * SEMMNI
l SEMOPM
1call (1개의 시스템 호출)이 초당 호출 가능한 최대 세마포어 개수 정의.
1call을 통해 여러 개의 세마포어 지원 가능.
한 개의 세마포어 셋에서 가질 수 있는 세마포어의 최대값 -> SEMMSL 파라미터를 통해 정의됨.
권장값 : SEMMSL과 동일하게 설정 권장
해당 내용들이 어떻게 적용되었는지 확인하려면…
[oracle@localhost ~]$ ipcs –ls
------------- Semaphore Limits -------------
Max number of arrays = 128 <- SEMMNI
Max semaphores per array = 250 <- SEMMSL
Max semaphores system wide = 32000 <- SEMMSN
Max ops per semop call = 100 <- SEMOPM
- 세마포어 이외의 커널파라미터
l SHMMAX
공유메모리 세그먼트의 최대 크기(바이트 단위) 정의.
ü 세그먼트란? : 커널이 서버프로세스에게 메모리 할당해주는 단위.
(메모리블록 단위로 작게 여러 번 할당이 아니라 통으로 할당)
할당받은 메모리공간이 여러 세그먼트에 분리되어 있을수록 성능은 좋지 않음.
세그먼트를 크게 잡으면 메모리 낭비가 심해지게 됨.
ü Kernel.shmmax 값이 너무 작은 경우..
è ORA-12547 : TNS:lost contact
è ORA-27123 : unable to attach to shared memory segment
ü 현재 설정된 shmmax 값 확인
[root@localhost ~]# cat /proc/sys/kernel/shmmax
2147483648 <-바이트 단위. 2GB
ü SHMMAX 파라미터 변경 방법
A. /proc 파일시스템에 변경사항을 직접 반영시켜 재부팅 없이 변경
# echo “숫자” > /proc/sys/kernel/shmmax
B. Sysctl 명령어
# sysctl –w kernel.shmmax=숫자
C. /etc/sysctl.conf 파일에 kernel 변수 값 추가
적용 : # sysctl -p
l SHMMNI
공유메모리 세그먼트의 최대 개수.
디폴트값 : 4096 (충분함.)
확인방법 : # cat /proc/sys/kernel/shmmni
4096
l SHMALL
특정 시점에 시스템에서 사용 가능한 공유 메모리의 최대 크기(페이지 단위)
권장값 : ceil(SHMMAX/PAGE_SIZE)
디폴트값 : 2097152bytes
확인방법 : # cat /proc/sys/kernel/shmall
2097152
l SHMMIN
단일 공유메모리 세그먼트의 최소크기(byte)
l SHMSEG
1개의 오라클 프로세스에 부여될 수 있는 공유메모리 세그먼트의 최대 개수.
SHMMNI는 시스템 전체에서 사용 가능한 최대 개수이고…
해당 두 종류의 커널 파라미터들을 모두 확인한 후, 커널은 오라클에게 공유메모리 할당.
※ 단지 최대/최소를 정의한 것이지, 해당 값을 평균으로 사용하는 것은 아니다.
② 커널이 공유메모리(오라클이 SGA로 사용할) 할당 방법
- 공유메모리로 사용할 물리적 메모리가 충분할 경우.
è 하나의 세그먼트에 전체 SGA가 할당
- 하나의 세그먼트에 다 할당할 수 없는 경우
è 연속된 여러 세그먼트로 분산시켜 할당
- 두번째 방법도 여의치 않을 경우
è 연속되지 않은 여러 세그먼트에 분산시켜 할당
※ SGA내 fixed Area 부분은 반드시 전체가 하나의 세그먼트에 할당되어야 함.
이 방법으로 메모리 할당받아 SGA가 생성될 경우, SGA에서 작업하는 속도는 늦어지게 된다.
-> 메모리가 단편화되어 있다라고 하고, 메모리를 정리해서 연속적인 공간을 할당받을 수 있도록 해주어야 함.
3) SGA의 주요 구성 요소
SGA라는 공간은 ORACLE에서 거의 대부분의 작업이 일어나는 공간.
① Database Buffer Cache
- SGA의 중요 구성요소
- 디스크에 저장된 데이터를 조회하거나 변경하기 위해 해당 데이터파일의 블록을 복사 후 버퍼캐쉬 영역에 올림.
-> 이렇게 작업하는 이유는...
ㄱ. 속도 때문에
ㄴ. 다른 사용자와 공유 가능하기 때문에.
- 여러 사용자가 같은 메모리블록을 동시에 사용할 경우 커널 패닉같은 장애 발생 가능 -> 관리 필요.
- Database Buffer Cache Block 상태 분류 (A사용자가 사용하고자 할 때)
ㄱ. Pinned Buffer
타사용자가 현재 사용하고 있는 버퍼블록.
A 사용자는 사용불가.
ㄴ. Dirty Buffer
현재 작업은 진행되지 않지만, 변경 후 아직 데이터파일에 변경내용을 저장하지 않은 버퍼.
A 사용자는 사용불가.
ㄷ. Free Buffer
Unused 또는 Dirty였다가 하드에 저장완료되어 재사용 가능한 블록.
A 사용자는 사용가능.
- 버퍼캐쉬블록 관리 알고리즘
ㄱ. LRU List
. 메인리스트 : 사용된 버퍼들의 리스트. HOT/COLD 영역으로 나뉨.
. 보조리스트 : 미사용된 버퍼들이나, DBWR에 의해 기록된 버퍼들의 리스트(Free List)
ㄴ. LRUW List
. 메인리스트 : 변경된 버퍼들의 리스트(Dirty List)
. 보조리스트 : 현재 DBWR에의해 기록중인 버퍼들의 리스트
-> LRU + LRUW List = Working Data Set (혹은 Working Set)
② Redo Log Buffer
③ Shared Pool
④ Large Pool
⑤ Java Pool
⑥ Streams Pool
⑦ Fixed SGA