Share Your AWS re:Post Experience - Quick 3 Question Survey
Help us improve AWS re:Post! We're interested in understanding how you use re:Post and its impact on your AWS journey. Please take a moment to complete our brief 3-question survey.
Amazon RDS for MySQL 또는 Aurora MySQL 호환 DB 인스턴스의 높은 CPU 사용률 문제를 파악하고 해결하려면 어떻게 해야 하나요?
MySQL DB 인스턴스 또는 Amazon Aurora MySQL 호환 에디션 인스턴스의 Amazon Relational Database Service(RDS)에서 CPU 사용량이 높습니다.
간략한 설명
CPU 사용 증가는 사용자가 시작한 과중한 워크로드, 여러 개의 동시 쿼리 또는 장기 실행 트랜잭션과 같은 여러 요인으로 인해 발생할 수 있습니다.
DB 인스턴스의 CPU 사용률 소스를 확인하려면 다음 리소스를 확인하십시오.
- 향상된 모니터링
- Performance Insights
- 워크로드의 CPU 사용 원인을 탐지하는 쿼리
- 모니터링이 활성화된 로그
소스를 식별한 후에는 워크로드를 분석하고 최적화하여 CPU 사용을 줄입니다.
해결 방법
향상된 모니터링 사용
향상된 모니터링은 운영 체제(OS) 수준 보기를 제공하여 높은 CPU 로드의 원인을 식별합니다. 예를 들어, 평균 로드, OS 프로세스 목록, System(%) 또는 Nice(%) CPU 분포를 검토할 수 있습니다.
향상된 모니터링을 사용하여 1, 5, 15분 간격으로 loadAverageMinute 데이터를 확인합니다. 평균 로드가 vCPU 수보다 크면 인스턴스에 과부하가 걸리고 있음을 나타냅니다. 평균 로드가 DB 인스턴스 클래스의 vCPU 수보다 적을 경우 CPU 제한으로 인해 애플리케이션 지연 시간이 발생하지 않을 수 있습니다. CPU 사용의 원인을 진단할 경우, 평균 로드를 확인하여 오탐이 발생하지 않도록 하십시오.
예를 들어, 프로비저닝된 IOPS가 3000인 db.m5.2xlarge 인스턴스 클래스를 사용하는 DB 인스턴스가 CPU 제한에 도달했습니다. 인스턴스 클래스에는 8개의 vCPU가 연결되어 있습니다. 평균 로드가 170을 초과하면 측정된 기간 동안 기계에 과부하가 걸린다는 의미입니다.
평균 로드 시간(분)
15 | 170.25 |
5 | 391.31 |
1 | 596.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 사용량 증가를 모니터링합니다. CPU 사용량을 구분하려면 cpuUtilization 지표를 검토하십시오. 자세한 내용은 향상된 모니터링을 통한 OS 지표 모니터링을 참조하십시오.
참고: 성능 스키마를 활성화하면, OS 스레드 ID를 데이터베이스의 프로세스 ID에 매핑할 수 있습니다. 자세한 내용을 보려면, 메모리가 충분한데 Amazon RDS DB 인스턴스가 스왑 메모리를 사용하는 이유는 무엇인가요?를 참조하십시오.
Performance Insights 사용
Performance Insights를 사용하여 DB 인스턴스에서 실행 중이며 높은 CPU 사용량을 유발하는 쿼리를 식별할 수 있습니다. 먼저, ](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PerfInsights.Enabling.html)Performance Insights for MySQL을 활성화[합니다. 이후 Performance Insights를 사용하여 워크로드를 최적화합니다. 필요한 경우 데이터베이스 관리자와 협력하여 문제의 근본 원인을 파악하십시오.
Performance Insights에서 사용할 수 있는 데이터베이스 엔진을 알아보려면 Amazon RDS DB 엔진, AWS 리전 및 Performance Insights의 인스턴스 클래스 지원을 참조하십시오.
워크로드의 CPU 사용률 원인을 탐지하는 쿼리 사용
워크로드를 최적화하려면, 먼저 문제가 있는 쿼리를 식별해야 합니다. CPU 사용률이 높은 원인을 식별하기 위해 CPU 사용률이 높을 때 다음 쿼리를 실행합니다.
MySQL 인스턴스에서 실행 중인 스레드를 보려면 SHOW FULL PROCESSLIST 명령을 실행합니다.
SHOW FULL PROCESSLIST;
참고: 기본 시스템 사용자로 SHOW PROCESSLIST 쿼리를 실행합니다. 기본 시스템 사용자가 아닌 경우, MySQL 인스턴스에서 실행 중인 모든 스레드를 보려면 MySQL PROCESS 서버 관리 권한이 있어야 합니다. 관리 권한이 없는 경우, SHOW PROCESSLIST에서는 사용 중인 MySQL 계정과 관련된 스레드만 표시됩니다.
경우에 따라 동일한 문 집합이 완료되지 않고 계속 실행될 수 있습니다. 이 경우 후속 문은 첫 번째 문 집합이 완료될 때까지 기다려야 합니다. 이는 InnoDB 행 수준 잠금이 동일한 행을 업데이트할 수 있기 때문입니다. 자세한 내용을 보려면, MySQL 웹사이트의 13.7.5.29 SHOW PROCESSLIST 문을 참조하십시오.
INNODB_TRX 테이블은 읽기 전용 트랜잭션이 아닌 실행 중인 모든 InnoDB 트랜잭션에 대한 정보를 제공합니다. INNODB_TRX 테이블을 보려면 다음 쿼리를 실행합니다.
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
INNODB_LOCKS 테이블은 InnoDB 트랜잭션이 요청했지만 받지 못한 잠금에 대한 정보를 제공합니다. INNODB_LOCKS 테이블을 보려면 다음 쿼리를 실행합니다.
-
MySQL 5.7 이하:
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
-
MySQL 8.0:
SELECT * FROM performance_schema.data_locks;
자세한 내용은 MySQL 웹사이트의 24.4.14 INFORMATION_SCHEMA.INNODB_LOCKS 테이블 및 10.13.1 data_locks 테이블을 참조하십시오.
INNODB_LOCK_WAITS 테이블은 차단된 각 InnoDB 트랜잭션에 대해 하나 이상의 행을 제공합니다. INNODB_LOCKS_WAITS 테이블을 보려면 다음 쿼리를 실행합니다.
-
MySQL 5.7 이하:
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
-
MySQL 8.0:
SELECT * FROM performance_schema.data_lock_waits;
다음 예제와 비슷한 쿼리를 실행하여 대기 중인 트랜잭션과 대기 트랜잭션을 차단하고 있는 트랜잭션을 확인할 수 있습니다.
-
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;
이 쿼리의 출력을 해석하는 방법에 대한 자세한 내용은 MySQL 웹사이트의 17.15.2.1 InnoDB 트랜잭션 사용 및 잠금 정보를 참조하십시오.
표준 InnoDB 모니터에서 InnoDB 스토리지 엔진의 상태에 대한 정보를 가져오려면 다음 쿼리를 실행합니다.
SHOW ENGINE INNODB STATUS;
자세한 내용은 MySQL 웹사이트의 13.7.5.15 SHOW ENGINE 문을 참조하십시오.
서버 상태를 보려면 다음 명령을 실행합니다.
SHOW GLOBAL STATUS;
자세한 내용은 MySQL 웹사이트의 15.7.7.37 SHOW STATUS 문을 참조하십시오.
로그 분석 및 모니터링 켜기
MySQL 일반 쿼리 로그를 분석하여 특정 시간에 mysqld가 수행하는 작업을 확인합니다. 클라이언트의 연결 또는 연결 해제 시점에 대한 정보 등 특정 시간에 인스턴스에서 실행 중인 쿼리를 볼 수도 있습니다. 자세한 내용은 MySQL 웹사이트의 7.4.3 일반 쿼리 로그를 참조하십시오.
중요: 일반 쿼리 로그를 장기간 활성화하면 로그가 스토리지를 소모하고 성능 오버헤드를 가중시킬 수 있습니다.
MySQL 느린 쿼리 로그를 분석하여 long_query_time에 설정한 초보다 실행하는 데 시간이 오래 걸리는 쿼리를 찾습니다. 또한 워크로드를 검토하고 쿼리를 분석하여 성능과 메모리 소비를 개선할 수 있습니다. 자세한 내용은 MySQL 웹사이트의 7.4.5 느린 쿼리 로그를 참조하십시오.
참고: 느린 쿼리 로그 또는 일반 쿼리 로그를 사용하는 경우, 파라미터 log_output을 FILE로 설정하는 것이 좋습니다.
MariaDB 감사 플러그인을 사용하여 데이터베이스 활동을 감사합니다. 예를 들어, 데이터베이스에 로그인하는 사용자나 데이터베이스에 대해 실행되는 쿼리를 추적합니다.
Aurora MySQL을 사용하는 경우 고급 감사를 사용할 수도 있습니다. 고급 감사를 사용하면 기록하려는 쿼리 유형을 더 세밀하게 제어하고 로깅에 대한 오버헤드를 줄일 수 있습니다.
교착 상태 및 리소스 잠금을 확인하려면 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 웹사이트의 10.8.1 EXPLAIN을 사용하여 쿼리 최적화를 참조하십시오.
프로필 세부 정보를 검토하려면 프로파일링을 활성화합니다. SHOW PROFILE 명령은 현재 세션 중에 실행 중인 명령문의 리소스 사용량을 보여줍니다. 자세한 내용은 MySQL 웹사이트의 15.7.7.30 SHOW PROFILE 문을 참조하십시오.
테이블 통계를 보고 최적화하려면 ANALYZE TABLE 쿼리를 사용합니다. 자세한 내용은 MySQL 웹사이트의 15.7.3.1 ANALYZE TABLE 문을 참조하십시오.
관련 정보

관련 콘텐츠
- 질문됨 일 년 전lg...
- 질문됨 8년 전lg...
- 질문됨 4달 전lg...
- AWS 공식업데이트됨 2년 전