내용으로 건너뛰기

Amazon RDS for MySQL 데이터베이스의 사용 가능 메모리 부족 문제를 해결하려면 어떻게 해야 합니까?

7분 분량
0

Amazon Relational Database Service(Amazon RDS) for MySQL 인스턴스를 실행하면 발생하는 메모리 부족 문제를 해결하려고 합니다. 사용 가능한 메모리가 부족하거나, 데이터베이스의 메모리가 부족하거나, 애플리케이션에서 지연 시간 문제가 발생합니다.

해결 방법

중요: 성능 개선 도우미는 2026년 6월 30일에 서비스가 종료됩니다. 2026년 6월 30일 이전에 Database Insights의 고급 모드로 업그레이드할 수 있습니다. 업그레이드하지 않으면 Performance Insights를 사용하는 DB 클러스터는 Database Insights의 표준 모드로 기본 설정됩니다. Database Insights의 고급 모드만 실행 계획과 온디맨드 분석을 지원합니다. 클러스터가 표준 모드로 기본 설정된 경우 콘솔에서 이러한 기능을 사용하지 못할 수 있습니다. 고급 모드를 활성화하려면 Amazon RDS용 Database Insights의 고급 모드 활성화Amazon Aurora용 Database Insights의 고급 모드 활성화를 참조하십시오.

데이터베이스 성능 향상

데이터베이스 성능을 향상하려면 쿼리를 최적화하고 조정하십시오. Amazon RDS Performance Insights를 사용하여 DB 인스턴스를 모니터링하고 문제가 있는 쿼리를 식별합니다. 그런 다음, 사용 가능한 메모리가 95%에 도달하면 알림을 받을 수 있도록 FreeableMemory 지표에 Amazon CloudWatch 경보를 설정합니다. 인스턴스 메모리의 5% 이상을 비워 두는 것이 좋습니다.

Amazon RDS for MySQL에서 메모리 할당 확인

메모리 할당 계산

DB 인스턴스의 대략적인 메모리 사용량을 계산하려면 다음 공식을 사용하십시오.

총 메모리 사용량 = (innodb_additional_mem_pool_size + innodb_buffer_pool_size + innodb_log_buffer_size + key_buffer_size + query_cache_size + tmp_table_size) + max_connections (binlog_cache_size + join_buffer_size + read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack ) + (performance_schema max_connections * 429498)`

쿼리를 실행하기에 충분한 리소스가 데이터베이스에 할당되어 있는지 확인합니다. 저장 프로시저와 같은 특정 쿼리는 실행 시 메모리를 무제한으로 사용할 수 있습니다. 장시간 실행되는 트랜잭션을 방지하려면 큰 쿼리를 작은 쿼리로 나누십시오. Amazon RDS for MySQL의 메모리 사용 방법에 대한 자세한 내용은 MySQL 웹 사이트에서 MySQL의 메모리 사용 방법을 참조하십시오.

인스턴스의 MySQL 마이너 버전을 정기적으로 업그레이드하는 것이 모범 사례입니다. 이전 마이너 버전에서 메모리 누수 관련 버그가 있을 수 있습니다. MySQL 버전에 대한 자세한 내용은 MySQL 웹사이트에서 MySQL 8.0 릴리스 정보를 참조하십시오.

버퍼 풀 크기 확인

장기 실행 트랜잭션, 메모리 사용률 통계 또는 잠금을 보려면 SHOW ENGINE INNODB STATUS 명령을 사용합니다. SHOW ENGINE 쿼리에 대한 자세한 내용은 MySQL 웹 사이트의 SHOW ENGINE 쿼리를 참조하십시오. 출력을 검토한 다음, 버퍼 풀 및 메모리 항목에서 InnoDB의 메모리 할당에 관한 정보(예: 할당된 총 메모리, 내부 해시 테이블, 버퍼 풀 크기)를 확인합니다. 워크로드에 교착 상태가 자주 발생하는 경우 사용자 지정 파라미터 그룹에서 innodb_lock_wait_timeout 파라미터를 수정합니다. InnoDB는 innodb_lock_wait_timeout 설정을 사용하여 교착 상태가 발생하면 트랜잭션을 롤백합니다.

버퍼 풀이 클수록 디스크로 다시 돌리는 I/O 작업이 덜 필요합니다. 기본적으로 innodb_buffer_pool_size는 Amazon RDS DB 인스턴스에 할당된 사용 가능한 메모리의 최대 75%를 사용합니다. 즉, innodb_buffer_pool_size = DBInstanceClassMemory*3/4입니다. 버퍼 풀에 대한 자세한 내용은 MySQL 웹 사이트의 버퍼 풀을 참조하십시오.

메모리 사용의 소스를 식별하려면 먼저 innodb_buffer_pool_size를 확인합니다. 이후 필요한 경우 사용자 지정 파라미터 그룹의 파라미터 값을 수정하여 innodb_buffer_pool_size를 줄입니다.

자세한 내용은 Amazon RDS for MySQL의 파라미터 구성 모범 사례, 파트 1: 성능 관련 파라미터를 참조하십시오.

MySQL 스레드 확인

또한 MySQL DB 인스턴스에 연결된 각 MySQL 스레드에 메모리가 할당됩니다. 할당된 메모리가 필요한 MySQL 스레드에 대한 자세한 내용은 MySQL 및 MariaDB 문제 페이지의 메모리 제한에 대한 호환되지 않는 파라미터 상태 진단 및 해결을 참조하십시오.

MySQL은 일부 작업을 수행하기 위해 임시 내부 테이블을 생성합니다. 테이블이 tmp_table_size 또는 max_heap_table_size의 최소값에 도달하면 MySQL은 테이블을 메모리 기반 테이블에서 디스크 기반 테이블로 변환합니다. 여러 세션에서 임시 내부 테이블을 생성하면 메모리 사용량이 증가할 수 있습니다. 메모리 사용을 줄이려면 쿼리에 최대 테이블만 사용하십시오. 자세한 내용은 MySQL 웹 사이트의 서버 시스템 변수MySQL의 메모리 사용 방법을 참조하십시오.

tmp_table_sizemax_heap_table_size 값을 늘리면 더 큰 임시 테이블이 메모리에 저장됩니다. MySQL에서 암시적 임시 테이블을 생성했는지 확인하려면 created_tmp_tables 변수를 사용합니다. 이 변수에 대한 자세한 내용은 MySQL 웹사이트에서 created_tmp_tables을 참조하십시오.

활성 조인 및 정렬 작업 보기

임시 테이블이 필요한 쿼리를 식별하는 경우 테이블에 할당할 추가 메모리가 있어야 합니다. 데이터베이스의 활성 연결 및 쿼리를 보려면 SHOW FULL PROCESSLIST 명령을 사용합니다. SHOW FULL PROCESSLIST 및 예제 쿼리에 대한 자세한 내용은 MySQL 웹 사이트의 SHOW PROCESSLIST 쿼리를 참조하십시오.

MySQL이 조인 또는 정렬 작업 중에 join_buffer_size 또는 sort_buffer_size와 같은 동일한 유형의 여러 버퍼를 할당하면 메모리 사용량이 증가합니다. 예를 들어 MySQL은 두 테이블 간에 조인을 수행하기 위해 하나의 조인 버퍼를 할당합니다. 모든 쿼리에 조인 버퍼가 필요한 여러 조인 테이블을 사용하는 쿼리에 대해 MySQL은 전체 테이블 수보다 조인 버퍼를 하나 적게 할당합니다.

세션 변수를 너무 높은 값으로 구성하면 오류가 발생할 수 있습니다. 이 오류를 해결하려면 join_buffer_sizesort_buffer_size와 같은 세션 수준 변수에 필요한 최소 메모리를 할당합니다.

참고: MYISAM 테이블에 대량 삽입을 수행하는 경우 MySQL은 bulk_insert_buffer_size 바이트의 메모리를 사용합니다. 자세한 내용은 MySQL 사용 모범 사례를 참조하십시오.

성능 스키마 활성화

Performance Insights를 활성화하면 인스턴스 시작 시 및 서버 작업 중에 MySQL이 성능 스키마에 대한 내부 버퍼를 할당합니다. 성능 스키마가 메모리를 사용하는 방법에 대한 자세한 내용은 MySQL 웹 사이트의 성능 스키마 메모리 할당 모델을 참조하십시오.

인스턴스의 메모리 사용량 모니터링

CloudWatch 지표 확인

메모리 부족 여부를 확인하려면 Aurora 및 RDS 콘솔의 모니터링 탭을 사용하여 DatabaseConnections, CPUUtilization, ReadIOPSWriteIOPS CloudWatch 지표를 모니터링합니다.

DatabaseConnections의 경우 데이터베이스에 연결할 때마다 사용 가능한 메모리를 줄일 수 있는 할당된 메모리가 필요합니다. DBInstanceClassMemory/12582880 공식을 사용하여 예상 최대 max_connections 할당량을 계산합니다.

max_connections 할당량을 초과했는지 확인하려면 DatabaseConnections CloudWatch 지표를 확인하십시오.

메모리 압력을 확인하려면 SwapUsageFreeableMemory CloudWatch 지표를 모니터링하십시오. 데이터베이스 성능을 향상하려면 메모리 압력 수준을 95% 미만으로 유지하는 것이 모범 사례입니다. 자세한 내용을 보려면, 메모리가 충분한데 Amazon RDS DB 인스턴스가 스왑 메모리를 사용하는 이유는 무엇입니까?를 참조하십시오.

MySQL sys 스키마를 사용하여 메모리 사용 추적

MySQL sys 스키마를 사용하여 메모리의 연결, 구성 요소 및 쿼리를 추적합니다. 자세한 내용은 MySQL 웹 사이트의 30장 MySQL sys 스키마를 참조하십시오. MySQL sys 스키마와 성능 스키마 테이블을 사용하여 현재 메모리 사용량을 식별하고 추적합니다.

참고: sys 스키마를 사용하려면 성능 스키마를 활성화해야 합니다.

sys 스키마에서 메모리 사용을 추적하려면 데이터베이스에 로그인하고 다음 작업을 수행하십시오.

  • memory_by_host_by_current_bytes를 사용하여 가장 많은 메모리를 사용하는 호스트를 확인합니다.
  • memory_by_thread_by_current_bytes를 사용하여 가장 많은 메모리를 사용하는 스레드 ID를 확인합니다.
    참고: MySQL의 스레드 ID는 클라이언트 연결 또는 백그라운드 스레드일 수 있습니다. sys.processlist 뷰 또는 performance_schema.threads 테이블을 사용하고 스레드 ID를 MySQL 연결 ID에 매핑할 수 있습니다.
  • memory_by_user_by_current_bytes를 사용하여 가장 많은 메모리를 사용하는 사용자를 확인합니다.
  • memory_global_by_current_bytes를 사용하여 가장 많은 메모리를 사용하는 엔진 구성 요소를 확인합니다.
  • memory_global_total을 사용하여 데이터베이스 엔진에서 추적된 총 메모리 사용량을 확인합니다.
  • sys.memory_global_by_current_bytes를 사용하여 가장 많은 메모리를 사용하는 구성 요소를 확인합니다.
    참고: 성능 스키마와 관련된 메모리 이벤트에는 **memory/performance_schema/%**를 사용합니다. InnoDB의 경우 **memory/innodb/%**를 사용합니다.

전역 수준에서 메모리를 가장 많이 사용하는 기능 구성 요소를 식별하려면 다음 쿼리를 실행합니다.

SELECT  SUBSTRING_INDEX(SUBSTRING_INDEX(event_name, '/', 2),    '/',    -1    )  AS event_type,    ROUND(SUM(CURRENT_NUMBER_OF_BYTES_USED)/1024/1024, 2) AS MB_CURRENTLY_USED    FROM performance_schema.memory_summary_global_by_event_name    GROUP BY event_type    HAVING MB_CURRENTLY_USED>0;

performance_schema가 메모리를 가장 많이 사용하는 경우 다음 쿼리를 실행하여 메모리를 사용하는 event_name을 확인하십시오.

select * from sys.memory_global_by_current_bytes where event_name like '%performance_schema%' and current_count > 0;
select * from performance_schema.memory_summary_global_by_event_name WHERE EVENT_NAME LIKE 'memory/performance_schema/%'order by CURRENT_NUMBER_OF_BYTES_USED desc;

그 후 다음 쿼리를 실행합니다.

select * from sys.memory_global_by_current_bytes where event_name like 'memory/sql%' and current_count > 0;
select p.id,p.user,p.host,p.db,p.command,p.state,p.info,t.thread_id,t.type from information_schema.processlist p, performance_schema.threads t where p.id=t.processlist_id and t.thread_id=thread_id;

참고: **memory/sql%**를 이벤트 유형으로 바꿉니다.

특정 스레드의 이벤트당 메모리 할당에 대한 세부 정보를 보려면 다음 쿼리를 실행합니다.

select * from performance_schema.memory_summary_by_thread_by_event_name where thread_id=thread_id and CURRENT_COUNT_USED >0 order by CURRENT_NUMBER_OF_BYTES_USED desc;

또한 performance_schema 이벤트를 사용하여 성능 스키마에서 사용하는 내부 버퍼에 MySQL이 할당하는 메모리 양을 표시할 수 있습니다. 할당된 메모리 양을 확인하려면 다음 쿼리를 실행합니다.

select * from performance_schema.memory_summary_global_by_event_name WHERE EVENT_NAME LIKE 'memory/performance_schema/%';

메모리 계측 도구는 setup_instruments 테이블에서 memory/code_area/instrument_name 형식으로 찾을 수 있습니다.

성능 스키마에서 메모리 계측을 활성화하려면 performance_schema.setup_instruments 테이블에서 계측 도구의 ENABLED 열을 YES로 설정하십시오.

참고: MySQL 8.x에서는 성능 스키마가 활성화되면 메모리 계측이 기본적으로 활성화됩니다.

리소스 사용 모니터링

DB 인스턴스의 리소스 사용을 모니터링하려면 향상된 모니터링을 활성화합니다. 그런 다음 1~5초 사이의 세분성을 설정합니다. 기본 세분성은 60초입니다. 향상된 모니터링을 사용하여 사용 가능한 메모리와 활성 메모리를 실시간으로 확인할 수 있습니다.

가장 많은 CPU와 메모리를 사용하는 스레드를 모니터링하려면 다음 명령을 실행하여 DB 인스턴스의 스레드를 목록으로 표시합니다.

select THREAD_ID, PROCESSLIST_ID, THREAD_OS_ID from performance_schema.threads;

그 후 다음 명령을 실행하여 thread_OS_IDthread_ID에 매핑합니다.

select p.* from information_schema.processlist p, performance_schema.threads t where p.id=t.processlist_id and t.thread_os_id=thread-ID;

참고: thread-ID를 스레드 ID로 바꾸십시오.

관련 정보

Amazon RDS용 모니터링 도구

Aurora MySQL 데이터베이스의 메모리 사용량 문제 해결

1 댓글

This article was reviewed and updated on 2025-12-04.

전문가

답글을 게시함 2일 전