Amazon Relational Database Service(Amazon RDS) for MySQL, MariaDB 또는 Amazon Aurora for MySQL 인스턴스의 CPU 사용률이 높습니다. 높은 CPU 사용률 문제를 해결하려면 어떻게 해야 합니까?

몇 가지 요인으로 인해 CPU 사용률이 증가할 수 있습니다. 예를 들어, 사용자가 시작한 많은 워크로드, 분석 쿼리, 장기간 교착 상태 및 잠금 대기, 여러 동시 트랜잭션, 장기 실행 트랜잭션 또는 CPU 리소스를 사용하는 기타 프로세스 등이 있습니다.

먼저 다음과 같은 방법으로 CPU 사용 출처를 확인할 수 있습니다.

  • Enhanced Monitoring 사용
  • 성능 개선 도우미 사용
  • 쿼리를 사용하여 워크로드에서 CPU 사용률 원인 탐지
  • 로그 분석 및 모니터링 실행

출처를 식별한 후 워크로드를 분석하고 최적화하여 CPU 사용을 줄일 수 있습니다.

Enhanced Monitoring 사용

Enhanced Monitoring은 매 분마다 통계를 제공하는 Amazon CloudWatch 지표와 세분화된 실시간 지표를 제공합니다. 자세한 내용은 CloudWatch 측정치와 Enhanced Monitoring 측정치의 차이점을 참조하십시오.

Enhanced Monitoring의 운영 체제(OS) 프로세스 목록 섹션에서 OS 프로세스RDS 프로세스를 검토하여 mysqld 또는 Aurora 프로세스의 CPU 사용률을 확인하십시오. 이러한 지표를 사용하면 CPU 사용률 증가가 OS 또는 RDS 프로세스로 인해 발생했는지 확인할 수 있습니다. 또한 이러한 지표를 사용하여 증가가 mysqld 또는 Aurora에 의해 발생했는지 여부를 확인할 수 있습니다. 이는 사용자가 시작한 워크로드가 CPU 사용 출처임을 나타낼 수 있습니다. 자세한 내용은 Enhanced Monitoring 보기를 참조하십시오. cpuUtilization에 대한 지표를 검토하여 CPU 사용률 분기점을 확인할 수도 있습니다. 자세한 내용은 사용 가능한 OS 측정치를 참조하십시오.

또한 사용 중이지 않은 작업 수(sleeping task)도 확인할 수 있습니다. 이러한 작업 때문에 메모리 리소스(RAM, 캐시 및 프로세서) 소비가 증가할 수 있으며 이로 인해 서버 속도가 느려질 수 있습니다. 사용하지 않는 연결을 정상적으로 닫도록 애플리케이션을 조정하는 것이 바람직합니다. wait_timeoutinteractive_timeout 파라미터의 값을 수정하여 설정한 값을 기반으로 한 연결을 닫을 수도 있습니다. 자세한 내용은 wait_timeoutinteractive_timeout에 대한 MySQL 설명서를 참조하십시오.

성능 개선 도우미 사용

성능 개선 도우미를 사용하여 인스턴스에서 실행 중이며 CPU 사용량을 높이는 쿼리를 정확히 식별할 수 있습니다. 먼저 MySQL에 대한 성능 개선 도우미를 활성화하십시오. 그런 다음, DBA와 상의 후 성능 개선 도우미를 사용하여 워크로드를 최적화할 수 있습니다.

성능 개선 도우미와 함께 사용할 수 있는 데이터베이스 엔진을 확인하려면 Amazon RDS 성능 개선 도우미 사용을 참조하십시오..

쿼리를 사용하여 워크로드에서 CPU 사용률 원인 탐지

워크로드를 최적화하기 전에 문제가 있는 쿼리를 식별해야 합니다. 높은 CPU 문제가 발생하는 동안 다음 쿼리를 실행하여 CPU 사용률의 근본 원인을 파악할 수 있습니다. 그런 다음, 워크로드를 최적화하여 CPU 사용량을 줄일 수 있습니다.

SHOW PROCESSLIST 명령은 현재 MySQL 인스턴스에서 실행 중인 스레드를 보여줍니다. 경우에 따라 동일한 명령문 집합이 실행 중이지만 완료되지 않은 경우도 있습니다. 이 경우, InnoDB 행 레벨 잠금이 동일한 행을 업데이트 중일 수 있기 때문에 후속 명령문은 첫 번째 명령문 세트가 완료될 때까지 기다려야 합니다. 자세한 내용은 SHOW PROCESSLIST Syntax에 대한 MySQL 설명서를 참조하십시오.

SHOW FULL PROCESSLIST;

참고: SHOW PROCESSLIST 쿼리를 마스터 사용자로 실행하십시오. 마스터 사용자가 아닌 경우 명령을 실행하는 MySQL 사용자는 MySQL 인스턴스에서 실행 중인 모든 스레드를 보려면 MySQL PROCESS 서버 관리 권한이 있어야 합니다. 관리자 권한이 없으면 사용 중인 SHOW PROCESSLIST는 MySQL 계정에 연결된 스레드만 표시합니다.

INNODB_TRX 테이블은 읽기 전용 트랜잭션이 아닌 현재 실행 중인 모든 InnoDB 트랜잭션에 대한 정보를 제공합니다. 자세한 내용은 The INFORMATION_SCHEMA INNODB_TRX Table에 대한 MySQL 설명서를 참조하십시오.

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

INNODB_LOCKS 테이블은 InnoDB 트랜잭션이 요청했지만 아직 받지 못한 잠금에 대한 정보를 제공합니다. 자세한 내용은 The INFORMATION_SCHEMA INNODB_LOCKS Table에 대한 MySQL 설명서를 참조하십시오.

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

INNODB_LOCK_WAITS 테이블은 차단된 각 InnoDB 트랜잭션에 대해 하나 이상의 행을 제공합니다. 자세한 내용은 The INFORMATION_SCHEMA INNODB_LOCK_WAITS Table에 대한 MySQL 설명서를 참조하십시오.

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

다음과 유사한 쿼리를 실행해 대기 중인 트랜잭션과 대기 중인 트랜잭션을 차단하는 트랜잭션을 확인할 수 있습니다. 자세한 내용은 Using InnoDB Transaction and Locking Information에 대한 MySQL 설명서를 참조하십시오.

SELECT
  r.trx_id waiting_trx_id,
  r.trx_mysql_thread_id waiting_thread,
  r.trx_query waiting_query,
  b.trx_id blocking_trx_id,
  b.trx_mysql_thread_id blocking_thread,
  b.trx_query blocking_query
FROM       information_schema.innodb_lock_waits w
INNER JOIN information_schema.innodb_trx b
  ON b.trx_id = w.blocking_trx_id
INNER JOIN information_schema.innodb_trx r
  ON r.trx_id = w.requesting_trx_id;

SHOW ENGINE INNODB STATUS 쿼리는 표준 InnoDB 모니터로부터 InnoDB 스토리지 엔진의 상태에 관한 정보를 제공합니다. 자세한 내용은 SHOW ENGINE Syntax에 대한 MySQL 설명서를 참조하십시오.

SHOW ENGINE INNODB STATUS;

SHOW GLOBAL SESSION STATUS는 서버 상태에 대한 정보를 제공합니다. 자세한 내용은 SHOW STATUS Syntax에 대한 MySQL 설명서를 참조하십시오.

SHOW GLOBAL STATUS;

참조: 이 쿼리는 Aurora 2.02.5(MySQL 5.7); Aurora 1.17.8(MySQL 5.6); MySQL 5.6.x 및 5.7.x 그리고 MariaDB 10.0.x, 10.1.x, 10.2.x에서 테스트되었습니다.

로그 분석 및 모니터링 실행

MySQL General Query Log를 분석하여 특정 시간에 mysqld이 무엇을 하는지 볼 수 있습니다. 클라이언트가 연결 또는 연결 해제되는 시점에 대한 정보를 포함하여 특정 시간에 인스턴스에서 실행 중인 쿼리를 볼 수도 있습니다. 자세한 내용은 General Query Log에 대한 MySQL 설명서를 참조하십시오.

참조: General Query Log를 장시간 사용하면 로그가 스토리지를 소비하고 성능 오버헤드를 추가할 수 있습니다.

MySQL Slow Query Log를 분석하여 long_query_time에 설정된 초보다 실행 시간이 오래 걸리는 쿼리를 찾습니다. 또한 워크로드를 검토하고 쿼리를 분석하여 성능과 메모리 소비를 향상시킬 수 있습니다. 자세한 내용은 Slow Query Log에 대한 MySQL 설명서를 참조하십시오.

팁: Slow Query Log 또는 General Query Log를 사용할 때 log_output 파라미터를 FILE로 설정하십시오.

또한 MariaDB Audit Plugin을 사용하여 데이터베이스에 로그인하는 사용자 또는 데이터베이스에 대해 실행되는 쿼리와 같은 데이터베이스 작업을 감사할 수 있습니다. 자세한 내용은 MariaDB Audit Plugin Support를 참조하십시오.

Aurora for MySQL을 사용하는 경우 Advanced Auditing을 사용할 수도 있습니다. 감사를 통해 로깅하려는 쿼리 유형을 보다 효과적으로 제어할 수 있으며 로깅을 위한 오버헤드를 줄일 수 있습니다.

innodb_print_all_deadlocks 파라미터를 사용하여 교착 상태 및 리소스 잠금을 확인할 수 있습니다. 이 파라미터를 사용하여 InnoDB 사용자 트랜잭션의 교착 상태에 대한 정보를 MySQL 오류 로그에 기록할 수 있습니다. 자세한 정보는 innodb_print_all_deadlocks에 대한 MySQL 설명서를 참조하십시오.

높은 CPU 워크로드 분석 및 최적화

CPU 사용량을 증가시키는 쿼리를 확인한 후에는 CPU 소비를 줄이기 위해 워크로드를 최적화할 수 있습니다.

워크로드에 필요하지 않은 쿼리가 표시되면 다음 명령을 사용하여 연결을 종료(쿼리 종료) 할 수 있습니다.

CALL mysql.rds_kill(processID);

SHOW FULL PROCESSLIST 명령을 실행하여 쿼리 processID 찾을 수 있습니다.

쿼리를 종료하지 않으려면 EXPLAIN을 사용하여 쿼리를 최적화할 수 있습니다. 이는 쿼리 실행과 관련된 개별 단계를 보여줍니다. 자세한 정보는 Optimizing Queries with EXPLAIN에 대한 MySQL 설명서를 참조하십시오.

PROFILING을 사용하여 현재 세션 동안 실행되는 명령문에 대한 리소스 사용을 나타낼 수 있는 프로필 세부 사항을 검토하십시오. 자세한 내용은 PROFILING Syntax에 대한 MySQL 설명서를 참조하십시오.

ANALYZE TABLE을 사용하여 테이블에 대한 인덱스 통계를 새로 고칩니다. 이를 통해 최적기는 적절한 실행 계획을 선택합니다. 자세한 내용은 ANALYZE TABLE Syntax에 대한 MySQL 설명서를 참조하십시오.


페이지 내용이 도움이 되었습니까? | 아니요

AWS 지원 지식 센터로 돌아가기

도움이 필요하십니까? AWS 지원 센터를 방문하십시오.

게시 날짜: 2019년 2월 26일