ECS에서 메모리 설정은 Task, Container, Application(JVM 등) 3개 레벨로 나뉩니다. 각 레벨이 어떻게 동작하는지 정리합니다.
메모리 설정의 3개 레벨
Task 메모리 (Task에 할당된 전체 메모리)
└→ Container 메모리 (프로세스별 할당)
└→ Application 메모리 (JVM Heap 등)
| 레벨 | 설정 위치 | 역할 |
|---|---|---|
| Task 메모리 | Task Definition | 전체 메모리 한도 |
| Container 메모리 | Task Definition > containerDefinitions | 컨테이너별 메모리 한도 |
| Application 메모리 | JVM 옵션 (-Xmx 등) | 애플리케이션 내부 메모리 |
Application 레벨(JVM 메모리 설정)은 AWS ECS에서 Java + Spring Boot 어플리케이션 메모리 설정 에서 다룹니다.
Task 메모리 설정
Task Definition에서 설정합니다.
{
"cpu": "2048",
"memory": "8192"
}
Fargate는 CPU/메모리 조합이 정해져 있습니다. 자유롭게 설정할 수 없습니다.
| CPU | 사용 가능한 메모리 |
|---|---|
| 0.25 vCPU | 0.5GB, 1GB, 2GB |
| 0.5 vCPU | 1GB ~ 4GB (1GB 단위) |
| 1 vCPU | 2GB ~ 8GB (1GB 단위) |
| 2 vCPU | 4GB ~ 16GB (1GB 단위) |
| 4 vCPU | 8GB ~ 30GB (1GB 단위) |
| 8 vCPU | 16GB ~ 60GB (4GB 단위) |
| 16 vCPU | 32GB ~ 120GB (8GB 단위) |
Task 메모리는 그 안의 모든 컨테이너가 사용할 수 있는 총량입니다.
Container 메모리 설정
Task Definition의 containerDefinitions에서 컨테이너별로 설정합니다.
{
"containerDefinitions": [
{
"name": "spring-boot-app",
"memory": 7168,
"memoryReservation": 6144
},
{
"name": "datadog-agent",
"memory": 1024,
"memoryReservation": 512
}
]
}
memory vs memoryReservation
| 설정 | 의미 | 초과 시 |
|---|---|---|
| memory (hard limit) | 최대 사용 가능 메모리 | 컨테이너 Kill |
| memoryReservation (soft limit) | 최소 예약량 | 여유 있으면 초과 사용 가능 |
미설정 시 동작
컨테이너 레벨에 memory 설정이 없으면, 모든 컨테이너가 Task 메모리를 제한 없이 사용합니다.
Task 메모리 8GB
├→ 컨테이너 A: 제한 없음 → 8GB까지 사용 가능
└→ 컨테이너 B: 제한 없음 → 8GB까지 사용 가능
Fargate에서는 합계가 Task 메모리를 초과하면 Task 단위로 OOM Kill이 발생하는데, 컨테이너별 제한이 없으면 어떤 컨테이너가 원인인지 파악이 어렵습니다.
사이드카 패턴
Task에는 메인 컨테이너 외에 사이드카 컨테이너가 함께 실행될 수 있습니다.
[Task]
├→ 메인 컨테이너: Spring Boot 앱
└→ 사이드카 컨테이너: Datadog Agent (모니터링)
기존 서버 환경에서 서버 1대에 앱과 모니터링 에이전트를 같이 띄우는 것과 동일합니다.
흔한 사이드카 예시:
| 사이드카 | 역할 |
|---|---|
| Datadog Agent | 모니터링/APM |
| Nginx | 리버스 프록시 |
| Fluent Bit | 로그 수집 |
| AWS X-Ray Daemon | 분산 추적 |
사이드카가 있으면 메인 컨테이너가 실제로 사용할 수 있는 메모리는 Task 메모리보다 적습니다.
3개 레벨 설정 예시
Task 메모리 8GB, Spring Boot + Datadog Agent 구성인 경우:
Task 메모리: 8GB
├→ Spring Boot: memory 7GB
│ ├→ JVM Heap: 5.5GB (-Xmx5632m)
│ └→ JVM Non-Heap: ~1.5GB
└→ Datadog Agent: memory 1GB