T
TechInsights
목록으로
BackEnd•2025. 05. 29.

Micrometer 객체 증가로 인한 메모리 이슈 회고

11번가
11번가 Engineering Team
Micrometer 객체 증가로 인한 메모리 이슈 회고

핵심요약

원문 보기

Spring Boot 3.x 환경에서 Micrometer 객체 증가로 인한 메모리 누적 현상과 G1GC의 Old 영역 처리 한계를 해결하기 위해 LoadBalancer 메트릭 수집을 비활성화하고 ZGC로 재전환하여 시스템 안정성을 확보한 경험을 공유합니다.

Micrometer 객체 증가로 인한 메모리 이슈 회고 및 GC 전략 최적화

Micrometer 객체 누적 문제 분석 및 해결

  • 서비스 개선 후 Spring Boot 3.x 환경에서 Meter$Id, Tag 객체가 Old 영역에 지속적으로 누적되며 메모리 사용률이 상승했습니다.
  • 원인은 Micrometer의 HTTP 요청 URI 태그 수집과 Spring Cloud LoadBalancer의 메트릭 수집이 맞물리면서 발생했습니다.
  • 특히 spring.cloud.loadbalancer.stats.micrometer.enabled: true 설정이 PathVariable을 포함한 URI를 정규화하지 않고 별도 태그로 수집하여 객체 재사용을 방해했습니다.
  • 불필요한 Meter 객체 생성을 차단하기 위해 LoadBalancer, Feign, Resilience4j 관련 메트릭 수집을 비활성화하여 문제를 해결했습니다.

GC 전략 재검토 및 ZGC 최적화

  • Micrometer 이슈 대응 후 ZGC에서 G1GC로 일시 전환했으나, 메모리 사용률이 점진적으로 증가하는 현상이 발생했습니다.
  • G1GC의 Mixed GC가 Old 영역 객체를 충분히 수거하지 못하는 정책적 한계로 인해 객체가 계속 쌓이는 것으로 분석되었습니다.
  • jmap -histo:live 명령을 통한 강제 Full GC 시 Old 영역 객체 감소가 확인되어, 메모리 누수보다는 G1GC의 동작 방식 문제로 판단했습니다.
  • 최종적으로 ZGC로 복귀하여 Heap 사용률이 안정적으로 유지되는 것을 확인하며, 고 TPS 및 객체 생성 빈번 환경에서 ZGC가 더 적합함을 확인했습니다.

최종 결론 및 시스템 안정화 시사점

  • Spring Boot 3.x 환경에서는 Micrometer 자동 메트릭 수집과 PathVariable 사용 증가가 메모리 누적으로 이어질 수 있음을 인지해야 합니다.
  • LoadBalancer 등 주요 컴포넌트의 메트릭 수집 설정을 서비스 특성에 맞게 선택적으로 조정하는 것이 중요합니다.
  • 고성능 환경에서는 ZGC와 같은 최신 GC 전략이 G1GC보다 Heap 사용률 및 안정성 측면에서 더 유리할 수 있습니다.
  • 유사한 아키텍처 구성 시, 사전 모니터링 및 성능 테스트를 통해 잠재적 메모리 이슈를 식별하고 대응하는 것이 필수적입니다.
#BackEnd#Infra
11번가
11번가

11번가 Engineering Team

기술 인사이트를 전달하는 공식 채널

You might also like

View all
토스 피플 : 새로운 길을 만들 땐 내 선택을 믿는다

토스 피플 : 새로운 길을 만들 땐 내 선택을 믿는다

"이 버튼 왜 안 눌려요?" 물류 현장의 목소리로 PDA 시스템 완성하기

"이 버튼 왜 안 눌려요?" 물류 현장의 목소리로 PDA 시스템 완성하기