10장. Kafka 메모리 선택 가이드
Kafka는 데이터를 저장하고 처리하는 시스템입니다. 이 과정에서 가장 중요한 자원 중 하나가 바로 메모리(RAM) 입니다. 이 장에서는 Kafka 운영에 필요한 메모리 용량을 계산식 기반으로 추정하고, 각 메모리 용도의 산정 근거를 수식과 함께 설명합니다.
10.1 Kafka에서 메모리가 사용되는 영역
Kafka는 크게 다음 3가지 용도로 메모리를 사용합니다:
| 용도 | 설명 |
|---|---|
| Page Cache | 데이터를 디스크에 쓰기 전 OS가 잠시 보관하는 공간 |
| JVM Heap | Kafka 내부 처리를 위한 Java 객체 저장 공간 |
| 네트워크/복제 버퍼 | 메시지를 다른 브로커 또는 클라이언트로 전송하기 전 임시 저장 공간 |
10.2 Page Cache 용량 계산
Kafka 공식 문서에서는 쓰기 처리량 기반으로 Page Cache 메모리를 산정할 것을 권장합니다.
✅ 공식:
Page Cache 메모리 = 초당 쓰기 처리량(MB/s) × 30초
- 예: 초당 쓰기 처리량이 200MB/s →
200 × 30 = 6,000MB = 6GB - 운영 경험에 따른 안정적 버퍼 확보 시간(30초)을 기준으로 합니다.
10.3 JVM Heap 용량 계산
JVM Heap은 Kafka가 내부 상태, 파티션 정보, 요청 큐 등을 관리하기 위해 사용하는 메모리입니다.
✅ 공식 (경험 기반):
JVM Heap (GB) = (브로커의 파티션 수 ÷ 1000) × 1.5~2GB
단, 최대 16GB 이내
- 예: 브로커가 5,000개 파티션 →
5,000 ÷ 1000 × 2 = 10GB
JVM Heap은 16GB 이상 설정 시 GC 효율 저하, Compressed OOPs 비활성화 등의 문제가 발생하므로 제한하는 것이 일반적입니다.
10.4 네트워크/복제 버퍼 메모리 계산
Kafka는 데이터를 전송할 때 메모리 버퍼를 사용합니다. 이때 리더는 팔로워 수만큼 데이터를 메모리에 유지하게 됩니다.
✅ 공식:
네트워크/복제 버퍼 (bytes) = 초당 메시지 수 × 평균 메시지 크기(bytes) × (1 + 복제 팔로워 수) × 평균 버퍼 유지 시간(초)
- 예:
- 메시지 수: 10,000 msg/s
- 메시지 크기: 1,024 bytes
- 복제 계수: 3 (팔로워 2명)
- 유지 시간: 1초
= 10,000 × 1024 × 3 × 1 = 30,720,000 bytes ≈ 29.3MB
- 보수적으로 2 ~ 3초 버퍼링을 고려해 약 60 ~ 90MB 정도 확보 필요
10.5 JVM 외 메모리 고려 사항
JVM은 Heap 외에도 다양한 메모리 공간을 자동으로 사용합니다:
| 영역 | 설명 | 기본 예상 |
|---|---|---|
| Metaspace | 클래스 정보 등 | 수백 MB |
| Thread Stack | 스레드당 1MB | 수백 스레드 운영 시 수백 MB |
| Direct Memory | 네이티브 I/O, Netty 등 | 수백 MB ~ 수 GB |
| Code Cache | JIT 컴파일 코드 | 수십~수백 MB |
➡️ 총합: Heap 외 JVM 메모리로 약 1~4GB 이상 예상
10.6 전체 메모리 계산 요약
Kafka 노드 하나에 필요한 메모리는 아래와 같이 계산됩니다:
✅ 공식:
전체 메모리 ≈
(Page Cache) +
(JVM Heap) +
(네트워크/복제 버퍼) +
(JVM Heap 외 메모리) +
(운영 여유 공간)
📌 각 항목의 조건 요약:
| 항목 | 계산 조건 |
|---|---|
| Page Cache | 쓰기 처리량(MB/s) × 30초 |
| JVM Heap | (파티션 수 ÷ 1000) × 2, 단 최대 16GB |
| 네트워크/복제 버퍼 | 메시지 수/s × 메시지 크기 × (1 + 팔로워 수) × 유지 시간(초) |
| JVM 외 메모리 | 고정값 아님, 일반적으로 1~4GB 예상 |
| 운영 여유 공간 | 시스템 예외 상황 대비용, 일반적으로 2~4GB 확보 권장 |
예시:
- Page Cache = 6GB (200MB/s × 30초)
- JVM Heap = 10GB (5,000파티션)
- 네트워크/복제 버퍼 = 90MB (보수적 3초 기준)
- JVM 외 메모리 = 3GB
- 여유 공간 = 4GB
→ 총 메모리: 약 23GB 권장
✅ 정리
- Kafka 메모리 구성은 모두 수치 기반 계산식으로 추정 가능합니다.
- 설정 기준:
- Page Cache: 쓰기 처리량 기반
- Heap: 파티션 수 기반
- 복제 버퍼: 메시지 수 × 크기 × 복제 수 × 유지시간
- JVM Heap 외 메모리도 시스템 수준에서 반드시 고려해야 함
- 전체 메모리는 운영 환경에 맞게 여유 있게 확보하는 것이 핵심입니다.