글
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 같은 에러를 발생한다.
'Oracle > Admin' 카테고리의 다른 글
[Oracle Admin] Chap 11. DBMS_JOB & DBMS_SCHEDULER (0) | 2013.09.18 |
---|---|
[Oracle Admin] Chap 10. Oracle 사용자 관리 (0) | 2013.09.17 |
[Oracle Admin] Chap 8. Oracle 저장구조 (0) | 2013.09.14 |
[Oracle Admin] Chap 7. Tablespace 와 Data file 관리하기 (0) | 2013.09.11 |
[Oracle Admin] Chap 6. Redo Log 관리하기 (0) | 2013.09.10 |