본문 바로가기

Database/Oracle

AWS RDS Oracle Memory 고찰

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

 

RDS for Oracle 인스턴스에 HugePages 활성화 - Amazon Relational Database Service

장애 조치 없이 인스턴스를 재부팅할 때까지 Oracle DB 인스턴스는 SGA 관련 초기화 파라미터에 대한 변경 사항을 연기합니다. Amazon RDS 콘솔에서 재부팅을 선택하지만 장애 조치로 재부팅을 선택하

docs.aws.amazon.com

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 명령어로 설정된 값을 확인할 수 있습니다.

Oracle 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;

 

감사합니다.