내용으로 건너뛰기

Amazon RDS for Oracle 데이터베이스 인스턴스에서 사용 가능한 메모리가 부족하거나 스왑 사용량이 높은 문제를 해결하려면 어떻게 해야 합니까?

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_AGGREGATE_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_AGGREGATE_TARGET이 설정된 경우, 인스턴스는 자동 공유 메모리 관리를 사용합니다.

    자세한 내용은 Oracle 웹 사이트의 자동 메모리 관리 사용을 참조하십시오.

  2. PGA 및 SGA별 메모리 사용량을 보려면 다음 명령을 실행합니다.

    SQL> SELECT (value/1024/1024) CURRENT_PGA_ALLOCATED_IN_MB FROM V$PGASTAT WHERE NAME ='total PGA allocated';SQL> SELECT SUM (bytes/1024/1024) CURRENT_SGA_SIZE_IN_MB,con_id FROM V$SGASTAT group by con_id;

    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 FROMV$PGA_TARGET_ADVICE ORDER BY PGA_TARGET_FACTOR;
    SQL> SELECT SGA_SIZE,SGA_SIZE_FACTOR, ESTD_DB_TIME_FACTOR, ESTD_PHYSICAL_READS FROMV$SGA_TARGET_ADVICE ORDER BY SGA_SIZE ASC;

    참고: CDB 구성에서 V$PGASTAT 명령은 쿼리에서 수행하는 PDB 관련 정보를 표시합니다.

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

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

    MEMORY_TARGET = MEMORY_MAX_TARGET = {DBInstanceClassMemory*3/4}

    인스턴스에서 자동 공유 메모리 관리를 사용하는 경우 PGA_AGGREGATE_TARGETSGA_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_AGGREGATE_TARGET에 대해 다음 값을 설정합니다.
    PGA_AGGREGATE_TARGET = {DBInstanceClassMemory*1/12}

  4. 특정 사용 사례에서 PGA의 메모리 사용량이 PGA_AGGREGATE_TARGET 값을 초과하여 PGA_AGGREGATE_LIMIT 파라미터에 설정된 값까지 도달할 수 있습니다. PGA_AGGREGATE_LIMIT의 기본값은 데이터베이스 인스턴스의 메모리 구성에 따라 달라집니다. 자세한 내용은 Oracle 웹 사이트의 PGA_AGGREGATE_LIMIT를 참조하십시오.

    PGA_AGGREGATE_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,con_id FROM V$PROCESS ORDER BY 4;

    백그라운드 프로세스를 제외한 사용자 세션에 대한 PGA의 메모리 사용량을 보려면 다음 명령을 실행합니다.

    SQL> SELECT sum(p.pga_alloc_mem)/1024/1024 "PGA Allocated MEMORY OF USER SESSION (MB)",p.con_id FROM v$process p, v$session s WHERE P.ADDR = S.paddr and p.background IS NULL group by p.con_id;

    세션별 PGA의 메모리 사용량과 각 세션에서 실행되는 쿼리를 보려면 다음 명령을 실행합니다.

    SQL> SELECT s.username, p.pga_alloc_mem/1024/1024 "PGA Allocated MEMORY OF USER SESSION (MB)", q.sql_text,p.con_id FROM v$process p, v$session s, v$SQL q WHERE P.ADDR = S.paddr AND p.background IS NULL AND s.sql_id = q.sql_id ORDER BY 2;

    참고: CDB 구성에서 con_id 열을 통해 컨테이너 리소스 사용량을 확인합니다. CDB가 아닌 구성에서 con_id 열은 항상 0입니다.

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

    PGA_AGGREGATE_LIMIT 값을 제한합니다. 이렇게 하면 인스턴스의 메모리 부족을 방지할 수 있습니다. 그러나 프로세스에 추가 PGA 메모리가 필요한 경우 연결 실패가 발생할 수 있습니다.

    SGA_TARGET 값을 줄입니다. 이를 통해 PGA_AGGREGATE_TARGET을 메모리 경합 문제를 일으키지 않고 PGA_AGGEGATE_LIMIT 값까지 높일 수 있습니다.
    인스턴스 클래스 크기를 메모리가 더 많은 대규모 인스턴스 크기로 늘립니다.

  5. 위 단계에서 설명한 대로 메모리 파라미터를 조정한 후 데이터베이스 성능을 모니터링하고 데이터베이스 권고 보기를 참조합니다.

    메모리 파라미터 제한으로 인해 성능이 저하되는 경우 인스턴스 크기를 늘려 보십시오. 이렇게 하면 데이터베이스 인스턴스가 효율적으로 작동할 수 있도록 더 많은 메모리를 사용할 수 있습니다.

    Performance Insights 대시보드를 사용하여 데이터베이스 워크로드를 분석하고 메모리 사용량이 가장 높은 쿼리를 식별합니다. 그런 다음, 메모리 사용량이 가장 높은 쿼리를 조정하여 메모리 사용을 줄입니다.

관련 정보

Oracle 웹 사이트의 메모리 아키텍처

AWS 공식업데이트됨 2년 전