Amazon Relational Database Service(Amazon RDS) DB 인스턴스를 실행 중입니다. 사용 가능한 메모리가 충분히 할당되었는데도 인스턴스에서 많은 양의 스왑 메모리를 사용합니다. 이 문제를 해결하고 싶습니다.
간략한 설명
Linux를 실행하는 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스는 시스템에 할당된 메모리보다 많은 메모리가 필요할 때 스왑 메모리를 사용합니다. 자세한 내용은 M1 및 C1 EC2 인스턴스의 인스턴스 저장소 스왑 볼륨 활성화를 참조하십시오. 대부분의 RDS DB 인스턴스는 Linux(SQL Server 제외)를 사용하므로 데이터베이스에서 스왑 메모리를 사용할 수 있습니다.
RDS DB 인스턴스는 현재 페이지에 액세스할 때(예: 쿼리를 실행할 때) RAM의 페이지만 필요로 합니다. 이전에 실행한 쿼리를 통해 RAM으로 가져온 다른 페이지는 사용하지 않는 경우 공간을 스왑하기 위해 플러시됩니다. 운영 체제(OS)가 페이지를 메모리에 강제로 보관하도록 하는 대신 OS가 이전 페이지를 스왑하도록 하는 것이 좋습니다. 이렇게 하면 향후 쿼리에 사용할 수 있는 충분한 여유 RAM을 확보할 수 있습니다.
Linux 스왑 사용량은 자주 지워지지 않는데, 스왑 사용량을 지우려면 필요할 경우 및 페이지를 다시 로드할 경우 스왑을 재할당하기 위한 추가적인 오버헤드가 필요하기 때문입니다. 따라서 RDS DB 인스턴스에서 스왑 공간을 한 번만 사용하더라도 SwapUsage 지표는 0으로 돌아가지 않습니다. Amazon RDS for Oracle에서 지원하는 HugePages 및 Amazon RDS for PostgreSQL의 HugePages를 사용하는 경우에도 스왑 메모리를 사용할 수 있습니다. HugePages는 Linux의 기본 크기인 2MB보다 큽니다.
해결 방법
RDS DB 인스턴스의 스왑 사용 동작을 이해하려면 먼저 애플리케이션 워크로드를 기반으로 하는 DB 성능 지표를 확인합니다. FreeableMemory 및 SwapUsage Amazon CloudWatch 지표를 모두 검토하여 RDS DB 인스턴스의 전체 메모리 사용 패턴을 확인하십시오. SwapUsage 지표의 증가와 동시에 발생하는 FreeableMemory 지표의 감소가 있는지 확인하십시오. 이를 통해 RDS DB 인스턴스의 메모리에 압박이 있음을 보여줄 수 있습니다. 자세한 내용은 Amazon RDS for MySQL 데이터베이스의 사용 가능 메모리 부족 문제를 해결하려면 어떻게 해야 합니까?를 참조하십시오.
사용 가능한 메모리가 충분하면 스왑 사용량이 RDS DB 인스턴스의 성능에 영향을 주지 않습니다. 사용 가능한 메모리가 지속적으로 부족하면 메모리가 많은 더 큰 인스턴스 클래스로 RDS DB 인스턴스 클래스를 변경하십시오.
스왑 메모리를 모니터링하려면 향상된 모니터링을 켜고 최소 1초 간격으로 지표를 검토하십시오. 향상된 모니터링은 호스트 수준에서 통계를 수집하고 CloudWatch는 60초마다 하이퍼바이저 수준에서 데이터를 수집합니다. 향상된 모니터링에서는 1초 동안 발생하는 증가 또는 감소를 파악하고 개별 프로세스에서 사용하는 CPU와 메모리를 보여줍니다. 자세한 내용은 CloudWatch 로그를 사용하여 OS 지표 보기를 참조하십시오.
또한 성능 개선 도우미를 활성화하면 RDS DB 인스턴스에서 과도한 스왑 또는 메모리를 사용하는 SQL 및 대기 이벤트를 파악할 수 있습니다. 성능 개선 도우미는 데이터베이스 수준에서 데이터를 수집하여 성능 개선 도우미 대시보드에 데이터를 표시합니다. 성능 개선 도우미를 사용하면 데이터베이스 성능 관련 문제를 해결하는 데 도움이 됩니다. 자세한 내용은 Amazon RDS의 성능 개선 도우미를 통한 DB 로드 모니터링을 참조하십시오.
Amazon RDS for MySQL
사용 가능한 메모리가 부족한 경우 SHOW FULL PROCESSLIST를 실행하여 데이터베이스에서 실행되는 모든 스레드를 확인하십시오. 자세한 내용은 MySQL 웹사이트에서 SHOW PROCESSLIST 문을 참조하십시오. SHOW FULL PROCESSLIST 출력의 프로세스 ID는 향상된 모니터링에 표시되는 프로세스 ID와 일치하지 않습니다. 올바른 프로세스 ID를 보려면 Performance_Schema 파라미터로 데이터베이스와 연결된 DB 파라미터 그룹을 수정하십시오. 이 파라미터는 정적 파라미터이므로 RDS DB 인스턴스를 재부팅해야 합니다.
참고: 가동 중지 시간을 방지하려면 파라미터를 수정하고 피크 트래픽 시간이 아닌 시간에 데이터베이스를 재부팅하십시오.
메모리가 원하는 사용량에 도달한 후 다음 단계를 완료하십시오.
- 최대 CPU를 사용하는 프로세스의 ID를 볼 수 있도록 향상된 모니터링 페이지에서 프로세스 ID를 정렬합니다.
- 마스터 사용자로 다음 쿼리를 실행합니다.
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
자세한 내용은 MySQL 웹사이트에서 스레드 테이블을 참조하십시오.
- 이 쿼리의 출력에서 PROCESSLIST_ID 열을 가져옵니다. 이 열은 SHOW FULL PROCESSLIST의 프로세스 ID 값과 일치하는 프로세스 ID를 제공합니다.
- 올바른 프로세스 ID가 설정된 후 프로세스 ID를 쿼리와 매핑합니다. 프로세스 ID를 사용하여 높은 메모리 및 CPU 사용량의 근본 원인을 파악하십시오.
OS 프로세스를 보려면 향상된 모니터링을 사용합니다. 자세한 내용은 RDS 콘솔에서 OS 지표 보기를 참조하십시오.
Amazon RDS for PostgreSQL
많은 양의 메모리를 사용하는 프로세스를 확인하려면 향상된 모니터링 프로세스 목록의 프로세스 ID를 정확한 쿼리에 매핑하십시오. 프로세스를 확인하려면 다음 pg_stat_activity 뷰를 실행하십시오.
select * from pg_stat_activity where pid=(the PID of your process);
그런 다음, 컴퓨팅 리소스를 덜 사용하도록 쿼리를 조정하십시오.
Amazon RDS for SQL Server
향상된 모니터링에서는 많은 양의 메모리를 사용하는 특정 스레드 ID를 파악할 수 있습니다. 스레드 ID는 RDS for SQL Server에서 커널 프로세스 ID(KPID)라고 부르는 ID입니다.
RDS for SQL Server에서 다음 쿼리를 실행하여 KPID에 해당하는 서버 프로세스 ID(SPID)를 가져옵니다.
select * from sys.sysprocesses where kpid = '<Value of Thread ID from Enhanced Monitoring>' ;
서버 프로세스 ID(예: 69)가 있으면 다음 명령을 실행하여 SPID 69에서 수행하는 작업을 검토합니다.
dbcc inputbuffer(69)
Amazon RDS for Oracle
가장 많은 메모리를 사용하는 프로세스를 파악하려면 향상된 모니터링의 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>';
향상된 모니터링을 켠 경우에는 FreeMemory와 FreeableMemory 지표를 비교하십시오. 지표가 서로 다르면 대규모 메모리가 캐시 또는 비활성 메모리에서 사용되고 있음을 보여줄 수 있습니다. 이러한 메모리 사용으로 인해 스왑 사용량이 많아질 수 있습니다. 캐시를 지워야 할 수도 있습니다. 캐시를 지우는 방법에 대한 자세한 내용은 버퍼 캐시 플러시를 참조하십시오.
참고: 버퍼 캐시를 지우면 데이터베이스 성능에 부정적인 영향을 미칠 수 있습니다.
관련 정보
Amazon RDS용 모니터링 도구