버전 비교

  • 이 줄이 추가되었습니다.
  • 이 줄이 삭제되었습니다.
  • 서식이 변경되었습니다.

오라클 시스템은 멀티 쓰레드 형태가 아닌 멀티 프로세스 형태를 취하고 있다. 개별 프로세스는 각각이 사용할 메모리 영역을 별개로 가지고 있으나, DB 시스템이라는 특성상 종종 다른 프로세스가 참고하고 있는 정보에 대한 접근이 필요할 수 있다. 이 때에 프로세스간의 통신이 필요하게 된다. 프로세스간의 통신을 일반적으로 IPC(Inter-Process Communication)이라고 부른다. 이러한 IPC를 구현하기 위한 기능은 OS에 따라 다소 차이가 있으며 꼭 한가지의 방식만 제공되는 것은 아니다. 이 중에 UNIX 계열의 시스템에서 오라클이 동작할 때에 사용되는 대표적인 IPC 자원으로 세마포어, 쉐어드메모리 등이 있으며, 이러한 자원을 확보하기 위하여 오라클을 설치할 때에 OS 파라메터를 수정하여 자원을 확보해 두는 것이다.
이 중에 쉐어드 메모리를 통하여 구현되는 대표적인 기능이 SGA이다. 쉐어드 메모리는 특정 프로세스에 독점되지 않고 여러개의 프로세스가 동시에 접근하여 사용 가능한 메모리 영역에 해당한다. 즉, SGA 영역이란 각종 오라클 프로세스들이 함께 참조해야할 필요가 있는 데이터들이 저장되는 메모리 영역이라 할 수 있다.

아래 명령을 통해 쉐어드 메모리 설정이 어떻게 되어 있는지 확인 가능하다.

코드 블럭
languagebash
[root@minhang-master ~]# cat /etc/sysctl.conf | grep shm
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
[root@minhang-master ~]# sysctl -p | grep shm
kernel.shmmax = 68719476736
kernel.shmall = 4294967296

 

또한 아래 명령어를 통해 현재 IPC 자원의 할당 상태를 확인해볼 수 있다.

코드 블럭
languagebash
[root@minhang-master ~]# ipcs -m | grep ora
0x00000000 3309572 oracle 640 4096 0 
0x00000000 3342341 oracle 640 4096 0 
0x8895c820 3375110 oracle 640 4096 0 
0x00000000 3440647 oracle 640 4096 0 
0x00000000 3473416 oracle 640 4096 0 
0x57fc8ea8 3506185 oracle 640 4096 0

 

참고로 윈도우서버에서 오라클을 구동할 경우에는 오라클이 oracle.exe라는 하나의 프로세스만 구동하여 동작하므로 실제로는 위와 같은 구조가 없다고 생각하면 된다.

 

v$sgastat 테이블을 조회하면 SGA상의 개별 메모리 풀 및 기능별 메모리 할당 상태를 확인할 수 있다.

코드 블럭
sys@MHORA11G> select * from v$sgastat where rownum <=10;
POOL NAME BYTES
------------ -------------------------- ----------
fixed_sga 2257840
buffer_cache 1526726656
log_buffer 16302080
shared pool event list array to post 72
shared pool KFG SO child 8440
shared pool I/O stat latches 4960
shared pool kebm test replies 30720
shared pool dpslut_kfdsg 512
shared pool hot latch diagnostics 160
shared pool jsksncb: 9 555648
10 rows selected.

sys@MHORA11G> select pool, sum(bytes) from (select nvl2(pool,pool,name) as pool, bytes from v$sgastat) group by pool;
POOL SUM(BYTES)
-------------------------- ----------
java pool 16777216
fixed_sga 2257840
log_buffer 16302080
shared pool 570647944
large pool 33554432
buffer_cache 1526726656
6 rows selected.

 

 

 

Gliffy 다이어그램
nameSGA

SGA 내의 대표적인 메모리 풀

  • java pool: 오라클 DB상에 JAVA 기능을 활성화 시킬 경우, 해당 JVM은 해당 메모리 풀을 전용 공간으로 사용한다.
  • shared pool: 공유 커서, 공유 프로시저, 고정 오브젝터, 딕셔너리 캐시등의 데이터가 저장되는 공간
  • large pool: 필수는 아니며, large pool이 설정되어 있으면 shared pool의 일부 역할을 분담하게 된다.
  • streams pool: oracle streams 기능을 사용할 경우 해당 메모리 풀을 할당하여 oracle streams 전용 공간으로 사용한다.
  • pool값이 null인 경우: 다음 3가지 경우에는 pool 값이 null 이다. fixed_sga, buffer_cache = DB 버퍼 캐쉬, log_buffer = 리두 로그 버퍼

 

 

 

SGA 메모리의 크기에 영향을 미치는 대표적인 파라메터

  • JAVA_POOL_SIZE: Java Pool 의 사이즈를 결정
  • SHARED_POOL_SIZE: Shared Pool의 사이즈를 결정
  • LARGE_POOL_SIZE: Large Pool의 사이즈를 결정
  • DB_*_CACHE_SIZE: DB 버퍼 캐쉬의 사이즈를 결정하는데, 여러개의 파라메터가 제공되어 DB 블록 사이즈나 용도에 따라 다양하게 설정 가능하다.
  • LOG_BUFFER: 리두 로그 버퍼의 사이즈를 결정
  • SGA_TARGET: 10g 이상에 사용되며, 자동 SGA 메모리 관리 기능을 활성화해주며, SGA의 총 사이즈에 해당
  • SGA_MAX_SIZE: 만약 SGA 총 사이즈가 부족할 경우 해당 값까지 SGA 총량을 증가시킬 수 있다.
  • MEMORY_TARGET: 11g 이상에 사용되며, SGA와PGA를 포함한 전체 DB 메모리를 자동관리 해준다. 이때 DB가 사용할 전체 메모리의 총량에 해당하는 값임.
  • MEMORY_MAX_SIZE: 자동 메모리 관리시 사용 가능한 메모리의 최대 값으로 지정해줌. PGA는 지정된 값 이상 증가할 가능성이 있으므로, 해당 파라미터는 목표값에 해당할 뿐 반드시 지켜지는 것은 아니다.



Fixed SGA

SGA의 구성정보와 같은 기초 정보를 담은 공간. 버전마다 약간의 차이는 있지만, 일반적으로 고정된 사이즈를 갖고 있기에 이름이 'fixed' SGA이다.
해당 사이즈에 대해 크기 조절이 가능한 것도 아니며, 일반적으로 매우 작은 공간만을 차지하기에 어떤 기능을 하는 공간인지만 인지하고 넘어가면 될 것이다.

리두 버퍼


블록 버퍼 캐시


Shared Pool


Large Pool

...