AWS Elastic Kubernetes Service(EKS)는 컨테이너화된 애플리케이션을 손쉽게 배포하고 관리할 수 있는 강력한 클라우드 플랫폼입니다. Spring Boot 애플리케이션은 EKS Pod에서 자주 사용되며, JVM의 G1GC(Garbage First Garbage Collector)를 활용해 안정성과 성능을 최적화할 수 있습니다. 본 포스트에서는 AWS EKS 환경에서 Spring Boot Pod의 G1GC 설정과 효과적인 튜닝 방법을 다룹니다.


AWS EKS 환경의 특징과 JVM GC 요구사항

EKS 환경에서 JVM을 운영할 때 고려해야 할 주요 사항은 다음과 같습니다:

  1. 컨테이너 리소스 제한
    Pod는 CPU와 메모리의 상한선을 제한(Resource Limit)받으므로, GC 동작이 이를 초과하지 않도록 설정해야 합니다.

  2. 분산 시스템에서의 안정성
    예측 가능한 GC 지연 시간(Pause Time)이 중요합니다.

  3. 수평 확장성
    애플리케이션 Pod의 개수를 조정하며 GC 동작을 관찰할 필요가 있습니다.


Spring Boot에서 G1GC 활성화 및 기본 설정

Spring Boot는 JVM 설정을 쉽게 적용할 수 있습니다. Dockerfile 또는 Helm 차트에 다음과 같은 JVM 옵션을 추가하여 G1GC를 활성화할 수 있습니다.

G1GC 활성화 예제

-XX:+UseG1GC

Spring Boot 컨테이너 실행 시 설정

resources:
  limits:
    memory: "1Gi"
    cpu: "500m"
  requests:
    memory: "512Mi"
    cpu: "250m"

env:
  - name: JAVA_OPTS
    value: >
      -XX:+UseG1GC
      -XX:MaxGCPauseMillis=200
      -XX:InitiatingHeapOccupancyPercent=45
      -Xmx512m
      -Xms512m

AWS EKS에서의 튜닝 전략

  1. 소규모 Pod (메모리 512MB~1GB)

    • 추천 JVM 옵션

        -XX:+UseG1GC
        -XX:MaxGCPauseMillis=100
        -XX:InitiatingHeapOccupancyPercent=35
        -Xmx512m -Xms512m
      
    • 설명
      메모리 리소스가 제한된 Pod에서는 GC를 자주 수행하여 메모리 초과를 방지합니다.

  2. 중간 규모 Pod (메모리 1GB~4GB)

    • 추천 JVM 옵션

        -XX:+UseG1GC
        -XX:MaxGCPauseMillis=200
        -XX:InitiatingHeapOccupancyPercent=45
        -Xmx2g -Xms2g
      
    • 설명
      적당한 Pause Time과 처리량의 균형을 위해 기본값을 유지하며 튜닝합니다.

  3. 대규모 Pod (메모리 4GB 이상)

    • 추천 JVM 옵션

        -XX:+UseG1GC
        -XX:MaxGCPauseMillis=500
        -XX:InitiatingHeapOccupancyPercent=60
        -Xmx6g -Xms6g
      
    • 설명
      더 큰 힙 크기를 사용하여 GC 빈도를 줄이고 처리량을 극대화합니다.


G1GC 튜닝 시 유용한 도구

  1. GC 로그 활성화
     -Xlog:gc*:file=/var/log/gc.log:time,uptime,level,tags
    

    GC 로그를 분석하여 Pause Time, GC 빈도 등을 확인합니다.

  2. Kubernetes 메트릭 관찰
    • Metrics Server를 통해 메모리와 CPU 사용량을 모니터링합니다.
    • Prometheus와 Grafana를 사용하여 Pod의 성능 데이터를 시각화합니다.
  3. Spring Actuator 활용
    • HeapDump, ThreadDump 엔드포인트를 활성화하여 실시간 JVM 상태를 확인합니다.

실전 최적화 팁

  1. Pod 리소스 한도에 맞춘 JVM 설정
    • -Xmx 값을 Pod 메모리 Limit보다 약간 낮게 설정하여 안정성을 확보합니다.
  2. 지속적인 GC 로그 분석
    • GC Pause Time이 설정 목표를 초과하는 경우 -XX:MaxGCPauseMillis를 조정합니다.
  3. 수평 확장 테스트
    • Replica 수를 늘리면서 개별 Pod의 GC 성능을 비교하고 최적 설정을 찾습니다.

결론

AWS EKS에서 Spring Boot 애플리케이션을 운영할 때 G1GC는 메모리 관리와 성능 최적화에 매우 유용합니다. Pod의 리소스 제한과 분산 시스템 특성을 고려한 G1GC 튜닝은 애플리케이션의 안정성과 성능을 크게 향상시킬 수 있습니다. 본 포스트의 가이드를 활용하여 EKS 환경에서 JVM 성능을 최적화해 보세요.


참고자료

태그: , , , ,

카테고리:

업데이트:

댓글남기기