Amazon RDS for MySQL 또는 Amazon Aurora MySQL 인스턴스의 높은 CPU 사용률 문제를 파악하고 해결하려면 어떻게 해야 하나요?

7분 분량
0

MySQL DB 인스턴스 또는 Amazon Aurora MySQL 호환 에디션 인스턴스의 Amazon Relational Database Service(RDS)에서 CPU 사용률이 높습니다. CPU 사용률이 높은 문제를 파악하고 해결하려면 어떻게 해야 하나요?

간략한 설명

CPU 사용률 증가는 사용자가 시작한 과중한 워크로드, 여러 개의 동시 쿼리 또는 장기 실행 트랜잭션과 같은 여러 요인으로 인해 발생할 수 있습니다.

Amazon RDS for MySQL 인스턴스의 CPU 사용량 소스를 식별하려면 다음 접근 방식을 검토하세요.

  • 향상된 모니터링
  • 성능 개선 도우미
  • 워크로드의 CPU 사용률 원인을 탐지하는 쿼리
  • 모니터링이 활성화된 로그

소스를 파악한 후에는 워크로드를 분석하고 최적화하여 CPU 사용량을 줄일 수 있습니다.

해결 방법

향상된 모니터링 사용

향상된 모니터링은 운영 체제(OS) 수준의 뷰를 제공합니다. 이 뷰는 높은 CPU 부하의 원인을 세부적인 수준에서 식별하는 데 도움이 될 수 있습니다. 예를 들어, 평균 로드, CPU 분포(system% 또는 nice%) 및 OS 프로세스 목록을 검토할 수 있습니다.

향상된 모니터링을 통해 1, 5, 15분 간격으로 loadAverageMinute 데이터를 확인할 수 있습니다. 평균 로드가 vCPU 수보다 크면 인스턴스에 과부하가 걸리고 있음을 나타냅니다. 또한 평균 로드가 DB 인스턴스 클래스의 vCPU 수보다 적은 경우, CPU 제한이 애플리케이션 지연의 원인이 아닐 수도 있습니다. CPU 사용의 원인을 진단할 경우, 평균 로드를 확인하여 오탐이 발생하지 않도록 하세요.

예를 들어, 프로비저닝된 IOPS가 3000인 db.m5.2xlarge 인스턴스 클래스를 사용하는 DB 인스턴스가 CPU 제한에 도달하는 경우, 다음 예제 지표를 검토하여 높은 CPU 사용량의 근본 원인을 파악할 수 있습니다. 다음 예제에서 인스턴스 클래스에는 8개의 vCPU가 연결되어 있습니다. 동일한 평균 로드에서 170을 초과하면 측정된 기간 동안 기계에 과부하가 걸린다는 의미입니다.

평균 로드 시간(분)

15170.25
5391.31
1596.74

CPU 사용률

사용자(%)0.71
시스템(%)4.9
양호함(%)93.92
합계(%)99.97

참고: Amazon RDS는 DB 인스턴스에서 실행되는 다른 작업보다 워크로드에 더 높은 우선 순위를 부여합니다. 이러한 작업의 우선순위를 정하기 위해, 워크로드 작업은 Nice 값이 더 높습니다. 따라서 고급 모니터링에서 **Nice%**는 데이터베이스에 대해 워크로드가 사용하는 CPU의 양을 나타냅니다.

향상된 모니터링을 활성화한 후, DB 인스턴스와 연결된 OS 프로세스 목록도 확인할 수 있습니다. 향상된 모니터링은 최대 100개의 프로세스를 보여줍니다. 이를 통해 CPU 및 메모리 사용량을 기준으로 성능에 가장 큰 영향을 미치는 프로세스를 식별할 수 있습니다.

향상된 모니터링의 운영 체제(OS) 프로세스 목록 섹션에서 OS 프로세스RDS 프로세스를 검토합니다. mysqld 또는 Aurora 프로세스의 CPU 사용률을 확인합니다. 이러한 지표을 통해 CPU 사용률 증가가 OS 때문인지 RDS 프로세스 때문인지 확인할 수 있습니다. 또는 이러한 지표을 사용하여 mysqld 또는 Aurora로 인한 CPU 사용량 증가를 모니터링할 수 있습니다. cpuUtilization에 대한 지표를 검토하여 CPU 사용률의 구분을 확인할 수도 있습니다. 자세한 내용을 보려면, 향상된 모니터링을 통한 OS 지표 모니터링을 참조하세요.

참고: 성능 스키마를 활성화하면, OS 스레드 ID를 데이터베이스의 프로세스 ID에 매핑할 수 있습니다. 자세한 내용을 보려면, 메모리가 충분한데 Amazon RDS DB 인스턴스가 스왑 메모리를 사용하는 이유는 무엇인가요?를 참조하세요.

성능 개선 도우미 사용

성능 개선 도우미를 사용하여 인스턴스에서 실행 중이며 높은 CPU 사용량을 유발하는 정확한 쿼리를 식별할 수 있습니다. 먼저, ](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PerfInsights.Enabling.html)MySQL용 성능 개선 도우미[를 활성화합니다. 그런 다음, 성능 개선 도우미를 사용하여 워크로드를 최적화할 수 있습니다. 반드시 DBA에 문의하세요.

성개선 도우미와 함께 사용할 수 있는 데이터베이스 엔진을 보려면, Amazon RDS의 성능 개선 도우미를 사용한 DB 부하 모니터링을 참조하세요.

워크로드의 CPU 사용률 원인을 탐지하는 쿼리 사용

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

SHOW PROCESSLIST 명령은 현재 MySQL 인스턴스에서 실행 중인 스레드를 보여줍니다. 경우에 따라, 동일한 문 집합이 완료되지 않고 계속 실행될 수 있습니다. 이 경우, 후속 문은 첫 번째 문 집합이 완료될 때까지 기다려야 합니다. 이는 InnoDB 행 수준 잠금이 동일한 행을 업데이트할 수 있기 때문입니다. 자세한 내용을 보려면, MySQL 웹사이트의 SHOW PROCESSLIST 문을 참조하세요.

SHOW FULL PROCESSLIST;

참고: 기본 시스템 사용자로 SHOW PROCESSLIST 쿼리를 실행합니다. 기본 시스템 사용자가 아닌 경우, MySQL 인스턴스에서 실행 중인 모든 스레드를 보려면 MySQL PROCESS 서버 관리 권한이 있어야 합니다. 관리자 권한이 없는 경우, SHOW PROCESSLIST는 사용 중인 MySQL 계정과 관련된 스레드만 표시합니다.

INNODB_TRX 테이블은 읽기 전용 트랜잭션이 아닌 현재 실행 중인 모든 InnoDB 트랜잭션에 대한 정보를 제공합니다.

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

INNODB_LOCKS 테이블은 InnoDB 트랜잭션이 요청했지만 받지 못한 잠금에 대한 정보를 제공합니다.

MySQL 5.7 또는 이전 버전의 경우:

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

MySQL 8.0의 경우:

SELECT * FROM performance_schema.data_locks;

INNODB_LOCK_WAITS 테이블은 차단된 각 InnoDB 트랜잭션에 대해 하나 이상의 행을 제공합니다.

MySQL 5.7 또는 이전 버전의 경우:

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

MySQL 8.0의 경우:

SELECT * FROM performance_schema.data_lock_waits;

다음과 비슷한 쿼리를 실행하여 대기 중인 트랜잭션과 대기 트랜잭션을 차단하고 있는 트랜잭션을 확인할 수 있습니다. 자세한 내용을 보려면, MySQL 웹사이트의 InnoDB transaction 사용 및 잠금 정보를 참조하세요.

MySQL 5.7 또는 이전 버전의 경우:

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;

MySQL 8.0의 경우:

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       performance_schema.data_lock_waits w
INNER JOIN information_schema.innodb_trx b
  ON b.trx_id = w.blocking_engine_transaction_id
INNER JOIN information_schema.innodb_trx r
  ON r.trx_id = w.requesting_engine_transaction_id;

SHOW ENGINE INNODB STATUS 쿼리는 표준 InnoDB 모니터에서 InnoDB 스토리지 엔진의 상태에 대한 정보를 제공합니다. 자세한 내용을 보려면, MySQL 웹사이트의 SHOW ENGINE 문을 참조하세요.

SHOW ENGINE INNODB STATUS;

SHOW [GLOBAL | SESSION] STATUS에서 서버 상태에 대한 정보를 확인할 수 있습니다. 자세한 내용을 보려면, MySQL 웹사이트의 SHOW STATUS 문을 참조하세요.

SHOW GLOBAL STATUS;

참고: 이 쿼리는 Aurora 2.x(MySQL 5.7), Aurora 1. x(MySQL 5.6), MariaDB 10.x에서 테스트되었습니다. 또한 INFORMATION_SCHEMA.INNODB_LOCKS 테이블은 MySQL 5.7.14부터 더 이상 지원되지 않으며 MySQL 8.0에서 제거되었습니다. performance_schema.data_locks 테이블은 INFORMATION_SCHEMA.INNODB_LOCKS 테이블을 대체합니다. 자세한 내용을 보려면, MySQL 웹사이트의 data_locks 테이블을 참조하세요.

로그 분석 및 모니터링 켜기

로그를 분석하거나 Amazon RDS for MySQL에서 모니터링을 활성화하려는 경우, 다음 접근 방식을 고려하세요.

  • MySQL 일반 쿼리 로그를 분석하여 특정 시간에 mysqld가 수행하는 작업을 확인합니다. 클라이언트의 연결 또는 연결 해제 시점에 대한 정보를 포함하여 특정 시간에 인스턴스에서 실행 중인 쿼리를 볼 수도 있습니다. 자세한 내용을 보려면 MySQL 웹사이트의 일반 쿼리 로그를 참조하세요.
    참고: 일반 쿼리 로그를 장기간 활성화하면 로그가 스토리지를 소모하고 성능 오버헤드를 가중시킬 수 있습니다.
  • MySQL 느린 쿼리 로그를 분석하여 long_query_time에 설정한 초보다 실행하는 데 시간이 오래 걸리는 쿼리를 찾습니다. 또한 워크로드를 검토하고 쿼리를 분석하여 성능과 메모리 소비를 개선할 수 있습니다. 자세한 내용을 보려면, MySQL 웹사이트의 느린 쿼리 로그를 참조하세요. 팁: 느린 쿼리 로그 또는 일반 쿼리 로그를 사용하는 경우, 파라미터 log_outputFILE로 설정합니다.
  • MariaDB 감사 플러그인을 사용하여 데이터베이스 활동을 감사합니다. 예를 들어, 데이터베이스에 로그온하는 사용자나 데이터베이스에 대해 실행되는 쿼리를 추적할 수 있습니다. 자세한 내용을 보려면, MariaDB 감사 플러그인 지원을 참조하세요.
  • MySQL용 Aurora를 사용하는 경우, 고급 감사를 사용할 수도 있습니다. 감사를 통해 기록하려는 쿼리 유형을 더 잘 제어할 수 있습니다. 이렇게 하면 로깅에 드는 오버헤드가 줄어듭니다.
  • 교착 상태 및 리소스 잠금을 확인하려면, innodb_print_all_deadlocks 파라미터를 사용합니다. 이 파라미터를 사용하여 MySQL 오류 로그에 InnoDB 사용자 트랜잭션의 교착 상태에 대한 정보를 기록할 수 있습니다. 자세한 내용을 보려면, MySQL 웹사이트에서 innodb_print_all_deadlocks를 참조하세요.

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

CPU 사용량을 증가시키는 쿼리를 파악한 후에는 작업 부하를 최적화하여 CPU 사용량을 줄이세요.

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

CALL mysql.rds_kill(processID);

쿼리의 processID를 찾으려면, SHOW FULL PROCESSLIST 명령을 실행합니다.

쿼리를 종료하지 않으려면, EXPLAIN을 사용하여 쿼리를 최적화하세요. EXPLAIN 명령은 쿼리 실행과 관련된 개별 단계를 보여줍니다. 자세한 내용을 보려면, MySQL 웹사이트에서 EXPLAIN을 사용하여 쿼리 최적화를 참조하세요.

프로필 세부 정보를 검토하려면, 프로파일링을 활성화하세요. PROFILING 명령은 현재 세션 중에 실행 중인 명령문의 리소스 사용량을 나타낼 수 있습니다. 자세한 내용을 보려면, MySQL 웹사이트의 SHOW PROFILE 문을 참조하세요.

테이블 통계를 업데이트하려면, ANALYZE TABLE을 사용하세요. ANALYZE TABLE 명령은 최적화 프로그램이 쿼리를 실행할 적절한 계획을 선택하는 데 도움이 될 수 있습니다. 자세한 내용을 보려면, MySQL 웹사이트의 ANALYZE TABLE 문을 참조하세요.


관련 정보

Amazon RDS for MySQL

Amazon RDS for MariaDB

Amazon RDS MySQL DB 인스턴스의 로그를 활성화하고 모니터링하려면 어떻게 해야 하나요?

성능 개선 도우미를 통한 Amazon RDS for MySQL 조정