Chap 9. Oracle 메모리 관리 기법들


  1. 9i 버전에서의 메모리 관리 기법   


1) Dynamic SGA 및 그래뉼 (Granule)

- 9.0.1 버전에서는 Default buffer cache 의 값을 Dynamic 하게 변경할 수 있다. 

- 9.0.2 버전부터는 Shared poll, Default buffer cache, Large pool, java pool 의 값을 변경할 수 있다. 

- 주의 사항은 SGA 의 전체 크기 (위 항목들을 모두 합친 값이) 가 SGA_MAX_SIZE 에 설정 된 값 보다 클 수 없다는 것다. 

- Oracle 이 동적으로 각종 메모리를 할당할 때 쓰는 단위로 그래뉼 (Granule) 를 사용한다. 1 그래뉼의 단위는, 

* 9i 의 경우 > SGA 의 전체 크기가 128M 이하이면 1그래뉼이 4MB / 128M 이상이면 16MB 

* 10g 의 경우 > SGA 의 전체 크기가 1G 이하이면 1그래뉼이 4MB / 1G 이상이면 16MB


2) SGA 총 크기와 그래뉼 사이즈 조회

SQL> select name, bytes/1024/1024 MB from v$sgainfo where name='Maximum SGA Size';


NAME MB

-------------------------------- ----------

Maximum SGA Size 403.089844


SQL> select name, bytes/1024/1024 MB from v$sgainfo where name='Granule Size';


NAME MB

-------------------------------- ----------

Granule Size  4

- 위에서 조회한 그래뉼 사이즈로 각 백그라운드 프로세스들은 메모리를 할당 받아서 사용하게 된다. 아래 결과를 보면 메모리가 4MB 씩 매핑되어 사용되는 것을 알 수 있다. 

[oracle@chacha ~]$ pmap `pgrep -f pmon` | grep /dev/shm/ora_testdb

~~~~~~~ 중간 생략

20001000   4092K rwxs-  /dev/shm/ora_testdb_6389777_0

20400000   4096K rwxs-  /dev/shm/ora_testdb_6389777_1

20800000   4096K rwxs-  /dev/shm/ora_testdb_6389777_2

20c00000   4096K rwxs-  /dev/shm/ora_testdb_6389777_3

~~~~~~~ 중간 생략


3) PGA 관리

- 9i 부터 WORKAREA_SIZE_POLICY 파라미터를 AUTO 로 설정해두면 PGA 전체 크기 안에서 PGA 값을 Oracle 이 자동으로 관리를 하게 된다. 

- PGA 전체 크기는 PGA_AGGREGATE_TARGET 파라미커로 정할 수 있다. 단, 실제 서버 프로세스가 사용할 수 있는 최대 PGA 크기는 히든 파라미터인 _PGA_MAX_SIZE 로 지정된다. 아래는 PGA 주요 항목들이다. 

SQL> select a.ksppinm, b.ksppstvl from x$ksppi a, x$ksppsv b where a.indx=b.indx and a.ksppinm in ('_pga_max_size', '_smm_max_size', '_smm_px_max_size');


KSPPINM KSPPSTVL

---------------------------------------- ----------------------------------------

_pga_max_size 209715200

_smm_max_size 33587

_smm_px_max_size 83968

* _pga_max_size : 1개의 프로세스가 사용할 수 있는 최대 PGA의 크기를 bytes  단위로 나타낸다. 직렬/병렬 처리시 사용 될 값을 모두 합친 값이다.

* _smm_max_size : 1개의 프로세스가 직렬처리 시 사용할 수 있는 최대 PGA 값을 kb 단위로 나타낸다. 

* _smm_px_max_size : 1개의 프로세스가 병렬처리 시 사용할 수 있는 최대 PGA의 값을 kb 단위로 나타낸다. 


- 9i 부터 PGA 가 자동으로 관리가 되서 편리하긴 하지만 단점으로는, 하나의 세션이 사용할 수 있는 PGA 의 용량이 정해져 있기 때문에 대량의 데이터를 처리해야 하는 배치성 작업의 경우에는 문제가 될수 있다. 이럴 경우 (대량의 sort 나 hash 가 발생하는 경우), WORKAREA_SIZE_POLICY 값을 manual 로 설정한 후에 SORT_AREA_SIZE 나 HASH_AREA_SIZE  값을 수동으로 정해주면 성능향상에 도움이 된다. 

- PGA 에서 자동으로 관리할 경우 1 세션당 사용할 수 있는 PGA 용량은 아래와 같이 결정된다. 

* 직렬 작업일 경우 : 5% PGA_AGGREGATE_TARGET 또는 100MB (둘중 작은 값)

* 병렬 작업일 경우 : 30% PGA_AGGREGATE_TARGET/DOP  또는 _pga_max_size (둘중 작은 값)


- PGA 용량이 부족할 경우 ORA-04030 에러가 발생한다. 

- 현재 작동중인 Parallel Query 의 busy, idle 상태 및 server start, shutdown 된 상태를 조회하려면 아래와 같이 하면 된다. 

SQL> select * from v$pq_sysstat where statistic='Severs Busy';


  2. 10g 버전에서의 메모리 관리기법  

1) ASMM / MMAN

- 10g 부터는 공유 메모리 (SGA) 의 주요 구성 요소들의 크기를 오라클이 스스로 변경할 수 있게 하는 기능인 Automatic Shared Memory Management (ASMM) 이 등장한다. 

- ASMM 로 변경 가능한 구성요소는 Shared Pool, Default Database Buffer Cache, Large Pool, java Pool, Streams Pool 이다. (Redo log buffer 는 불가능)

- ASMM 을 수행하기 위한 백그라운드 프로세스는 MMAN 이다. 

- MMAN 이 SGA 의 양을 자동으로 할당하고 관리 할 때 기준으로 사용하는 파라미터가 SGA_TARGET 이다. 이 파라미터에 설정된 용량의 범위 안에서 메모리를 할당하고 관리를 하게 된다. 

- SGA_TARGET 파라미터는 SGA_MAX_SIZE 의 값을 초과할 수 없다. 

- ASMM 기능을 사용하기 위한 조건

* STATISTICS_LEVEL 을 TYPICAL 또는 ALL 로 설정

* SGA_TARGET  파라미터의 값을 0 보다 큰 값으로 설정

* 다른 파라미터의 값들을 0 으로 설정 

=> 만약, 다른 파라미터의 값들 또한 0 보다 큰 값으로 설정을 하면, 해당 파라미터의 값이 최소값으로 인식을 하게 된다. 예를 들어, SGA_TARGET=2G 로 했는데, Shared_pool_size=100m 로 설정했다면, Shared_pool_size 의 최소값은 100m 가 된다. 

- SGA_TARGE 값으로 자동 튜닝이 되는 파라미터 (Auto-Tuned dynamic parameter) : 

DB_CACHE_SIZE, SHARED_POOL_SIZE, LARGE_POOL_SIZE, JAVA_POOL_SIZE, STREAMS_POOL_SIZE

SGA_TARGE 값으로 사용자가 바꿔주는 수동 파라미터 (Manual-Tuned parameter) : 

DB_KEEP_CACHE_SIZE, DB_RECYCLE_CACHE_SIZE, DB_nK_CACHE_SIZE, SGA_TARGET


2) SGA_TARGET  관련 테스트

- SGA_TARGET 값 조회

SQL> show parameter sga_target;


NAME     TYPE VALUE

------------------------------------ ----------- ------------------------------

sga_target     big integer 0


==> 이럴 경우는 SGA 관련 파라미터들을 전부 수동으로 설정해 주어야 한다. 


- SGA_TARGET 값 설정을 한 후 자동으로 할당 된 내역들을 살펴보자. 우선 SGA_TARGET 값은 SGA_MAX_SIZE 에서  Log_buffer 값과 예약공간 값을 제외한 크기를 초과할 수 없다. 현재 남아 있는 용량을 살펴 보려면 v$sga_dynamic_free_memory 를 조회해 보면 된다. 

## 현재 sga_max_size 조회

SQL> show parameter sga_max_size;


NAME     TYPE VALUE

------------------------------------ ----------- ------------------------------

sga_max_size     big integer 404M


## 현재 남은 용량 조회

SQL> select current_size/1024/1024 MB from v$sga_dynamic_free_memory;


MB

----------

       164


================> 위에서 적었듯이, sga_target 값은 sga_max_size 에서 log_buffer 와 예약공간 값을 제외한 크기를 초과할 수 없다. 그래서 sga_target 값을 적절히 주지 않으면 아래와 같은 에러가 발생한다. 


SQL> alter system set sga_target=400M;

alter system set sga_target=400M

*

ERROR at line 1:

ORA-02097: parameter cannot be modified because specified value is invalid

ORA-00839: SGA_TARGET cannot be modified to the specified value


==> 다시 적당한 값으로 바꿔보자.

SQL> alter system set sga_target=100M;


System altered.


SQL> show parameter sga_target;


NAME     TYPE VALUE

------------------------------------ ----------- ------------------------------

sga_target     big integer 100M


SQL> select component, current_size/1024/1024 curr_MB, min_size/1024/1024 min_MB, user_specified_size/1024/1024 user_MB from v$sga_dynamic_components;


COMPONENT    CURR_MB MIN_MB  USER_MB

---------------------------------------------------------------- ---------- ---------- ----------

shared pool 96    76 0

large pool  4     4 0

java pool  4     4 0

streams pool  0     0 0

DEFAULT buffer cache 128   128 0

KEEP buffer cache  0     0 0

RECYCLE buffer cache  0     0 0

DEFAULT 2K buffer cache  0     0 0

DEFAULT 4K buffer cache  0     0 0

DEFAULT 8K buffer cache  0     0 0

DEFAULT 16K buffer cache  0     0 0

DEFAULT 32K buffer cache  0     0 0

Shared IO Pool  0     0 0

 

ASM Buffer Cache  0     0 0


  3. 11g 버전에서의 메모리 관리기법  

- 메모리를 관리하고 튜닝하는 기술이 9i 는 Dynamic SGA , 10g 는 ASMM 로 SGA 크기를 스스로 튜닝하는 기술로 발전했으며, 11g 에서는 SGA 뿐만 아니라 PGA 까지 한꺼번에 자동으로 관리하는 기술인 Automatic Memory Management (AMM) 으로 발전하게 된다. 

- AMM 에서 새로 생긴 2개의 파라미터는 아래와 같다. 

* MEMORY_TARGET :

이 파라미터로 AMM 기능으로 관리할 메모리의 총 량을 지정할 수 있다. 이 파라미터의 최대 설정값은 MEMORY_MAX_SIZE 파라미터 값 까지 지정할 수 있다. 기본값은 0 이며, 이 뜻은 이 기능을 사용하지 않는다는 의미이다. 

* MEMORY_MAX_TARGET :

이 파라미터는 MEMORY_TARGET 값이 최대로 증가될 값을 지정하는 용도로 사용된다. 

- AMM 기능을 사용하게 된다면, SGA_TARGET 이나 PGA_AGGREFATE_TARGET 파라미터의 값을 0으로 셋팅하는 것이 좋다. 민약 이 값들을 지정하게 된다면, 오라클은 그 값을 최소값으로 인식하게 된다. 

- AMM 기능을 사용하기 위해서는 물리적인 메모리가 충분한 여유공간이 있어야 하며, 만약 메모리 공간이 부족할 경우 에러가 발생한다. AMM 은 /dev/shm 공간을 공유 메모리 공간과 매핑시켜서 메모리를 디스크 처럼 사용하게 되는데, 기본 크기는 OS 메모리의 50% 로 설정이 된다. 

- 만약 물리 메모리 양이 부족할 경우 oracle startup 할 시에 ORA-00845 같은 에러를 발생한다.

by 짱구를꼭말려 2013. 9. 17. 23:18