티스토리 뷰
관리해야 하는 메모리 구조는 SGA와 PGA입니다. Oracle Database는 파라미터 설정에 의해 선택되는 다양한 메모리 관리 방법을 지원합니다.
Oracle Database는 SGA 메모리와 인스턴스 PGA 메모리를 완전히 자동으로 관리할 수 있습니다. 인스턴스에서 사용할 총 메모리 크기만 지정하면 Oracle Database는 처리 요구 사항을 충족하기 위해 필요에 따라 SGA와 인스턴스 PGA 간에 메모리를 동적으로 교환합니다. 이 기능을 automatic memory management라고 합니다. 이 메모리 관리 방법을 통해 데이터베이스는 개별 SGA 구성 요소의 크기와 개별 PGA의 크기도 동적으로 조정합니다. Oracle은 SGA 및 PGA 메모리의 총크기가 4GB 이하인 데이터베이스에 대해 자동 메모리 관리를 권장합니다.
오라클 메모리 구조는,
- SGA: 하나의 Oracle Database 인스턴스에 대한 데이터 및 제어 정보를 포함하는 SGA 구성 요소로 알려진 공유 메모리 구조 그룹입니다. SGA는 모든 서버 및 백그라운드 프로세스에서 공유됩니다. SGA에 저장된 데이터의 예로는 캐시된 데이터 블록과 공유 SQL 영역이 있습니다.
- PGA: 서버 프로세스에 대한 데이터 및 제어 정보를 포함하는 메모리 영역입니다. 서버 프로세스가 시작될 때 Oracle Database에 의해 생성되는 비공유 메모리입니다. PGA에 대한 액세스는 서버 프로세스에서만 가능합니다. 각 서버 프로세스에 대해 하나의 PGA가 있습니다. 백그라운드 프로세스는 자체 PGA도 할당합니다. Oracle Database 인스턴스에 연결된 모든 백그라운드 및 서버 프로세스에 할당된 총 PGA 메모리를 total instance PGA memory라고 하고 모든 개별 PGA의 모음을 total instance PGA 또는 instance PGA라고 합니다.
인스턴스 메모리를 관리하는 가장 간단한 방법은 Oracle Database 인스턴스가 자동으로 관리하고 조정할 수 있도록 하는 것입니다. 그렇게 하려면(대부분의 플랫폼에서) target memory size 파라미터(MEMORY_TARGET)만 설정하고 선택적으로 maximum memory size 파라미터(MEMORY_MAX_TARGET)를 설정합니다.
SQL> show parameter memory_target
NAME TYPE VALUE
------------------------------------ ----------- ------
memory_target big integer 1152M
SQL> show parameter memory_max_target
NAME TYPE VALUE
------------------------------------ ----------- ------
memory_max_target big integer 1152M
동적 성능 뷰 V$MEMORY_DYNAMIC_COMPONENTS는 SGA 및 인스턴스 PGA의 전체 크기를 포함하여 동적으로 조정된 모든 메모리 구성 요소의 현재 크기를 보여줍니다.
SQL> select COMPONENT, CURRENT_SIZE, MIN_SIZE, MAX_SIZE from v$memory_dynamic_components;
COMPONENT CURRENT_SIZE MIN_SIZE MAX_SIZE
------------------------------ ------------ ---------- ----------
shared pool 285212672 285212672 285212672
large pool 16777216 16777216 16777216
java pool 16777216 16777216 16777216
streams pool 0 0 0
unified pga pool 0 0 0
SGA Target 721420288 721420288 721420288
memoptimize buffer cache 0 0 0
DEFAULT buffer cache 352321536 352321536 352321536
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 33554432 33554432 33554432
Data Transfer Cache 0 0 0
In-Memory Area 0 0 0
In Memory RW Extension Area 0 0 0
In Memory RO Extension Area 0 0 0
PGA Target 486539264 486539264 486539264
ASM Buffer Cache 0 0 0
22 rows selected.
SQL> select COMPONENT, CURRENT_SIZE, MIN_SIZE, MAX_SIZE from v$memory_dynamic_components
2 where CURRENT_SIZE != 0;
COMPONENT CURRENT_SIZE MIN_SIZE MAX_SIZE
------------------------------ ------------ ---------- ----------
shared pool 285212672 285212672 285212672
large pool 16777216 16777216 16777216
java pool 16777216 16777216 16777216
SGA Target 721420288 721420288 721420288
DEFAULT buffer cache 352321536 352321536 352321536
Shared IO Pool 33554432 33554432 33554432
PGA Target 486539264 486539264 486539264
7 rows selected.
Automatic Memory Management일때, 인스턴스가 사용하는 총메모리는 MEMORY_TARGET 값을 기준으로 비교적 일정하게 유지되며 인스턴스는 SGA와 PGA 간에 메모리를 자동으로 분배합니다. 메모리 요구 사항이 변경되면 인스턴스는 SGA와 인스턴스 PGA 간에 메모리를 동적으로 재분배합니다.
MEMORY_TARGET 파라미터는 동적이기 때문에 데이터베이스를 다시 시작하지 않고 언제든지 MEMORY_TARGET을 변경할 수 있습니다. 동적이 아닌 MEMORY_MAX_TARGET은 실수로 MEMORY_TARGET을 너무 높게 설정하지 않도록 상한선 역할을 하며, 향후 총 인스턴스 메모리를 늘리고자 할 경우를 대비하여 데이터베이스 인스턴스에 충분한 메모리를 할당합니다. 특정 SGA 구성 요소는 쉽게 축소될 수 없거나 최소 크기로 유지되어야 하기 때문에 인스턴스는 MEMORY_TARGET을 너무 낮게 설정하는 것도 방지합니다.
AUTOMATIC MEMORY MANAGEMENT를 나중에 활성화 하고자 할 때 활성화 순서:
1. MEMORY_TARGET의 최소값을 다음과 같이 계산합니다.
a. 다음 SQL*Plus 명령을 입력하여 SGA_TARGET 및 PGA_AGGREGATE_TARGET의 현재 크기(MB)를 결정합니다.
SQL> SHOW PARAMETER SGA_TARGET
NAME TYPE VALUE
------------------------------------ ----------- ------
sga_target big integer 0
SQL> SHOW PARAMETER PGA_AGGREGATE_TARGET
NAME TYPE VALUE
------------------------------------ ----------- ------
pga_aggregate_target big integer 0
b. 다음 쿼리를 실행하여 데이터베이스가 시작된 이후 할당된 최대 인스턴스 PGA(MB)를 확인합니다.
SQL> SELECT VALUE/1048576 FROM V$PGASTAT WHERE NAME='maximum PGA allocated';
VALUE/1048576
-------------
391.571289
c. 2b단계의 쿼리 결과와 PGA_AGGREGATE_TARGET 사이의 최댓값을 계산합니다. 이 값에 SGA_TARGET을 추가합니다.MEMORY_TARGET = SGA_TARGET + MAX(PGA_AGGREGATE_TARGET, MAXIMUM PGA ALLOCATED)
5. SPFILE로 설정하고 인스턴스를 실행했을 때(MEMORY_MAX_TARGET 크기는 임의대로 설정)
SQL> ALTER SYSTEM SET MEMORY_MAX_TARGET = 1200M SCOPE = SPFILE;
System altered.
SCOPE = SPFILE 절은 서버 매개변수 파일에만 값을 설정하고 실행 중인 인스턴스에는 설정하지 않습니다. MEMORY_MAX_TARGET은 동적 초기화 매개변수가 아니므로 이 SCOPE 절을 포함해야 합니다. 텍스트 초기화 매개변수 파일로 인스턴스를 시작한 경우 다음 명령문이 포함되도록 파일을 수동으로 편집합니다. memory_max_target = nM
memory_target = mM
참고:텍스트 초기화 매개변수 파일에서 MEMORY_MAX_TARGET 행을 생략하고 MEMORY_TARGET 값을 포함하면 데이터베이스는 MEMORY_MAX_TARGET을 MEMORY_TARGET 값으로 자동 설정합니다. MEMORY_TARGET에 대한 행을 생략하고 MEMORY_MAX_TARGET에 대한 값을 포함하면 MEMORY_TARGET 매개변수의 기본값은 0입니다. 시작 후 MEMORY_MAX_TARGET 값을 초과하지 않는 한 MEMORY_TARGET을 0이 아닌 값으로 동적으로 변경할 수 있습니다.
6. 데이터베이스를 내리고 재기동합니다.
SQL> show parameter memory_max_target
NAME TYPE VALUE
------------------------------------ ----------- ------
memory_max_target big integer 1200M
SQL> show parameter sga_target
MEMORY_TARGET 초기화 매개변수에 대한 조정 조언을 보려면 V$MEMORY_TARGET_ADVICE 보기를 쿼리합니다.
SQL> select * from v$memory_target_advice order by memory_size;
MEMORY_SIZE MEMORY_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR VERSION CON_ID
----------- ------------------ ------------ ------------------- ---------- ----------
864 .75 24 1 0 0
1440 1.25 24 1 0 0
1728 1.5 24 1 0 0
2016 1.75 24 1 0 0
2304 2 24 1 0 0
MEMORY_SIZE_FACTOR가 1인 행은 MEMORY_TARGET 초기화 파라미터에서 설정한 현재 메모리 크기와 현재 워크로드를 완료하는 데 필요한 DB 시간을 보여줍니다. 이전 및 후속 행에서 결과는 몇 가지 대체 MEMORY_TARGET 크기를 보여줍니다. 각 대체 크기에 대해 데이터베이스는 크기 계수(현재 크기의 배수)와 MEMORY_TARGET 매개변수가 대체 크기로 변경된 경우 현재 워크로드를 완료하는 데 필요한 예상 DB 시간을 표시합니다. 현재 MEMORY_TARGET 크기보다 작은 총 메모리 크기의 경우 예상 DB 시간이 증가합니다. 또한 이 예에서는 총 메모리 크기를 450MB 이상으로 늘려도 얻을 수 있는 것이 없습니다. 그러나 전체 워크로드가 아직 실행되지 않은 경우 이 상황이 변경될 수 있습니다.
SGA_MAX_SIZE 파라미터는 인스턴스의 수명 동안 시스템 전역 영역의 최대 크기를 지정합니다.
SQL> show parameter sga_max_size
NAME TYPE VALUE
------------------------------------ ----------- -----
sga_max_size big integer 1200M
SQL> show parameter sga_target
NAME TYPE VALUE
------------------------------------ ----------- -----
sga_target big integer 0
SGA_TARGET 파라미터를 0이 아닌 값으로 설정하여 자동 공유 메모리 관리 기능을 활성화합니다(즉 sga_target 0이란 말은 자동 공유 메모리 관리가 꺼져있다는 뜻). 이 파라미터는 SGA의 전체 크기를 설정합니다. 이것은 개별 구성 요소의 특정 세트에 할당된 메모리를 제어하는 매개변수를 대체합니다. 이 매개변수는 이제 필요에 따라 자동으로 동적으로 크기가 조정(조정)됩니다.
V$SGAINFO 뷰는 다양한 SGA 구성 요소의 현재 조정된 크기에 대한 정보를 제공합니다. V$SGA_TARGET_ADVICE 뷰는 SGA_TARGET 값을 결정하는 데 도움이 되는 정보를 제공합니다.
SQL> COL NAME FOR A32
SQL> SELECT * FROM V$SGAINFO;
NAME BYTES RES CON_ID
-------------------------------- ---------- --- ----------
Fixed SGA Size 9134320 No 0
Redo Buffers 7639040 No 0
Buffer Cache Size 385875968 Yes 0
In-Memory Area Size 0 No 0
Shared Pool Size 285212672 Yes 0
Large Pool Size 16777216 Yes 0
Java Pool Size 16777216 Yes 0
Streams Pool Size 0 Yes 0
Shared IO Pool Size 33554432 Yes 0
Data Transfer Cache Size 0 Yes 0
Granule Size 16777216 No 0
Maximum SGA Size 1258287344 No 0
Startup overhead in Shared Pool 173899968 No 0
Free SGA Memory Available 536870912 0
14 rows selected.
(참고: Granule Size는 인스턴스 시작 시 요청된 메모리 양에 따라 결정됩니다. SGA_MAX_SIZE를 기반으로 합니다. 아래 표는 11gR2 이후 RDBMS에서 크기입니다.
Granule size 확인:
SQL> select bytes from v$sgainfo where name like 'Granule Size';
BYTES
----------
4194304
32-bit 플랫폼에서 최대 granule 크기는 16MB입니다. 이는 granule 크기가 수동으로 overridden된 경우에도 적용됩니다. 또한 동일한 SGA설정에서 18c와 19c의 기본 granule 사이즈가 다를 수 있습니다.
https://login.oracle.com:443/oam/server/obrareq.cgi?encquery%3DglC%2F8qsBZgGkvZErvzpmYKDdBX4VR3saFz%2BRW4G%2FoP9W3COvkBN2KpagpylpNUra5keaMYhbvWb10hPYdSDujf9oNP54mCrnPM2d9Kjpe5qGONlS17F3lzGgUmW3Um8i1K%2BMwSHjmGCzLALwYBC5NCGAgZe%2BnwU1SOmGkzsL6APaj0ZFduj37y1U%2FMojMYDBMUZYNt42Vcm5mHaUWPwIEGbdAre6MshtOjVAukDZdEwHzCzXSLVJTUiDSN7W9Yd4boc8%2BOuST%2FG9Qyrna%2B02pR4f%2Bd%2B83YEcy07snJtX8DTCcHCgLkJYS%2F7ELAjmIxyDWNpZDwn4Ddp2OTiBHeE9sTQgWuHEOCI85C3gKW3nEnO6lSSRYIvBIplNtYZy%2FNhuq7XrDDhCMaYxF0Yygn2yOUFD6UKdqtmf1DU9aR4FwPIttnUmQk5q7gSdM4QWH6EF%2BNr8pMfwRWXMA%2BUuU7S9iWG9T8LBbDHF6NdHCp4UX8EQrF8giVA4dBh%2FhlJyWInqV1DsF9ZyS0xtGhjLHnTSZ4JAioLHcBWDgw8ykAlbGXWhlvu7zKq2yW90XlUOZTwOX1XVFobW5T%2FNjOI2egNrfNbB4O0gXh3R9y%2FEgE8bKYIP49wYFghBMqUS9KXsqk4d3kUPErh%2FGYWtZSwpjlTsG2qi3Z9TvxK2uvs1SHk2s0rod0VlP%2Fx3ozSNgBMfY9m1V%2FTbeYWugO%2F4jBviKKmXJ%2BoQG88v1KZBY2CqSa0aVeI%3D%20agentid%3DcorpWebgates%20ver%3D1%20crmethod%3D2
login.oracle.com:443
- Why is granule size important: SGA 메모리 구성 요소는 여러 개의 GRANULE로 크기가 조정되기 때문입니다. 이러한 구성 요소로는:
shared poolbuffer cacheredo log bufferjava poolstreams poollarge pool이 있습니다. 특히 granule 크기의 배수가 아닌 값을 spfile에 설정하면 할당된 실제 크기가 가장 가까운 granule로 반올림되기 때문에 대규모 SGA에서는 granule size가 중요합니다. granule size은 ASMM과 AMM에서도 고려해야 합니다. shared pool에서 memory pressures가 증가하면 ASMM의 memory auto-tuner가 버퍼 캐시로 이동하여 메모리를 shared pool로 전송합니다. 이 메모리 전송은 granule으로도 수행됩니다. 따라서 SGA 크기가 크면 전송할 수 있는 메모리가 256M 또는 512M이 아니면 메모리 전송이 발생하지 않을 수 있습니다. 하나 이상의 과립을 사용할 수 없으면 ORA-4031이 발생합니다.
)
SQL> SELECT * FROM V$SGA_TARGET_ADVICE
2 ;
SGA_SIZE SGA_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR ESTD_PHYSICAL_READS ESTD_BUFFER_CACHE_SIZE ESTD_SHARED_POOL_SIZE CON_ID
---------- --------------- ------------ ------------------- ------------------- ---------------------- --------------------- ----------
516 .75 24 1 6663 224 224 0
688 1 24 1 6663 384 224 0
860 1.25 24 1 6663 544 224 0
1032 1.5 24 1 6663 704 224 0
1204 1.75 24 1 6663 864 224 0
1376 2 24 1 6663 1024 224 0
6 rows selected.
ASMM(Automatc Shared Mrmody, Management)자동 공유 메모리 관리)을 활성화하는 절차는 수동 공유 메모리 관리에서 ASMM으로 변경하는지 또는 자동 메모리 관리에서 변경하는지에 따라 다릅니다.
수동 공유 메모리 관리에서 ASMM으로 변경하려면:
다음 쿼리를 실행하여 SGA_TARGET에 대한 값을 가져옵니다.
SQL> SELECT (
2 (SELECT SUM(value) FROM V$SGA) -
3 (SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY)
4 ) "SGA_TARGET"
5 FROM DUAL;
SGA_TARGET
----------
721416432
텍스트 초기화 매개변수 파일을 편집하고 데이터베이스를 다시 시작하거나 다음 명령문을 실행하여 SGA_TARGET 값을 설정하십시오.
SQL> ALTER SYSTEM SET SGA_TARGET=721416432;
System altered.
데이터베이스 재기동 후 다시 SGA_TARGET 파라미터 변경 여부를 확인합니다(688M = 721416432/1024/1024).
SQL> SHUTDOWN IMMEDIATE
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> STARTUP
ORACLE instance started.
Total System Global Area 1258287344 bytes
Fixed Size 9134320 bytes
Variable Size 855638016 bytes
Database Buffers 385875968 bytes
Redo Buffers 7639040 bytes
Database mounted.
Database opened.
SQL> SHOW PARAMETER SGA_TARGET
NAME TYPE VALUE
------------------------------------ ----------- -----
sga_target big integer 688M
automatic memory management에서 ASMM으로 변경하려면:
SQL> SHOW PARAMETER MEMORY_TARGET
NAME TYPE VALUE
------------------------------------ ----------- -----
memory_target big integer 1152M
데이터베이스는 현재 SGA 메모리 할당을 기반으로 SGA_TARGET을 설정합니다.
MEMORY_TARGET 초기화 매개변수를 0으로 설정합니다.
SQL> ALTER SYSTEM SET MEMORY_TARGET = 0;
System altered.
SQL> SHOW PARAMETER MEMORY_TARGET
NAME TYPE VALUE
------------------------------------ ----------- -----
memory_target big integer 0
ASMM 사용 예:
예를 들어, 현재 수동 공유 메모리 관리를 위해 구성되고 SGA_MAX_SIZE가 1200M으로 설정된 인스턴스에 대해 다음과 같은 매개변수 구성이 있다고 가정합니다.
SHARED_POOL_SIZE = 200M
DB_CACHE_SIZE = 300M
LARGE_POOL_SIZE=10M
SELECT SUM(value) FROM V$SGA 쿼리 결과는 1200M
SQL> SELECT SUM(value) FROM V$SGA;
SUM(VALUE)
----------
1258287344
SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY 쿼리 결과는 512M
SQL> SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY;
CURRENT_SIZE
------------
536870912
다음 명령문을 실행하여 자동 공유 메모리 관리를 활용할 수 있습니다:
SQL> ALTER SYSTEM SET SGA_TARGET = 688M;
System altered.
SQL> ALTER SYSTEM SET SHARED_POOL_SIZE = 0;
System altered.
SQL> ALTER SYSTEM SET LARGE_POOL_SIZE = 0;
System altered.
SQL> ALTER SYSTEM SET JAVA_POOL_SIZE = 0;
System altered.
SQL> ALTER SYSTEM SET DB_CACHE_SIZE = 0;
System altered.
SQL> ALTER SYSTEM SET STREAMS_POOL_SIZE = 0;
System altered.
SGA_TARGET 매개변수는 SGA_MAX_SIZE 매개변수에 대해 지정된 값까지 동적으로 증가할 수 있으며 감소할 수도 있습니다.
- 참고: ASMM을 활성화할 때 데이터베이스를 시작하기 전에 SGA_TARGET을 원하는 값(nonzero)으로 설정하는 것이 가장 좋습니다. SGA_TARGET을 0에서 nonzero로 동적으로 수정하면 shared pool을 축소할 수 없기 때문에 원하는 결과를 얻지 못할 수 있습니다. 시작 후 필요에 따라 SGA_TARGET을 동적으로 조정하거나 조정할 수 있습니다.
SQL> select NAME BLOCK_SIZE, CURRENT_SIZE, BUFFERS ,TARGET_SIZE, TARGET_BUFFERS, PREV_SIZE, PREV_BUFFERS
2 from v$buffer_pool;
BLOCK_SIZE CURRENT_SIZE BUFFERS TARGET_SIZE TARGET_BUFFERS PREV_SIZE PREV_BUFFERS
-------------------- ------------ ---------- ----------- -------------- ---------- ------------
DEFAULT 348 42456 348 42456 340 41480
ㅇㅇ
'Database > Oracle Database' 카테고리의 다른 글
[오라클] Health Checks 중 V$HM_CHECK_PARAM (0) | 2022.01.14 |
---|---|
[오라클] 메모리 관리 - PGA (0) | 2022.01.13 |
[오라클] ORA-00837, ORA-01078 파라미터 수정 후 인스턴스 시작 불가 해결방법 (0) | 2022.01.11 |
[오라클] Alert Log (0) | 2022.01.09 |
[오라클] 인스턴스 개요, 인스턴스의 식별 (0) | 2022.01.08 |