Amazon RDS for Oracle Database 인스턴스에서 사용 가능한 메모리 부족 또는 높은 스왑 사용량 문제를 처리하려면 어떻게 해야 합니까?

5분 분량
0

Amazon Relational Database Service(Amazon RDS) for Oracle DB 인스턴스에서 사용 가능한 메모리가 부족하거나 스왑 사용량이 높은 문제를 처리하려고 합니다.

간략한 설명

Oracle 데이터베이스에서 사용 가능한 메모리는 주로 프로그램 글로벌 영역(PGA) 및 시스템 글로벌 영역(SGA)에서 사용됩니다. Oracle DB 인스턴스를 구성할 때는 이 두 구성 요소의 합계가 총 물리적 메모리보다 적어야 다른 호스트 프로세스 및 기능에 사용할 수 있는 메모리를 확보할 수 있습니다. 높은 스왑 사용량과 대량의 실제 메모리 사용을 방지하려면 메모리 파라미터를 조정해야 합니다. 스왑 사용량 및 권장 제한에 대한 자세한 내용은 메모리가 충분한데도 Amazon RDS DB 인스턴스에서 스왑 메모리를 사용하는 이유는 무엇입니까?를 참조하세요.

DB 인스턴스에서 자동 메모리 관리를 사용하는 경우 Oracle 데이터베이스에서 사용하는 총 메모리 양은 MEMORY_TARGETMEMORY_MAX_TARGET 파라미터로 관리됩니다. MEMORY_TARGET에 설정된 값은 SGA와 PGA의 합계와 같습니다. SGA에서 사용하는 메모리는 SGA_MAX_SIZESGA_TARGET 파라미터에 의해 결정됩니다. PGA에서 사용하는 메모리는 PGA_AGREGATE_TARGETPGA_AGGREGATE_LIMIT 파라미터에 의해 관리됩니다. 이러한 파라미터의 기본값은 성능상의 이유로 높게 설정됩니다. 그러나 특정 사용 사례에서는 이러한 값이 높으면 메모리 경합과 스왑 사용량이 높아질 수 있습니다.

해결 방법

이 문제를 해결하려면 인스턴스의 메모리 관리 모드에 따라 다음 방법 중 하나를 사용합니다.

  • DB 인스턴스에서 자동 메모리 관리를 사용하는 경우 MEMORY_TARGET의 값을 줄입니다.
  • DB 인스턴스가 자동 공유 메모리 관리를 사용하는 경우 인스턴스에서 PGA 및 SGA 파라미터 값을 줄입니다.

참고: 이러한 파라미터는 동적 파라미터이지만 해당 파라미터를 수정하려면 장애 조치 없이 인스턴스를 재부팅해야 합니다. 자세한 내용은 RDS for Oracle 인스턴스의 HugePages 켜기에서 참고 사항을 참조하세요.

다음 문제 해결 단계를 시도해 보세요.

1.    DB 인스턴스가 자동 메모리 관리 또는 자동 공유 메모리 관리를 사용하는지 확인합니다. SGA, PGA 및 MEMORY_TARGET 파라미터를 확인하여 이를 수행할 수 있습니다.

SQL> SHOW PARAMETER SGA;

SQL> SHOW PARAMETER PGA;

SQL> SHOW PARAMETER MEMORY_TARGET;
  • MEMORY_TARGET이 설정된 경우 인스턴스는 자동 메모리 관리를 사용합니다.
  • MEMORY_TARGET이 설정되지 않았지만 SGA_TARGET과 PGA_AGREGATE_TARGET이 설정된 경우 인스턴스는 자동 공유 메모리 관리를 사용합니다.

다양한 메모리 관리 모드에 대한 자세한 내용은 메모리 관리 정보에 대한 Oracle 설명서를 참조하세요.

2.    다음 쿼리를 실행하여 각각 PGA 및 SGA별 메모리 사용량을 확인합니다.

SQL> SELECT (value/1024/1024) CURRENT_PGA_IN_USE_IN_MB FROM V$PGASTAT WHERE NAME ='total PGA inuse';

SQL> SELECT SUM (bytes/1024/1024) CURRENT_SGA_SIZE_IN_MB FROM V$SGASTAT;

다음 쿼리를 실행하여 마지막 재부팅 후 각각 PGA 및 SGA에 할당된 최대 메모리를 확인합니다.

SQL> SELECT (value/1024/1024) MAX_PGA_ALLOCATED_IN_MB FROM V$PGASTAT WHERE NAME = 'maximum PGA allocated';

SQL> SELECT SUM (bytes/1024/1024) MAX_SGA_SIZE_IN_MB FROM V$SGAINFO WHERE NAME='Maximum SGA Size';

다음 쿼리를 실행하여 PGA 및 SGA에 대한 권고 사항 보기를 각각 확인합니다.

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

SQL> SELECT SGA_SIZE,
SGA_SIZE_FACTOR, ESTD_DB_TIME_FACTOR, ESTD_PHYSICAL_READS FROM
V$SGA_TARGET_ADVICE ORDER BY SGA_SIZE ASC;

3.    과도한 메모리 소비와 높은 스왑 사용량을 방지하기 위해 메모리 파라미터에 대한 적절한 설정을 정의합니다. 이러한 설정은 성능 향상을 위해 데이터베이스를 조정하는 데도 도움이 될 수 있습니다. 인스턴스 파리미터 그룹을 사용하여 이러한 예제의 파라미터를 변경할 수 있습니다.

인스턴스에서 자동 메모리 관리를 사용하는 경우 MEMORY_TARGET 파라미터만 설정됩니다. 이 파라미터는 기본적으로 다음 값으로 설정됩니다.

MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*3/4}

인스턴스에서 자동 공유 메모리 관리를 사용하는 경우 PGA_AGREGATE_TARGET 파라미터 및 SGA_TARGET 파라미터는 각각 다음과 같은 기본값으로 설정됩니다.

PGA_AGGREGATE_TARGET= {DBInstanceClassMemory*1/8}

SGA_TARGET= SGA_MAX_SIZE = {DBInstanceClassMemory*3/4}

이러한 기본 설정으로 메모리 사용량이 높으면 Oracle 인스턴스에서 사용하는 메모리를 제한하도록 기본 설정을 조정할 수 있습니다. 메모리 파라미터를 조정하기 위해 앞의 메모리 권고 사항 보기를 사용할 수 있습니다. 프로덕션 데이터베이스에 변경 사항을 적용하기 전에 테스트 환경에서 메모리 파라미터를 조정하는 것이 좋습니다.

예:

인스턴스가 자동 메모리 관리인 경우 다음과 같이 MEMORY_TARGETMEMORY_MAX_TARGET 값만 줄입니다.

MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*1/2}

-또는-

MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*3/5}

-또는-

MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*2/3}

인스턴스에서 자동 공유 메모리 관리를 사용하는 경우 이전 단계에 표시된 권고 값에 따라 SGA 및/또는 PGA의 메모리 파라미터만 줄입니다. 예:

SGA_TARGET = {DBInstanceClassMemory*1/2}

-또는-

SGA_TARGET = {DBInstanceClassMemory*2/3}

PGA_AGREGATE_TARGET에 대해 다음 값을 설정하여 프로그램 메모리 영역의 메모리 사용량을 조정할 수도 있습니다.

PGA_AGGREGATE_TARGET = {DBInstanceClassMemory*1/12}

4.    특정 사용 사례에서 PGA의 메모리 사용량은 PGA_AGREGATE_TARGET 값을 초과하여 PGA_AGREGATE_LIMIT 파라미터에 설정된 값까지 도달할 수 있습니다. PGA_AGREGATE_LIMIT의 기본값은 데이터베이스 인스턴스의 메모리 구성에 따라 다릅니다. 자세한 내용은 PGA_AGGREGATE_LIMIT에 대한 Oracle 설명서를 참조하세요. PGA_AGREGATE_LIMIT의 기본값이 너무 높으면 RDS 인스턴스가 기본 호스트에 대한 물리적 메모리가 매우 낮거나 전혀 없을 수 있으므로 스왑 사용량이 높고 메모리 경합 문제가 발생할 수 있습니다.

이러한 사용 사례를 해결하려면 많은 양의 PGA를 사용하는 프로세스 또는 쿼리를 찾습니다. 다음 쿼리를 실행하여 프로세스별 프로그램 영역 할당을 확인합니다.

SQL> 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별 메모리 사용량을 확인합니다.

SQL> 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별 메모리 사용량과 각 세션에서 실행되는 쿼리를 확인합니다.

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

PGA의 높은 메모리 사용량을 줄이려면 다음 방법 중 하나 이상을 사용합니다.

  • PGA_AGGREGATE_LIMIT 값을 제한합니다. 이렇게 하면 인스턴스의 메모리 부족을 방지할 수 있습니다. 그러나 프로세스에 추가 PGA 메모리가 필요한 경우 연결 실패가 발생할 수 있습니다.
  • SGA_TARGET 값을 적절하게 줄입니다. 이를 통해 메모리 경합 문제를 일으키지 않고 PGA_AGGREGATE_TARGETPGA_AGGEGATE_LIMIT 값까지 증가할 수 있습니다.
  • 더 많은 메모리로 인스턴스 클래스 크기를 더 큰 인스턴스 크기로 늘립니다.

5.    이전 단계에서 설명한 대로 메모리 파라미터를 조정한 후 데이터베이스 성능을 모니터하고 데이터베이스 권고 사항 보기를 참조합니다. 메모리 파라미터를 제한하여 성능이 저하되는 경우 인스턴스 크기를 늘려 봅니다. 이렇게 하면 데이터베이스 인스턴스가 효율적으로 작동할 수 있도록 메모리를 더 많이 사용할 수 있습니다. 성능 개선 도우미 대시보드를 사용하여 데이터베이스 워크로드를 분석하고 메모리 사용량이 가장 높은 쿼리를 식별할 수 있습니다. 그런 다음 메모리 사용량이 가장 많은 쿼리를 조정하여 메모리를 덜 사용할 수 있습니다.


관련 정보

메모리 아키텍처에 대한 Oracle 설명서