

# Aurora MySQL 데이터베이스의 메모리 부족 문제 해결
<a name="AuroraMySQLOOM"></a>

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 응답 조치
<a name="AuroraMySQLOOM.actions"></a>

다음 작업은 최소 수준에서 가장 공격적인 수준까지 나열된 `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 버전별 동작
<a name="AuroraMySQLOOM.actions.kill_connect"></a>


| Aurora MySQL 버전 | 동작 | 
| --- | --- | 
| Aurora MySQL 3.04\~Aurora MySQL 3.10 | 사용자 연결을 종료하여 데이터베이스가 메모리 압력으로부터 복구할 수 있는 충분한 메모리를 확보합니다. | 
| Aurora MySQL 3.11 이상, Aurora MySQL 8.4 | 사용자 연결을 종료하여 데이터베이스가 메모리 압력으로부터 복구할 수 있는 충분한 메모리를 확보합니다. 또한 메모리 압력 중에 메모리 할당을 시도하는 모든 사용자 연결을 종료합니다. | 

Serverless v2에서 Aurora는 먼저 ACU를 스케일 업하여 메모리 압력에 응답하여 추가 메모리를 제공합니다. 조정이 진행되는 동안 메모리 압력이 지속되면 Aurora는 기존 연결을 종료하여 메모리를 복구할 수 있습니다. 메모리 할당을 시도하는 연결의 종료는 인스턴스가 구성된 최대 ACU 제한에 도달하여 더 이상 확장할 수 없는 경우에만 발생합니다.

## 버전별 기본값
<a name="AuroraMySQLOOM.defaults"></a>

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
<a name="AuroraMySQLOOM.serverless"></a>

`tune` 및 `tune_buffer_pool` 작업은 Aurora Serverless v2에서 지원되지 않습니다. 다른 모든 작업은 프로비저닝된 인스턴스에서와 동일하게 작동합니다.

메모리 임계값은 인스턴스가 ACU를 확장함에 따라 동적으로 조정됩니다. 위 기본값 표의 Serverless v2 열에는 각 버전의 유효 기본값이 표시됩니다.

## 모니터링
<a name="AuroraMySQLOOM.monitoring"></a>

다음 방법을 통해 OOM 회피 활동을 모니터링할 수 있습니다.

### 오류 로그
<a name="AuroraMySQLOOM.monitoring.errorlog"></a>

메모리 복구 작업이 수행되면 Aurora MySQL은 데이터베이스 오류 로그에 메시지를 기록합니다. 메시지 접두사는 버전에 따라 다르며 향후 릴리스에서 변경될 수 있습니다.
+ **Aurora MySQL 버전 3:** 메시지 앞에 `OOM crash avoidance:` 접두사가 붙습니다.
+ **Aurora MySQL 버전 8.4:** 메시지에는 `Aurora memory management:` 접두사가 붙습니다.

이러한 메시지에는 다음이 포함됩니다.
+ 총 메모리 및 사용 가능한 메모리로 메모리 압력 감지 및 복구 알림
+ 메모리 복구를 위해 종료된 쿼리 또는 연결 세부 정보
+ `print` 작업으로 식별된 후보 쿼리

오류 로그를 보려면 [Aurora MySQL 오류 로그](USER_LogAccess.MySQL.LogFileSize.md#USER_LogAccess.MySQL.Errorlog) 섹션을 참조하세요.

### Amazon CloudWatch 측정치
<a name="AuroraMySQLOOM.monitoring.cloudwatch"></a>

다음 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에 대한 인스턴스 수준 지표](Aurora.AuroraMonitoring.Metrics.md#Aurora.AuroraMySQL.Monitoring.Metrics.instances) 섹션을 참조하세요.

### 글로벌 상태 변수
<a name="AuroraMySQLOOM.monitoring.statusvars"></a>

다음 상태 변수는 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 글로벌 상태 변수](AuroraMySQL.Reference.GlobalStatusVars.md) 섹션을 참조하세요.

### 성능 개선 도우미
<a name="AuroraMySQLOOM.monitoring.pi"></a>

성능 개선 도우미가 활성화된 경우 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 지표](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PerfInsights_Counters.html#USER_PerfInsights_Counters.OS)를 참조하세요.

### 성능 스키마
<a name="AuroraMySQLOOM.monitoring.perfschema"></a>

`performance_schema`가 활성화된 경우 메모리 요약 테이블을 사용하여 메모리를 가장 많이 소비하는 구성 요소와 연결을 식별할 수 있습니다. 자세한 내용은 [Aurora MySQL 데이터베이스의 메모리 사용량 문제 해결](ams-workload-memory.md) 섹션을 참조하세요.