충분한 메모리가 있는데도 Amazon RDS 인스턴스가 스왑 메모리를 사용하는 이유는 무엇입니까?

최종 업데이트 날짜: 2020년 5월 13일

Amazon Relational Database Service(Amazon RDS) DB 인스턴스를 실행 중인데, 충분한 여유 메모리가 할당되어 있음에도 불구하고 Amazon RDS DB 인스턴스가 많은 양의 스왑 메모리를 사용합니다. 메모리가 충분한데도 스왑 메모리를 사용하는 이유는 무엇입니까?

간략한 설명

Linux를 실행하는 Amazon EC2(Amazon Elastic Compute Cloud) 인스턴스는 시스템이 할당된 양 이상의 메모리를 필요로 할 때 스왑 메모리를 사용합니다. 자세한 내용은 인스턴스 스토어 스왑 볼륨을 참조하십시오. 대부분의 RDS DB 인스턴스는 Linux(SQL Server 제외)를 사용하므로 데이터베이스는 때때로 스왑 메모리를 사용할 수 있습니다.

RDS DB 인스턴스는 쿼리를 실행하는 중인 경우와 같이 현재 해당 페이지에 액세스하고 있을 때에만 RAM에 있는 페이지를 필요로 합니다. 이전에 실행한 쿼리에 의해 RAM으로 가져온 다른 페이지는 최근에 사용하지 않은 경우 스왑 공간으로 플러시됩니다. OS(운영 체제)가 메모리에 페이지를 유지하도록 하는 대신 OS가 오래된 페이지를 스왑하도록 하는 것이 좋습니다. 이렇게 하면 추후 쿼리에 사용할 수 있는 여유 RAM이 충분히 확보됩니다.

Linux 스왑 사용량은 필요할 때와 페이지를 다시 로드할 때 스왑을 재할당하는 데 추가 오버헤드가 필요하므로 이 스왑 사용량은 자주 지워지지 않습니다. 결과적으로, 스왑 공간을 RDS DB 인스턴스에서 사용하는 경우 스왑 공간이 한 번만 사용된 경우에도 SwapUsage 측정치가 0으로 돌아가지 않습니다. 스왑 메모리는 Amazon RDS for Oracle에서 지원하는 HugePagesAmazon RDS for PostgreSQL에서 지원하는 HugePages를 사용하는 경우에도 사용될 수 있습니다. HugePages는 Linux 기본 크기인 2메가바이트보다 큽니다.

​해결 방법

RDS DB 인스턴스에 대한 스왑 사용량 동작을 이해하려면 먼저 애플리케이션 워크로드를 기반으로 DB 성능 측정치를 확인합니다. RDS DB 인스턴스의 전반적인 메모리 사용량 패턴을 이해하려면 Amazon CloudWatch 측정치인 FreeableMemorySwapUsage를 확인합니다. 이러한 측정치에서 SwapUsage 측정치와 동시에 감소되는 FreeableMemory 측정치가 있는지 확인합니다. 이는 RDS DB 인스턴스의 메모리에 압력이 있음을 가리키는 것일 수 있습니다. 자세한 내용은 Amazon RDS for MySQL 또는 MariaDB 데이터베이스의 여유 메모리 수준이 낮은 문제를 해결하려면 어떻게 해야 합니까?를 참조하십시오. 사용 가능한 여유 메모리가 충분한 경우, 스왑 사용량은 RDS DB 인스턴스의 성능에 영향을 미치지 않습니다. 여유 메모리 수준이 지속적으로 낮은 경우, 더 많은 메모리를 가진 더 큰 인스턴스 크기로 RDS DB 인스턴스 크기를 변경할 수 있습니다.

스왑 메모리를 모니터링하려면 Enhanced Monitoring을 활성화하여 최소 1초에 이르는 세분화된 간격으로 측정치를 검토합니다. Enhanced Monitoring은 호스트 수준에서 통계를 수집하고, CloudWatch는 60초마다 하이퍼바이저 수준으로부터 데이터를 수집합니다. Enhanced Monitoring을 사용하면 단 1초 동안 발생하는 증가 또는 감소를 식별하고, 개별 프로세스에 의해 사용되는 CPU 및 메모리를 볼 수 있습니다. 자세한 내용은 CloudWatch 측정치와 Enhanced Monitoring 측정치의 차이점을 참조하십시오.

성능 개선 도우미를 활성화하여 RDS DB 인스턴스에서 과다한 스왑 또는 메모리를 소비하는 SQL 및 대기 이벤트를 식별할 수도 있습니다. 성능 개선 도우미는 데이터베이스 수준에서 데이터를 수집하여 해당 데이터를 성능 개선 도우미 대시보드에 표시합니다. 성능 개선 도우미는 데이터베이스 성능 관련 문제를 해결하는 데 도움이 됩니다. 자세한 내용은 Amazon RDS 성능 개선 도우미 사용을 참조하십시오.

Amazon RDS MySQL

여유 메모리 수준이 낮은 경우, SHOW FULL PROCESSLIST를 실행하여 데이터베이스에서 실행 중인 모든 스레드를 검토합니다. 자세한 내용은 Threads Table에 대한 MySQL 설명서를 참조하십시오. SHOW FULL PROCESSLIST의 출력에 있는 프로세스 ID는 Enhanced Monitoring에 의해 표시된 프로세스 ID와 일치하지 않습니다. 올바른 프로세스 ID를 보려면 데이터베이스에 연결된 DB 파라미터 그룹을 수정하여 Performance_Schema 파라미터를 활성화합니다. 이는 정적 파라미터이므로 RDS DB 인스턴스를 재부팅해야 합니다. 가동 중지를 피하려면 피크 트래픽 시간대가 아닐 때에 파라미터를 수정하고 데이터베이스를 재부팅합니다. 메모리가 원하는 사용량에 도달하면 다음 단계를 따릅니다.

1.    최대 CPU를 소비하는 프로세스의 ID를 볼 수 있도록 [Enhanced Monitoring] 페이지의 프로세스 ID를 정렬합니다.

2.    마스터 사용자 권한으로 다음 쿼리를 실행합니다.

select * from performance_schema.threads where THREAD_OS_ID in (ID shown in the Enhanced Monitoring window)\G

예를 들어, Thread_OS_Id 10374 및 1432에 의해 최대 메모리가 소비된 경우, 다음 쿼리를 실행합니다.

select * from performance_schema.threads where THREAD_OS_ID in (10374, 1432)\G

3.    이 쿼리의 출력에서 PROCESSLIST_ID 열을 가져옵니다. 여기에서 SHOW FULL PROCESSLIST의 프로세스 ID 값과 일치하는 프로세스 ID를 얻을 수 있습니다.

올바른 프로세스 ID를 가져왔으면 프로세스 ID를 쿼리에 매핑할 수 있습니다. 이 ID를 사용하면 높은 메모리 및 CPU 사용량의 근본 원인을 식별할 수 있습니다. OS 프로세스는 Enhanced Monitoring을 사용하여 볼 수 있습니다. 자세한 내용은 Enhanced Monitoring 보기를 참조하십시오.

Amazon RDS PostgreSQL

많은 양의 메모리를 소비하는 프로세스를 식별하려면, 다음 pg_stat_activity 보기를 실행하여 Enhanced Monitoring 프로세스 목록에 있는 프로세스 ID를 정확한 쿼리에 매핑합니다.

select * from pg_stat_activity where pid=(the PID of your process);

그런 다음 더 적은 컴퓨팅 리소스를 소비하도록 쿼리를 조정합니다.

Amazon RDS SQL Server

Enhanced Monitoring은 많은 양의 메모리를 사용하는 특정 스레드 ID를 식별할 수 있습니다. 스레드 ID는 SQL Server에서 KPID(커널 프로세스 ID)라고 하는 ID입니다.

Amazon RDS for SQL Server에서 다음 쿼리를 실행하여 KPID에 해당하는 SPID(서버 프로세스 ID)를 가져옵니다.

select * from sys.sysprocesses where kpid = '<Value of Thread ID from Enhanced Monitoring>' ;

서버 프로세스 ID(예: 69)를 가져왔으면 다음 명령을 실행하여 SPID 69에 의해 수행되는 작업을 검토합니다.

dbcc inputbuffer(69)

Amazon RDS Oracle

Enhanced Monitoring에서 OS 프로세스 ID를 사용하면 어느 프로세스가 가장 많은 메모리를 소비하는지 볼 수 있습니다. 그런 다음, 다음 쿼리를 실행하여 세션에 대한 프로세스 주소를 가져옵니다.

select ADDR from v$process where SPID=OS_PID;

프로세스 주소를 사용하면 다음 쿼리를 실행하여 데이터베이스 내부의 세션을 식별할 수 있습니다.

select sid,serial#,username, status from v$session where PADDR='<ADDR from above query>';

이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?