Garbage Collection Monitoring

  • NiFi 모니터링 하면서, TRACE 레벨의 로그도 남지 않고 계속 Heap 메모리가 증가하는 현상이 있어, GC 모니터링을 진행하였다
    • 메모리 누수의 문제를 의심하고 시작했지만, 사실상 KafkaConsumer 프로세서의 구현의 버그가 있는 듯 하다.
  • 하이튼, 이번에 NiFi 프로세스의 GC 모니터링을 하면서 사용해본 모니터링 툴(?), 방법에 대해 정리하고자 한다.

1. jstat

  • HotSpot JVM에 있는 모니터링 도구
  • 다양한 옵션(gc, gccapacity)등이 있지만, gcutil이 가장 확인하기 쉬웠음
  1. gc
    • 각 힙(heap) 영역의 현재 크기와 현재 사용량(Eden 영역, Survivor 영역, Old 영역등), 총 GC 수행 횟수, 누적 GC 소요 시간을 보여줌
  2. gccapactiy
    • 각 힙 영역의 최소 크기(ms), 최대 크기(mx), 현재 크기, 각 영역별 GC 수행 횟수를 알 수 있는 정보를 보여줌
    • 단, 현재 사용량과 누적 GC 소요 시간은 알 수 없음
  3. gcutil
    • 각 힙 영역에 대한 사용 정도를 백분율로 보여 준다. 아울러 총 GC 수행 횟수와 누적 GC 시간을 알 수 있음

gcutil

jstat -gcutil -t -h20 ${PID} 1s

  • ‘-t’ 맨 앞 필드에 시간 출력
  • ‘-h20’ 20줄에 한번씩 header 찍음
  • ‘1s’ 1초마다 결과 출력

gcutil

  • YGC
    • Young Generation의 GC 이벤트 발생 횟수
  • YGCT
    • Yong Generation의 GC 수행 누적 시간 ( 초 단위)
  • FGC
    • Full GC 이벤트가 발생한 횟수
  • FGCT
    • Full GC 수행 누적 시간 ( 초 단위)
  • GCT
    • 전체 GC 수행 누적 시간 (초 단위)
  • YGCT / YGC 하면 평균 Young GC 시간을 알 수 있음!
  • 하지만 GC의 수행 시간의 편차가 심할 수 있어 평균보다는 개별 GC 시간을 파악하려면 자바 프로세스 시작할 때 -verbosegc 옵션을 넣어 확인하는 것이 더 유리

2. jmap

자바 어플리케이션의 메모리 맵을 확인할 수 있음

jmap -heap ${PID}

  • JVM Heap 상태를 확인 할 수 있음 jmap-heap

    jmap -histo:live ${PID}

  • 클래스별 객체 수와 메모리 사용량 확인

jmap -dump:format=b,file=myDump.hprof ${PID}

  • heap dump 생성 후, visualVM으로 확인 가능

3. jvmtop

  • 실행중인 JVM의 Top 형태로 메모리 정보 및 CPU 프로파일링도 가능함
  • https://github.com/patric-r/jvmtop

jvmtop ${PID}

  • JVM 메모리 정보 jvmtop

jvmtop –profile ${PID}

  • JVM CPU 프로파일링 jvmtop-profile

4. visualVM ( with jstatd )

  • JVM을 모니터링하는 GUI툴
  • Visual GC를 이용하면 jstatd 실행을 통해 GC 정보를 자세히, UI로 확인할 수 있음
  • 자바 프로세서는 외부 서버에 실행중이고, visualVM으로 로컬에서 확인하려고 하면 원격서버에 다음과 같이 설정해야함

  • rmiregistry / jstatd 데몬 실행켜놓아야함
    1. rmiregistry ${PORT} &
    2. jstatd -p ${PORT} -J-Djava.security.policy=/home/test/tools.policy &
      • /home/test/tools.policy
        grant codebase "file:${java.home}/../lib/tools.jar" {
        permission java.security.AllPermission;
        };
        
  • VisualVM에서 서버를 등록하고, 해당 서버의 jstatd Connection 포트를 위에서 설정한 ${PORT}로 변경

jvm

  • 앞서 만든 heap dump ( myDump.hprof )을 시각화 할 수 있음
  • 덤프 파일을 생성할 수 도 있고, Sampler를 통해, CPU/Memory 사용중인 Thread 정보도 알 수 있음!
  • VisualGC 탭에서는 다음과 같이 Heap 메모리가 이쁘게 보임

aa


참고

Garbage Collection 모니터링 방법 VisualVM 사용