리소스 최적화

지원 버전: Kubernetes 1.28+, Java 17+, Python 3.11+, Node.js 20+, Go 1.21+ 마지막 업데이트: 2026년 2월 21일

< 이전: 관측성 스택 운영 | 목차 | 다음: EKS 업그레이드 >


1. 리소스 설정 기본 원칙

1.1 Requests vs Limits

Kubernetes에서 컨테이너 리소스 설정은 두 가지 개념으로 구분됩니다:

┌─────────────────────────────────────────────────────────────────────────────┐
│                        Resource Configuration                                │
├─────────────────────────────────────┬───────────────────────────────────────┤
│             Requests                │              Limits                    │
├─────────────────────────────────────┼───────────────────────────────────────┤
│  - 스케줄링에 사용                   │  - 런타임 제한에 사용                  │
│  - "최소 필요 리소스"                │  - "최대 허용 리소스"                  │
│  - 노드 선택 기준                    │  - 초과 시 throttling/OOMKill         │
│  - QoS 클래스 결정                   │  - cgroup 제한 설정                    │
└─────────────────────────────────────┴───────────────────────────────────────┘

동작 방식:

구분
Requests
Limits

CPU

스케줄링 보장

CFS quota로 제한 (throttling)

Memory

스케줄링 보장

cgroup 한계 (OOMKill)

설정 안함

제한 없이 스케줄링

제한 없음

1.2 QoS 클래스

QoS 클래스별 특성:

QoS 클래스
스케줄링
OOM 우선순위
사용 케이스

Guaranteed

예측 가능

마지막 제거

중요 워크로드

Burstable

유연함

중간

일반 애플리케이션

BestEffort

가장 유연

최우선 제거

배치 작업, 테스트

1.3 CPU Throttling 원리

Linux CFS (Completely Fair Scheduler) bandwidth control:

Throttling 발생 조건:

  • Period(100ms) 내에 Quota를 모두 사용

  • 멀티스레드 애플리케이션에서 여러 스레드가 동시에 CPU 사용 시 빠르게 quota 소진

1.4 Memory OOMKill

1.5 피해야 할 안티패턴


2. 최적 리소스 산정 방법

2.1 VPA (Vertical Pod Autoscaler) Recommender

VPA는 히스토리 데이터를 기반으로 최적의 리소스 설정을 추천합니다.

VPA 추천 유형:

2.2 Goldilocks 대시보드

Goldilocks는 VPA 추천을 시각화하고 네임스페이스 단위로 분석합니다.

대시보드 접근:

2.3 PromQL 기반 분석

CPU 사용률 분석

메모리 사용률 분석

2.4 최소 레플리카 계산

2.5 리소스 최적화 체크리스트

항목
확인 기준
조치

CPU 사용률

70-80% 유지

범위 외 시 request 조정

CPU Throttling

5% 미만

초과 시 limits 증가

메모리 사용률

80% 미만

초과 시 OOM 위험

메모리 Working Set

Limit의 70% 미만

초과 시 limit 증가

Pod 재시작

OOMKilled 없음

발생 시 메모리 limit 증가

응답 시간

SLO 충족

미충족 시 CPU/레플리카 증가


3. JVM 워크로드 최적화

3.1 JVM Heap vs 컨테이너 메모리

3.2 컨테이너 인식 JVM 설정

MaxRAMPercentage 권장값:

컨테이너 메모리
MaxRAMPercentage
이유

512Mi 이하

50-60%

작은 컨테이너는 non-heap 비율 높음

1-2Gi

70-75%

일반적인 권장값

4Gi 이상

75-80%

대용량은 non-heap 비율 낮음

3.3 GC 알고리즘 선택

GC 알고리즘 비교:

GC
지연시간
처리량
메모리 오버헤드
사용 케이스

G1GC

중간 (10-200ms)

높음

중간

일반 서버 애플리케이션

ZGC

매우 낮음 (<10ms)

높음

높음 (15-20%)

실시간 시스템, 대용량 힙

Shenandoah

낮음 (<10ms)

중간

중간

응답 시간 중요 애플리케이션

Parallel GC

높음

매우 높음

낮음

배치 처리, 처리량 우선

3.4 CPU Shares와 CFS Quota의 JVM 영향

명시적 GC 스레드 설정:

3.5 JMX 모니터링 설정

3.6 JFR (Java Flight Recorder) 설정

JFR 데이터 수집 (운영 중):

3.7 Spring Boot Actuator + Micrometer

커스텀 메트릭 등록:

3.8 Grafana JVM 대시보드 패널


4. Python/Node.js 워크로드

4.1 Python (Gunicorn/uWSGI)

Worker 수 계산

Gunicorn 설정

Python Deployment

메모리 프로파일링

4.2 Node.js

V8 힙 설정

Cluster 모드 (멀티코어 활용)

PM2 사용 시:

메모리 누수 감지


5. Go/Rust 워크로드

5.1 Go

GOMAXPROCS 자동 설정

GOMEMLIMIT 설정

GOMEMLIMIT 권장값:

Go 리소스 효율성

5.2 Rust

메모리 사용 패턴

Tokio 런타임 설정

환경 변수로 설정:

jemalloc 사용

5.3 컴파일 언어 장점

특성
Go
Rust
JVM (비교)

시작 시간

수십 ms

수십 ms

수 초

메모리 오버헤드

낮음

매우 낮음

높음

GC

있음 (효율적)

없음

있음

메모리 예측성

높음

매우 높음

중간

CPU 효율성

높음

매우 높음

높음

Cold Start

빠름

빠름

느림


6. 리소스 모니터링 대시보드

6.1 CPU Throttling 감지

6.2 메모리 압박 감지

6.3 Request vs 실제 사용량

6.4 과잉 프로비저닝 감지

6.5 Grafana 패널 예시

6.6 알림 규칙


7. Auto Mode에서의 리소스 최적화

7.1 NodePool 인스턴스 타입 영향

인스턴스 크기와 Bin-packing:

7.2 Over-provisioning vs Right-sizing

7.3 노드 통합 동작

Auto Mode의 노드 통합 동작:

7.4 클러스터 수준 리소스 효율성 메트릭


관련 문서


< 이전: 관측성 스택 운영 | 목차 | 다음: EKS 업그레이드 >

마지막 업데이트