puppetserver GC

호두·2026년 2월 22일

GC란 ?
Heap 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객체(garbage)를 모아 주기적으로 제거하는 프로세스

GC 종류

Serial GC, Parallel GC ,CMS GC, G1 GC,Shenandoah GC 등등 .. .

  • Parallel GC : Java 8의 디폴트 GC, Minor GC를 멀티 쓰레드로 수행 (Old 영역은 여전히 싱글 쓰레드)
  • G1 GC : Java 9+ 버전의 디폴트 GC -> 4GB 이상의 힙 메모리 필요, 기존 GC는 아래 jstst 항목과 같이 heap영역이 고정되어 있는데 이를 Region이라는 영역으로 체스같이 분할하여 상황에 따라 Eden, Survivor, Old 등 역할을 고정이 아닌 동적으로 부여
  • ZGC (Z Garbage Collector) : Java 11에서 실험적으로 도입된 초처지연 GC 솔루션으로 ultra-low latency를 목표로 설계된 차세대 가비지 컬렉터라 멀티 테라바이트 힙에서도 10ms 미만의 pause time을 보장

jstat 각 항목별 설명

  • S0, S1 - Survivor Space 0 / 1 (eden 영역에서 살아남은 객체가 존재, 둘 중 하나는 반드시 비워져 있어야 함)
  • E - Eden 영역 사용률 (새로 생성된 gc 대상 객체)
  • O - old 영역 사용률
  • M - Metaspace 사용률
  • CCS - Compressed Class Space 사용률 (%)
  • YGC - Young GC 발생 횟수 (eden 영역에서 발생하는 GC)
  • YGCT - Young GC에서 소요된 누적 시간 (초)
  • FGC - Full GC 발생 횟수 (old gen이 가득 찬 경우 발생)
  • FGCT - Full GC 누적 시간 (초)
  • CGC - Concurrent GC 횟수
  • GCT - 전체 GC 시간 (초 단위 누적치)

정상적인 상태인 경우 E 영역이 순차적으로 차고 E영역이 100이 차면 S0 또는 S1 중에 하나의 영역이 차기 시작.
서버에 특이사항이 없는 한 위와 같은 행태가 계속 반복됨.

성능에 영향을 주는 항목은 CG, FG

  • fullgc는 old gen을 지우는 과정으로 비용이 굉장히 크기 때문에 자주 발생할 경우 서비스에 영향이 갈 수 있음.
  • CGC는 동시에 실행되는 GC로 GC 작업을 병렬 또는 동시적으로 처리하여 시스템의 throughput는 높힐 수 있으나 한꺼번에 많은 gc가 수행되며 시스템 전체 CPU 사용량과 컨텍스트 스위칭, load가 올라가 오히려 애플리케이션에 latency가 늘어날 수 있음.

이슈가 있는 puppet 서버에서 문제 발생 당시의 jstat 정보를 보면 CGC가 다른 서버에 비해 유독 높고, puppet 서버에서도 높은 context switching, cpu, load 수치를 보였다.
puppet 에서 유독 CGC가 높았던 원인은 max-active-intances 수를 상향 조정했지만 Parallel GC로 설정된 상태라 minor GC가 멀티쓰레드로 처리되며 CGC가 높아진 것으로 보인다.

이 때 GC를 G1GC로 변경했으면 동일 증상이 발생하지 않았을 수도 있다.

추가 이슈가 발생한 이후에는 heapsize를 12G로 늘리고 (메모리는 32G) GC를 G1GC로 변경하여 적용.

profile
Whatever you're not changing, you're choosing

0개의 댓글