Aurora MySQL 데이터베이스의 메모리 부족 문제 해결
Aurora MySQL DB 인스턴스의 메모리가 매우 낮으면 운영 체제에서 데이터베이스 프로세스를 종료하여 예기치 않은 재시작이 발생할 수 있습니다. 이러한 재시작을 방지하기 위해 Aurora MySQL에는 시스템 메모리를 모니터링하고 메모리가 부족할 때 자동 복구 작업을 수행하는 메모리 관리 기능이 포함되어 있습니다. 이러한 작업은 메모리 소진으로 인한 데이터베이스 가용성을 방지하는 데 도움이 됩니다.
다음 파라미터는 이 동작을 제어합니다:.
-
aurora_enable_memory_management- Aurora MySQL 8.4에서만 사용할 수 있습니다.-
ON(기본값)인 경우 Aurora는 메모리 복구 작업을 자동으로 관리하며aurora_oom_response파라미터는 무시됩니다. -
aurora_oom_response를 통해 복구 작업을 수동으로 제어하려면OFF로 설정합니다.
-
-
aurora_oom_response- 쉼표로 구분된 복구 작업 목록입니다. 빈 문자열은 모든 작업을 비활성화합니다. Aurora MySQL 버전 3에서 사용할 수 있습니다. Aurora MySQL 8.4에서도 사용할 수 있지만aurora_enable_memory_management가OFF로 설정된 경우에만 고려됩니다.
OOM 응답 조치
다음 작업은 최소 수준에서 가장 공격적인 수준까지 나열된 aurora_oom_response에 포함될 수 있습니다.
| 작업 | 하는 일 | 참고 |
|---|---|---|
print |
메모리 집약적인 쿼리 및 연결을 오류 로그에 로깅합니다. 쿼리 또는 연결이 종료되지 않습니다. | Aurora MySQL 버전 3 및 8.4에서 사용할 수 있습니다. |
tune |
내부 테이블 캐시(table_open_cache, table_definition_cache)를 여유 메모리로 줄입니다. 캐시 크기는 메모리가 정상으로 돌아갈 때 복원됩니다. 이전에 캐시된 항목은 복원되지 않습니다. 새 항목은 후속 쿼리가 액세스할 때만 추가됩니다. |
Aurora MySQL 버전 3 및 8.4에서 사용할 수 있습니다. 프로비저닝된 인스턴스만 - Serverless v2에서는 지원되지 않습니다. |
tune_buffer_pool |
InnoDB 버퍼 풀을 여유 메모리로 축소합니다. 메모리가 정상으로 돌아갈 때 버퍼 풀 크기가 복원됩니다. 이전에 캐시된 제거된 페이지는 자동으로 다시 로드되지 않습니다. 새 페이지는 후속 쿼리가 액세스할 때만 캐시됩니다. | Aurora MySQL 버전 3(3.06 이상) 및 Aurora MySQL 8.4만 해당됩니다. vCPU가 2개 있는 프로비저닝 인스턴스에서만 지원됩니다. Serverless v2에서는 지원되지 않습니다. |
decline |
메모리가 부족한 동안 오류가 발생하는 새 쿼리를 거부합니다. | Aurora MySQL 버전 3 및 8.4에서 사용할 수 있습니다. |
kill_query |
메모리가 정상으로 돌아갈 때까지 가장 높은 메모리 소비자부터 시작하여 실행 중인 SELECT 쿼리를 종료합니다. DDL, 기타 DML 및 트랜잭션은 영향을 받지 않습니다. |
Aurora MySQL 버전 3 및 8.4에서 사용할 수 있습니다. kill_connect와 상호 배타적 – 둘 다 설정된 경우 kill_connect만 활성화됩니다. |
kill_connect |
사용자 연결을 종료하고 활성 트랜잭션을 롤백하고 DDL 문을 종료합니다. | 아래 버전별 동작을 참조하세요. |
중요
tune_buffer_pool을 aurora_oom_response 파라미터 값 중 kill_query 또는 kill_connect와 짝지어야 합니다. 이 중 하나가 없으면 tune_buffer_pool이 포함된 경우에도 버퍼 풀 크기 조정이 발생하지 않습니다.
kill_connect 버전별 동작
| Aurora MySQL 버전 | 동작 |
|---|---|
| Aurora MySQL 3.04~Aurora MySQL 3.10 | 사용자 연결을 종료하여 데이터베이스가 메모리 압력으로부터 복구할 수 있는 충분한 메모리를 확보합니다. |
| Aurora MySQL 3.11 이상, Aurora MySQL 8.4 | 사용자 연결을 종료하여 데이터베이스가 메모리 압력으로부터 복구할 수 있는 충분한 메모리를 확보합니다. 또한 메모리 압력 중에 메모리 할당을 시도하는 모든 사용자 연결을 종료합니다. |
Serverless v2에서 Aurora는 먼저 ACU를 스케일 업하여 메모리 압력에 응답하여 추가 메모리를 제공합니다. 조정이 진행되는 동안 메모리 압력이 지속되면 Aurora는 기존 연결을 종료하여 메모리를 복구할 수 있습니다. 메모리 할당을 시도하는 연결의 종료는 인스턴스가 구성된 최대 ACU 제한에 도달하여 더 이상 확장할 수 없는 경우에만 발생합니다.
버전별 기본값
Aurora MySQL은 엔진 버전, 인스턴스 유형 및 사용 가능한 메모리를 기반으로 aurora_oom_response를 자동으로 구성합니다.
Aurora MySQL 8.4에서 aurora_enable_memory_management가 ON(기본값)인 경우 Aurora는 메모리 복구 작업을 자동으로 관리하며 aurora_oom_response 값은 사용되지 않습니다. OFF로 설정하면 Aurora는 기본적으로 비어 있는 aurora_oom_response 값을 직접 사용합니다. 즉, 명시적으로 구성하지 않는 한 복구 작업이 수행되지 않습니다. 다음 기본값 표는 Aurora MySQL 버전 3에만 적용됩니다.
작은 인스턴스 임계값: 버전 3.04 및 3.05의 경우 ≤2GiB. 버전 3.06 이상의 경우 ≤4GiB.
큰 인스턴스 임계값: 버전 3.04 및 3.05의 경우 >2GiB. 버전 3.06 이상의 경우 ≤4GiB.
| 버전 | 인스턴스 크기 | 프로비저닝됨 | Serverless v2 |
|---|---|---|---|
| Aurora MySQL 3.04~Aurora MySQL 3.05 | 스몰 | print,tune | print |
| 대형 | (비활성) | (비활성) | |
| Aurora MySQL 3.06 | 스몰 | print,tune,decline,kill_connect | print |
| 대형 | (비활성) | (비활성) | |
| Aurora MySQL 3.07 | 스몰 | print,tune,decline,kill_connect | print |
| 대형 | print | print | |
| Aurora MySQL 3.08 | 스몰 | print,tune,tune_buffer_pool,decline,kill_connect | print |
| 대형 | print | print | |
| Aurora MySQL 3.09~Aurora MySQL 3.10 | 스몰 | print,tune,tune_buffer_pool,decline,kill_connect | print |
| 대형 | print,decline,kill_connect | print,decline,kill_connect | |
| Aurora MySQL 3.11 이상 | 스몰 | print,tune,tune_buffer_pool,decline,kill_connect | print,decline,kill_connect |
| 대형 | print,decline,kill_connect | print,decline,kill_connect |
Aurora Serverless v2
tune 및 tune_buffer_pool 작업은 Aurora Serverless v2에서 지원되지 않습니다. 다른 모든 작업은 프로비저닝된 인스턴스에서와 동일하게 작동합니다.
메모리 임계값은 인스턴스가 ACU를 확장함에 따라 동적으로 조정됩니다. 위 기본값 표의 Serverless v2 열에는 각 버전의 유효 기본값이 표시됩니다.
모니터링
다음 방법을 통해 OOM 회피 활동을 모니터링할 수 있습니다.
오류 로그
메모리 복구 작업이 수행되면 Aurora MySQL은 데이터베이스 오류 로그에 메시지를 기록합니다. 메시지 접두사는 버전에 따라 다르며 향후 릴리스에서 변경될 수 있습니다.
Aurora MySQL 버전 3: 메시지 앞에
OOM crash avoidance:접두사가 붙습니다.Aurora MySQL 버전 8.4: 메시지에는
Aurora memory management:접두사가 붙습니다.
이러한 메시지에는 다음이 포함됩니다.
총 메모리 및 사용 가능한 메모리로 메모리 압력 감지 및 복구 알림
메모리 복구를 위해 종료된 쿼리 또는 연결 세부 정보
print작업으로 식별된 후보 쿼리
오류 로그를 보려면 Aurora MySQL 오류 로그 섹션을 참조하세요.
Amazon CloudWatch 측정치
다음 CloudWatch 지표는 인스턴스 수준에서 OOM 회피 활동을 추적합니다.
| 지표 | 설명 | 사용 가능한 버전 | 단위 |
|---|---|---|---|
AuroraMemoryHealthState | 메모리 상태를 나타냅니다. 0은 정상(메모리 압력 없음)을, 5는 중간 메모리 압력을, 10은 중요한 메모리 압력을 의미합니다. | Aurora MySQL 3.06.1 이상, Aurora MySQL 8.4 | 게이지 |
AuroraMemoryNumDeclinedSqlTotal | OOM 회피로 인해 감소한 증분 쿼리 수입니다. | Aurora MySQL 3.06.1 이상, Aurora MySQL 8.4 | 개수 |
AuroraMemoryNumKillConnTotal | OOM 회피로 인해 종료된 증분 연결 수입니다. | Aurora MySQL 3.06.1 이상, Aurora MySQL 8.4 | 개수 |
AuroraMemoryNumKillQueryTotal | OOM 회피로 인해 종료된 증분 쿼리 수입니다. | Aurora MySQL 3.06.1 이상, Aurora MySQL 8.4 | 개수 |
AuroraMillisecondsSpentInOomRecovery | 메모리 상태가 정상 상태 미만으로 떨어진 이후 경과한 시간입니다. | Aurora MySQL 3.08.0 이상, Aurora MySQL 8.4 | 밀리초 |
AuroraNumOomRecoverySuccessful | 메모리 상태가 정상 상태로 복원된 횟수입니다. | Aurora MySQL 3.08.0 이상, Aurora MySQL 8.4 | 개수 |
AuroraNumOomRecoveryTriggered | 메모리 상태가 정상 상태 미만으로 떨어진 횟수입니다. | Aurora MySQL 3.08.0 이상, Aurora MySQL 8.4 | 개수 |
다음 일반적인 CloudWatch 지표는 메모리 압력을 모니터링하는 데도 유용합니다.
| 지표 | 설명 | 단위 |
|---|---|---|
FreeableMemory | 사용 가능한 메모리 양. /proc/meminfo의 MemAvailable 값을 보고합니다. | 바이트 |
SwapUsage | 사용되는 스왑 공간 크기입니다. | 바이트 |
Aurora MySQL 인스턴스 수준 지표의 전체 목록은 Amazon Aurora에 대한 인스턴스 수준 지표 섹션을 참조하세요.
글로벌 상태 변수
다음 상태 변수는 OOM 상태에 대한 정보를 제공합니다. Aurora MySQL 버전 3.06.0 이상에서 사용 가능합니다.
| 변수 | 설명 |
|---|---|
Aurora_oom_response | 이 DB 인스턴스에 대한 현재 활성 OOM 응답 작업입니다. |
aurora_oom_avoidance_recovery_state | OOM 복구가 ACTIVE 또는 INACTIVE인지 여부입니다. |
aurora_oom_status | 데이터베이스의 현재 메모리 상태: 정상(메모리 압력 없음), 중간 메모리 압력 또는 심각한 메모리 압력. 버전 3에서만 사용할 수 있습니다. |
쿼리 방법: SHOW GLOBAL STATUS LIKE 'aurora_oom%';
Aurora MySQL 전역 상태 변수의 전체 목록은 Aurora MySQL 글로벌 상태 변수 섹션을 참조하세요.
성능 개선 도우미
성능 개선 도우미가 활성화된 경우 OS 수준 메모리 지표를 사용하여 메모리 압력을 모니터링하고 OOM 이벤트를 감지할 수 있습니다. os.memory 및 os.swap 카운터에서 다음 지표를 사용할 수 있습니다.
| 지표 | 설명 |
|---|---|
os.memory.outOfMemoryKillCount | 마지막 수집 간격 동안의 OOM 종료 수입니다. 0이 아닌 값은 일반적으로 데이터베이스가 다시 시작되는 메모리 소진으로 인해 운영 체제가 프로세스를 종료했음을 나타냅니다. |
os.memory.total | 총 메모리 양(KB) |
os.memory.free | 할당되지 않은 메모리의 양(KB) |
os.memory.active | 할당된 메모리의 양(KB) |
os.memory.cached | 파일 시스템 I/O를 캐시하는 데 사용되는 메모리의 양(킬로바이트)입니다. |
os.memory.dirty | 수정되었지만 스토리지에 아직 기록되지 않은 메모리 페이지의 양입니다. 단위는 킬로바이트입니다. |
os.memory.inactive | 가장 적게 사용되는 메모리 페이지의 양(KB) |
os.memory.db.residentSetSize | 데이터베이스 프로세스(공유 메모리 제외)에서 사용하는 바이트 단위의 메모리 양입니다. |
os.memory.db.cache | 데이터베이스 프로세스가 페이지 캐시에 사용하는 메모리 용량(바이트)입니다. |
os.memory.db.swap | 데이터베이스 프로세스에 사용되는 스왑 메모리의 양(바이트)입니다. |
os.swap.in | 디스크에서 스왑 인된 메모리 용량(킬로바이트)입니다. |
os.swap.out | 디스크로 스왑 아웃된 메모리 용량(킬로바이트)입니다. |
os.memory.outOfMemoryKillCount를 모니터링하여 메모리 부족으로 인해 OS가 데이터베이스 프로세스를 종료한 시기를 감지할 수 있습니다. OS 카운터의 전체 목록은 성능 개선 도우미 OS 지표를 참조하세요.
성능 스키마
performance_schema가 활성화된 경우 메모리 요약 테이블을 사용하여 메모리를 가장 많이 소비하는 구성 요소와 연결을 식별할 수 있습니다. 자세한 내용은 Aurora MySQL 데이터베이스의 메모리 사용량 문제 해결 섹션을 참조하세요.