AWS RDS의 오라클 메모리에 대해 알아봅니다. Oracle 11g 이상의 버전으로 메모리 관리기법에는 두 가지가 있습니다.
ASMM(Automatic Shared Memory Management)
- SGA_TARGET 값으로 동작, SGA_TARGET 값 안에서 SGA 메모리 자동 사용
AMM(Automatic memory management)
- MEMORY_TARGET 값으로 동작, MEMORY_TARGET 값 안에서 SGA, PGA메모리 자동 사용
Oracle RDS Parameter의 기본 메모리 값
- memory_max_target : IF({DBInstanceClassHugePagesDefault}, 0, {DBInstanceClassMemory3/4})
- memory_target : IF({DBInstanceClassHugePagesDefault}, 0, {DBInstanceClassMemory3/4})
- sga_target : IF({DBInstanceClassHugePagesDefault}, {DBInstanceClassMemory3/4}, 0)
- pga_aggregate_target : IF({DBInstanceClassHugePagesDefault}, {DBInstanceClassMemory1/8}, 0)
- sga_max_size : –
- pga_aggregate_limit : –
중요 변수
https://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/UserGuide/Oracle.Concepts.HugePages.html
DBInstanceClassHugePagesDefault : FALSE가 기본값
- 14GiB 미만이면 DBInstanceClassHugePagesDefault = FALSE, use_large_pages = FALSE
- 14GiB 이상에서 100GiB 미만이면 DBInstanceClassHugePagesDefault = TRUE, use_large_pages = ONLY
- 100GiB 이상이면 DBInstanceClassHugePagesDefault = TRUE, use_large_pages = ONLY, HugePages는 비활성화할 수 없습니다.
⇒ 위에 따라 인스턴스 메모리가 8GB 이면, DBInstanceClassHugePagesDefault가 False가 되어 memory_max_target =8*3/4, memory_target =8*3/4, sga_target=0, pga_aggregate_target=0 이 됩니다.
⇒ 만약 인스턴스 메모리가 16GB 이면, DBInstanceClassHugePagesDefault가 True가 되어 memory_max_target =0, memory_target =0, sga_target=16*3/4, pga_aggregate_target=16*1/8 이 됩니다.
show parameter target 명령어로 설정된 값을 확인할 수 있습니다.
각각 실제 사용하는 메모리를 알아보려면 아래와 같이 수행합니다.
-- CURRENT_SGA_SIZE_IN_MB
SELECT SUM (bytes/1024/1024) CURRENT_SGA_SIZE_IN_MB FROM V$SGASTAT;
CURRENT_SGA_SIZE_IN_MB 3663.99658966064453125
-- CURRENT_PGA_IN_USE_IN_MB
SELECT (value/1024/1024) CURRENT_PGA_IN_USE_IN_MB FROM V$PGASTAT WHERE NAME ='total PGA inuse';
CURRENT_PGA_IN_USE_IN_MB 2192.2841796875
위 경우는 8GB미만인 경우로 Memory Target 값으로 SGA, PGA가 적당히 나눠서 사용하는 경우입니다.
SGA나 PGA중 특정 영역이 과다하게 사용되도 자동으로 조정되지만, 수동으로 조정이 필요한 경우 Parameter에서 수정해 주시면 됩니다.
ASMM 의 경우 SGA_max_size를 Static 변수로 가지고 있고, SGA_TARGET을 Dynamic변수로 가지므로 SGA_max_size 값 내에서 SGA_TARGET변수값을 조정해서 사용 가능, 재부팅을 한다면 SGA_max_size 변경도 가능
AMM의 경우 memory_max_target 값이 Static 변수이고, memory_target 값이 Dynamic 변수로 memory_max_target 값 내에서 memory_target 값을 조정해서 사용 가능합니다. 마찬가지로 재부팅을 한다면 memory_max_target 값도 변경 가능합니다.
추가 설정을 위한 참고 쿼리입니다.
-- 권장 PGA
SELECT PGA_TARGET_FOR_ESTIMATE,
PGA_TARGET_FACTOR, ADVICE_STATUS, ESTD_TIME, ESTD_PGA_CACHE_HIT_PERCENTAGE FROM
V$PGA_TARGET_ADVICE ORDER BY PGA_TARGET_FACTOR;
-- 권장 SGA
SELECT SGA_SIZE,
SGA_SIZE_FACTOR, ESTD_DB_TIME_FACTOR, ESTD_PHYSICAL_READS FROM
V$SGA_TARGET_ADVICE ORDER BY SGA_SIZE ASC;
-- 많은 양의 PGA를 사용하는 프로세스 또는 쿼리
SELECT spid, program, round(pga_max_mem/1024/1024) max_MB, round(pga_alloc_mem/1024/1024)alloc_MB, round(pga_used_mem/1024/1024) used_MB, round(pga_freeable_mem/1024/1024) free_MB FROM V$PROCESS ORDER BY 3;
-- 백그라운드 프로세스를 제외한 사용자 세션에 대한 PGA별 메모리 사용량
SELECT sum(p.pga_max_mem)/1024/1024 "PGA MAX MEMORY OF USER SESSION (MB)" FROM v$process p, v$session s WHERE P.ADDR = S.paddr and s.username IS NOT NULL;
-- 세션당 PGA별 메모리 사용량과 각 세션에서 실행되는 쿼리
SELECT s.username, p.pga_max_mem/1024/1024 "PGA MEMORY OF USER SESSION (MB)", q.sql_text FROM v$process p, v$session s, v$SQL q WHERE P.ADDR = S.paddr AND s.username IS NOT NULL AND s.sql_id = q.sql_id ORDER BY 2;
감사합니다.
'Database > Oracle' 카테고리의 다른 글
Oracle 시퀀스(Sequence) 이관 (0) | 2024.04.13 |
---|---|
DBMS_DATAPUMP 중지 방법 (0) | 2024.04.13 |
오라클 쿼리 튜닝 방법(기초) (0) | 2024.04.13 |
Oracle Database Migration to aws RDS using DB-LINK (0) | 2024.04.13 |
Oracle 11g Client 설치 가이드 (MS-SQL Linked Server를 위한 최소 설치) (0) | 2024.04.12 |