프린트 하기

OS환경 : Oracle Linux 6.8 (64bit), Oracle Linux 7.3 (64bit)


DB 환경 : Oracle Database 11.2.0.4, 19.3.0.0


방법 : 오라클 메모리 관련 정리

오라클에서 사용하는 메모리에 대해 간략하게 정리함


SGA(System Global Area) - 모든 사용자가 공유 가능하여 사용

PGA(Program Global Area) - 사용자마다 공유하지 않고 개별적으로 사용

Shared Pool : 공유 커서, 공유 프로시저, 고정 오브젝트, 딕셔너리 캐시와 수십개의 많은 데이터들을 포함하고 있음

온라인 상태에서도 크기를 조정할 수 있음

Large Pool : shared server 커넥션 환경에서 세션별로 할당할 메모리를 위해 활용 되는데, 메시지 버퍼를 위한 병렬 실행 기능, 디스크 I/O버퍼를 위한 RMAN백업 등에 활용됨, 온라인 상태에서도 크기를 조정할 수 있음

Java Pool : 데이터베이스에서 JVM이 실행되는 동안 할당하는 고정된 메모리 공간을 뜻함

오라클 10g부터 java pool은 온라인 상태에서도 크기를 조정할 수 있음

Streams Pool : 오라클 스트림이 독점적으로 사용하고 있는 메모리임, 오라클 10g에서 새롭게 선보인 pool이며,

온라인 상태에서도 크기를 조정할 수 있음

buffer cache : 데이터 파일에서 읽은 데이터 블록 복사본을 보관함, 오라클이 데이터를 읽고 수정하기 위해 디스크에 존재하는 데이터를 읽어 저장하는 메모리 공간



ASSM (Automatic Shared Memory Management)

Oracle 9i부터 지원된 프리블록 관리방법을 말함

FLM(Free List Management)방식과 달리 비트맵을 이용하여 프리블록을 관리함

PCTUSED, FREELISTS, FREELIST GROUP항목들이 자동관리됨


sga_target 설정을 0으로 하면 ASSM(Automatic Shared Memory Management)라 불리는 자동 공유 메모리 관리 메커니즘이 꺼진다. 즉 0보다 크게 잡아야 ASSM 기능을 사용할 수 있다. 예를 들어 sga_target을 4G로 설정하면 4G 안에서 알아서 사용하라는 의미가 된다.


ASMM을 사용하기 위한 조건

STATISTICS_LEVEL Parameter 값이 typical 또는 ALL 로 설정

SGA_TARGET Parameter 값을 0 보다 큰 값으로 설정(0은 사용하지 않음을 의미)

SGA_MAX_SIZE : ASMM에서 사용할 최대값을 지정함

SGA_TARGET : 이 값에서 ASMM이 이루어지게됨 SGA_MAX_SIZE와 SGA_TARGET은 동일한 값으로 설정하길 권장함

SGA 구성요소(shared_pool, large pool, DB Buffer Cache 등)들의 값은 0으로 설정(0 이상의 값이 설정되어 있다면 그 값을 최소값으로 인식하기 때문에 0으로 설정하기를 권장)



AMM(Auto Memory Management)

Oracle은 9i부터는 PGA를 WORKAREA_SIZE_POLICY, PGA_AGGREGATE_TARGET 등의 Parameter를 이용하여 자동으로 관리하는 방식을 써옴

10g에서도 마찬가지로 SGA는 ASMM방식 + PGA는 WORKAREA_SIZE_POLICY, PGA_AGGREGATE_TARGET 을 이용하여 관리가 됨

11g에서 등장한 AMM 관리 기법은 SGA+PGA를 자동으로 관리하는 방식으로 발전함


AMM 관리 기법이 등장하면서 아래 2가지 Parameter가 생김

MEMORY_TARGET : AMM 기능 사용시 사용할 수 있는 Memory의 총량을 정할 수 있음

이 Parameter가 0이면 AMM을 사용하지 않는다는 뜻이며, 최대 설정 값은 MEMORY_MAX_TARGET의 값 까지 지정할 수 있음

MEMORY_MAX_TARGET : MEMORY_TARGET 값이 최대로 증가될 값을 지정


AMM 기능을 사용하게 된다면 SGA_TARGET, PGA_AGGREGATE_TARGET의 값을 0으로 지정하는 것이 좋음

ASMM과 마찬가지로 0이 아닌 경우 그 값을 최소값으로 인식하기 때문



show sga에서 나오는 결과

1
2
3
4
5
6
7
SQL> show sga
 
Total System Global Area 1553305600 bytes
Fixed Size            2253544 bytes
Variable Size         1174408472 bytes
Database Buffers      369098752 bytes
Redo Buffers            7544832 bytes


Total System Global Area

 - SGA를 구성하는 영역 크기의 합계로 SGA_MAX_SIZE 파라미터로부터 영향 받음


Fixed Size

 - 데이터베이스나 인스턴스의 상태를 저장하는 영역으로, 백그라운드 프로세스가 액세스 하는 영역

 - 사용자 데이터는 저장되지 않고, 일반적으로 100k 미만의 영역을 차지함


Variable Size

 - 이 영역의 크기는 SHARED_POOL_SIZE, LARGE_POOL_SIZE, JAVA_POOL_SIZE 파라미터로부터 영향을 받음

 

Database Buffers

 - 데이터파일로 부터 읽어 들인 데이터 블록 내용을 저장하는 영역으로 DB_CACHE_SIZE 파라미터로부터 영향 받음


Redo Buffers

 - 데이터베이스에 가해진 모든 변경 사항에 대한 내역을 저장하는 Redo Log Buffer의 크기로 LOG_BUFFER 파라미터로부터 영향 받음




현재 PGA 메모리 사용량과 최대 메모리 사용량 조회

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
SQL> 
select program, pga_used_mem, pga_alloc_mem, pga_max_mem
from v$process
order by 1;
   
PROGRAM                      PGA_USED_MEM PGA_ALLOC_MEM PGA_MAX_MEM
------------------------------------------------ ------------ ------------- -----------
PSEUDO                                0          0          0
oracle@ORACLE10 (CJQ0)                       652380        2421020    2421020
oracle@ORACLE10 (CKPT)                       410476         568228     568228
oracle@ORACLE10 (DBW0)                       388172         517988     517988
oracle@ORACLE10 (LGWR)                     10902676       11643748    11660804
oracle@ORACLE10 (MMAN)                       307092         389404     389404
oracle@ORACLE10 (MMNL)                       312596         389404     389404
oracle@ORACLE10 (MMON)                      1171212        2289948    2289948
oracle@ORACLE10 (PMON)                       307892         389404     389404
oracle@ORACLE10 (PSP0)                       307092         389404     389404
oracle@ORACLE10 (QMNC)                       316244         389404     389404
oracle@ORACLE10 (RECO)                       382740         651548     651548
oracle@ORACLE10 (SMON)                       544180        1569052    1569052
oracle@ORACLE10 (TNS V1-V3)                   329604         406492     406492
oracle@ORACLE10 (q000)                       418468         520476     520476
oracle@ORACLE10 (q001)                       337740         454940     454940
 
16 rows selected.

컬럼 설명 

PGA_USED_MEM : 프로세스가 현재 사용하는 PGA 크기

PGA_ALLOC_MEM : 프로세스에 할당된 PGA 크기

- 다른 프로세스에서 필요로 할 경우 PGA_USED_MEM 를 제외한 나머지 공간을 반환함

즉  PGA_ALLOC_MEM  만큼 할당되어 있지만 현재는 PGA_USED_MEM 만 사용중이고 남은 메모리는 반환되지 않았음을 의미)

PGA_MAX_MEM : 프로세스가 가장 많이 사용했을 때의 크기



PGA_USED_MEM 합(현재 DB에서 PGA 전체 사용량)

1
2
3
4
5
SQL> select round(sum(pga_used_mem)/1024/10241) as pga_used from v$process;
 
  PGA_USED
----------
      16.4



메모리 영역별 메모리 최소 할당량 확인(19c 결과값)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
SQL> 
set lines 200
col component for a40;
col cur_size for a10;
col min_size for a10;
select component,
round(current_size/1024/10242)||'MB' as cur_size,
round(min_size/1024/10242)||'MB' as min_size
from v$sga_dynamic_components
--where component = 'ASM Buffer Cache'
/
 
COMPONENT                 CUR_SIZE   MIN_SIZE
---------------------------------------- ---------- ----------
shared pool                 596MB        596MB
large pool                 12MB        12MB
java pool                 0MB        0MB
streams pool                 0MB        0MB
unified pga pool             0MB        0MB
memoptimize buffer cache         0MB        0MB
DEFAULT buffer cache             0MB        0MB
KEEP buffer cache             0MB        0MB
RECYCLE buffer cache             0MB        0MB
DEFAULT 2K buffer cache          0MB        0MB
DEFAULT 4K buffer cache          0MB        0MB
DEFAULT 8K buffer cache          0MB        0MB
DEFAULT 16K buffer cache         0MB        0MB
DEFAULT 32K buffer cache         0MB        0MB
Shared IO Pool                 0MB        0MB
Data Transfer Cache             0MB        0MB
In-Memory Area                 0MB        0MB
In Memory RW Extension Area         0MB        0MB
In Memory RO Extension Area         0MB        0MB
ASM Buffer Cache             24MB        24MB

COMPONENT 설명

Shared Pool : 공유 커서, 공유 프로시저, 고정 오브젝트, 딕셔너리 캐시와 수십개의 많은 데이터들을 포함하고 있음

온라인 상태에서도 크기를 조정할 수 있음

Large Pool : shared server 커넥션 환경에서 세션별로 할당할 메모리를 위해 활용 되는데, 메시지 버퍼를 위한 병렬 실행 기능, 디스크 I/O버퍼를 위한 RMAN백업 등에 활용됨, 온라인 상태에서도 크기를 조정할 수 있음

Java Pool : 데이터베이스에서 JVM이 실행되는 동안 할당하는 고정된 메모리 공간을 뜻함

오라클 10g부터 java pool은 온라인 상태에서도 크기를 조정할 수 있음

Streams Pool : 오라클 스트림이 독점적으로 사용하고 있는 메모리임, 오라클 10g에서 새롭게 선보인 pool이며,

온라인 상태에서도 크기를 조정할 수 있음

Default buffer cache : 일반적인 버퍼캐시 영역

(데이터 파일에서 읽은 데이터 블록 복사본을 보관함, 오라클이 데이터를 읽고 수정하기 위해 디스크에 존재하는 데이터를 읽어 저장하는 메모리 공간)

Keep buffer cache : 사용빈도가 높은 데이터를 위한 버퍼캐시, 이 곳에 읽혀진 블록은 긴 시간동안 메모리상에서 관리됨

Recycle buffer cache 사용빈도가 낮은(데이터 제거 우선순위가 높은) 데이터가 저장되는 영역, 이곳에 위치하게 되는 블록은 짧은 시간동안 관리됨

Shared IO Pool : Oracle 11g부터 나옴,  lob에 nocache가 사용되는 경우 SecureFile LOB 작업에 이 캐시를 사용함 ,NOCACHE 옵션을 사용하여 lob를 작성하는 경우 default임

이 pool의 메모리 크기가 SecureFile LOB 작업에 비해 너무 작은 경우 서버 프로세스는 충분한 공유 메모리를 다시 사용할 수 있을 때까지 PGA 메모리를 임시로 사용함

Data Transfer Cache : Oracle 12cR2에 나왔고 데이터 블록을받는데 사용되는 캐쉬임, Oracle Data Guard 환경의 기본 데이터베이스에서 사용함, 관련 파라미터 :DATA_TRANSFER_CACHE_SIZE

In-Memory Area : Oracle 12cR1에 나왔고 Oracle Database In-Memory는 전통적인 Row Format 방식에 Column Format 방식을 추가로 지원해 OLTP, DW 업무가 혼재된 시스템에서 트랜잭션 처리와, 데이터 분석 등의 모든 업무 프로세스를 지원함
In Memory RW Extension Area : In Memory ReadWrite 확장 공간(추측) ? 어떤 영역인지 제대로 설명된 곳이 없음
In Memory RO Extension Area : In Memory ReadOnly 확장 공간(추측) ? 어떤 영역인지 제대로 설명된 곳이 없음

ASM Buffer Cache : 어떤 캐쉬인지 제대로 설명된 곳이 없음, ASM 미사용시 0으로 표시되고 ASM 사용시 grid 계정으로 접속하거나 ORACLE_HOME을 $GRID_HOME으로 설정하고, ORACLE_SID를 +ASM 으로한뒤 sqlplus / as sysdba 로 접속하면 해당 값을 볼수 있을 테스트 머신에선 24MB로 나왔음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ export ORACLE_HOME=$GRID_HOME
$ export ORACLE_SID=+ASM
$ sqlplus / as sysdba
SQL> 
set lines 200
col component for a40;
col cur_size for a10;
col min_size for a10;
select component,
round(current_size/1024/10242)||'MB' as cur_size,
round(min_size/1024/10242)||'MB' as min_size
from v$sga_dynamic_components
where component = 'ASM Buffer Cache'
/
 
COMPONENT                 CUR_SIZE   MIN_SIZE
---------------------------------------- ---------- ----------
ASM Buffer Cache             24MB        24MB




오라클 10g에서 sga 메모리 파라미터 변경 방법

오라클 10g에서 sga 메모리 변경 방법(https://positivemh.tistory.com/492)



참조 : 

https://db.necoaki.net/120

https://tawool.tistory.com/263

https://kosate.tistory.com/84

http://wiki.gurubee.net/pages/viewpage.action?pageId=26740627

https://secmaster.tistory.com/11

https://community.oracle.com/thread/2845064

https://docs.oracle.com/cd/B28359_01/server.111/b28320/dynviews_3030.htm#REFRN30235

https://docs.oracle.com/database/121/REFRN/GUID-67465D05-C0D2-4646-B9F3-03F8D64E25E1.htm#REFRN00626

http://www.dba-oracle.com/t_11g_new_shared_io_pool.htm

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/refrn/DATA_TRANSFER_CACHE_SIZE.html#GUID-322093B7-1673-490D-8A1A-5F461D7897DD

http://www.koreaoug.org/c12/935

https://sarc.io/index.php/oracledatabase/591-2016-08-19-12-34-31

http://wiki.gurubee.net/pages/viewpage.action?pageId=10190866

http://haisins.epac.to/wordpress/?p=354