Amazon RDS 또는 Amazon Aurora PostgreSQL의 높은 CPU 사용률 문제를 해결하려면 어떻게 해야 하나요?

최종 업데이트 날짜: 2020년 6월 18일

Amazon Relational Database Service(Amazon RDS) 또는 Amazon Aurora PostgreSQL에서 높은 CPU 사용률을 유발하는 원인을 식별하고 이를 해결하려면 어떻게 해야 하나요?

간략한 설명

로드에서 CPU 사용률이 높으면 다음 도구를 조합해 사용하여 원인을 식별할 수 있습니다.

이 문서에서는 이러한 각각의 도구를 사용하여 CPU 사용량이 높은 원인을 밝히는 방법에 대해 설명합니다.

해결 방법

Amazon CloudWatch 지표

CloudWatch 지표를 사용하여 오랫동안 CPU 패턴을 식별할 수 있습니다. WriteIOPs, ReadIOPs, ReadThroughput, WriteThroughput 그래프를 CPU 사용률과 비교하여 워크로드에서 CPU를 많이 사용하는 시점을 알아냅니다.

시간대를 찾아낸 후 DB 인스턴스와 연결된 Enhanced Monitoring 데이터를 검토할 수 있습니다. 1, 5, 10, 15, 30, 60초 간격으로 데이터를 수집하도록 Enhanced Monitoring을 설정할 수 있습니다. 이렇게 하면 CloudWatch보다 더욱 짧은 간격으로 데이터를 수집할 수 있습니다. 자세한 내용은 CloudWatch 지표와 Enhanced Monitoring 지표의 차이점을 참조하세요.

Enhanced Monitoring

Enhanced Monitoring에서는 OS(운영 체제) 수준에서의 보기를 제공하며, 이를 통해 세분화된 수준에서 높은 CPU 로드의 원인을 식별할 수 있습니다. 예를 들어, 로드 평균, CPU 분산(system% 또는 nice%) 및 OS 프로세스 목록을 검토할 수 있습니다.

Enhanced Monitoring을 사용하여 1분, 5분, 15분 간격으로 loadAverageMinute 데이터를 확인할 수 있습니다. 로드 평균이 vCPU 수보다 크면 인스턴스에 로드가 많음을 나타냅니다. 또한 로드 평균이 DB 인스턴스 클래스의 vCPU 개수보다 적다면 CPU 조절이 애플리케이션에 지연 시간이 발생하는 원인이 아닐 수 있습니다. 로드 평균을 확인하여 CPU 사용량 원인을 진단할 때 거짓 긍정을 방지합니다.

예를 들어, 프로비저닝된 IOPS가 3,000개인 db.m4.2xlarge 인스턴스 클래스를 사용하는 DB 인스턴스에서 CPU 제한에 도달한 경우 다음 예제 지표를 검토하여 높은 CPU 사용량의 근본 원인을 식별할 수 있습니다. 다음 예제에서 인스턴스 클래스에 8개 vCPU가 연결되어 있습니다. 동일한 로드 평균에서, 170을 초과하는 경우 측정된 시간대에 컴퓨터에 로드가 많음을 나타냅니다.

로드 평균 시간(분)
 
15 170.25
5 391.31
1 596.74
CPU 사용률  
User(%) 0.71
System(%) 4.9
Nice(%) 93.92
Total(%) 99.97

참고: Amazon RDS에서는 DB 인스턴스에서 실행되는 다른 작업보다 워크로드에 더 높은 우선순위가 지정됩니다. 이렇게 작업의 우선순위를 지정하기 위해 워크로드 작업에 더 높은 Nice 값을 지정합니다. 따라서 Enhanced Monitoring에서 Nice%는 데이터베이스에서 워크로드가 사용하고 있는 CPU 용량을 나타냅니다.

Enhanced Monitoring을 활성화한 후에 DB 인스턴스에 연결된 OS 프로세스 목록을 확인할 수도 있습니다. Enhanced Monitoring은 CPU와 메모리 각각에 대해 상위 50개 프로세스만 표시합니다. CPU와 메모리 사용량에 따라 어느 프로세스가 성능에 가장 큰 영향을 미치는지 파악하는 데 도움이 됩니다.

Enhanced Monitoring 결과와 pg_stat_activity 결과를 결합하면 쿼리의 리소스 사용량을 확인하는 데 도움이 됩니다.

성능 개선 도우미

특정 시간대에 해당하는 SQL 탭을 확인한 후 Amazon RDS 성능 개선 도우미를 사용하여 데이터베이스에 로드를 일으키는 쿼리를 찾을 수 있습니다.

네이티브 PostgreSQL 보기 및 카탈로그

데이터베이스 엔진 수준에서, 실시간으로 문제가 발생하면 pg_stat_activity 또는 pg_stat_statements를 사용할 수 있습니다. 이를 통해 컴퓨터, 클라이언트 및 대부분의 트래픽을 전송하는 IP 주소를 그룹화할 수 있습니다. 또한 이러한 데이터를 사용하여 시간에 따른 증가, 애플리케이션 서버에서 증가가 나타나는지 또는 애플리케이션 서버에서 상태가 멈춘 세션이나 잠금 문제가 발생하는지 확인할 수 있습니다. 자세한 내용은 pg_stat_activitypg_stat_statements에 대한 PostgreSQL 설명서를 참조하세요. pg_stat_statements를 활성화하려면 기존 사용자 지정 파라미터 그룹을 수정하고 다음과 같이 값을 설정합니다.

  • shared_preload_libraries = pg_stat_statements
  • track_activity_query_size = 2048
  • pg_stat_statements.track = ALL
  • pg_stat_statements.max = 10000

[즉시 적용]을 선택하고 DB 인스턴스를 재부팅합니다. 그런 다음 모니터링하려는 데이터베이스에서 다음과 비슷한 명령을 실행합니다.

참고: 다음 예제에서는 "demo" 데이터베이스에서 확장 기능을 설치합니다.

demo=> select current_database();
current_database
------------------
demo
(1 row)
     
demo=> CREATE EXTENSION pg_stat_statements;

pg_stat_statements를 설정한 후에 다음 방법 중 하나를 사용하여 출력을 모니터링할 수 있습니다.

  • total_time을 기준으로 쿼리를 나열하고 데이터베이스에서 가장 많은 시간을 소비하는 쿼리를 확인합니다.
SELECT round(total_time*1000)/1000 AS total_time,query
FROM pg_stat_statements
ORDER BY total_time DESC limit 2;
  • 총 호출 수, 총 행 수, 반환된 행 수를 포함하는 쿼리를 나열합니다.
SELECT query, calls, total_time, rows, 100.0 * shared_blks_hit /
nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
FROM pg_stat_statements ORDER BY total_time DESC LIMIT 5;
  • 시간 경과에 따른 샘플 쿼리에 대한 각 실행을 기반으로 쿼리를 나열합니다.
SELECT query, calls, total_time/calls as avg_time_ms, rows/calls as avg_rows,
temp_blks_read/calls as avg_tmp_read, temp_blks_written/calls as avg_temp_written
FROM pg_stat_statements
WHERE calls != 0
ORDER BY total_time DESC LIMIT 5;

PostgreSQL 로깅 파라미터

Amazon RDS for PostgreSQL을 사용하여 쿼리 로깅을 활성화합니다. 그런 다음, PostgreSQL 오류 로그에서 log_min_duration_statementlog_statement 파라미터가 적절한 값으로 설정되었는지 확인합니다. 자세한 내용은 오류 보고 및 로깅에 대한 PostgreSQL 설명서를 참조하세요.

CPU 사용량 감소

CPU를 많이 사용하는 쿼리를 찾아낸 후, 다음의 방법을 사용하여 CPU 사용량을 더욱 낮출 수 있습니다.

  1. 조정 가능성이 있으면 EXPLAINEXPLAIN ANALYZE를 사용하여 주의 사항을 알아냅니다. 자세한 내용은 EXPLAIN에 대한 PostgreSQL 설명서를 참조하세요.
  2. 반복해서 실행하는 쿼리가 있는 경우 prepared 명령문을 사용하여 CPU의 부담을 줄입니다.

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

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


도움이 필요하십니까?