본문 바로가기

인프라,데이터/Elasticsearch, Logstash, Kibana

Logstash 6.3.x 버전에서의 GC(Garbage Collector)

Logstash로 kinesis input 플러그인을 설치하려는데

Unrecognized VM option 'UseParNewGC'
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

오류가 났다.

찾아보니 jdk 버전 문제인 것 같았다. 

Remove or comment line: -XX:+UseParNewGC
Remove or comment line: -XX:+UseConcMarkSweepGC
Add this line instead: -XX:+UseG1GC
Apparently the previously used GC in Java 8 and older was deprecated in Java 9 and removed in Java 10.
The new suggested default GC is the G1 collector, which will be used after the aforementioned changes.

출처 : elasticsearch/logstash 레파지토리의
"with java10 I get these error :Unrecognized VM option 'UseParNewGC'" #9316 에 달린 댓글 링크

회사에서 사용하는 로그스태시 버전은 6.3.x 버전대고, Oracle/OpenJDK 1.8.0 버전만 지원한다. 
하지만 서버에 깔린 openjdk 버전은 11.0.x 버전대인데, 로그스태시는 또 jdk1.8.0 버전을 사용하게 되어 있다.

그래서 오류가 난 듯 싶다. 🤔
Kinesis input plugin이 무슨 자바 버전을 사용하는지 찾아보려 했으나 찾아도 나오지 않았다.

일단 위의 옵션들에서 GCGarbage Collector를 말한다. 유효하지 않은 메모리인 가비지를 알아서 정리해준다. 
Java 8에서 GC는 메모리를 관리하는 도구로, 다음과 같은 작업을 한다.

1. Heap 영역에 존재하는 객체들에 대해 접근 가능한지 확인한다.

2. 접근 가능한 객체들에 Mark 하는 과정을 진행한다.

3. 접근할 수 없는 객체는 제거(Sweep) 대상이 되고, 해당 객체들을 제거한다. 

 

 

  자바의 힙 메모리에는 Young Generation과 Old Generation이 있는데,

GC는 Young Generation에 객체를 할당하고, 오래된 객체를 Old Generation으로 이동시킨다.

  • Young Generation
    • Young Generation은 새롭게 생성된 객체가 할당(Allocation)되는 영역
    • 대부분의 객체가 금방 Unreachable 상태가 되기 때문에, 많은 객체가 Young 영역에 생성되었다가 사라진다.
    • Young Generation에 대한 가비지 콜렉션을 Minor GC라고 부른다.
  • Old Generation
    • Young 영역에서 Reachable 상태를 유지하여 살아남은 객체가 복사되는 영역
    • 복사되는 과정에서 대부분 Young 영역보다 크게 할당되며, 크기가 큰 만큼 가비지는 적게 발생한다.
    • Old Generation에 대한 가비지 컬렉션을 Major GC 혹은 Full GC라고 부른다. 

 

로그스태시 6.3.x 대 버전의 설정에서

-XX:+UseParNewGCParallel New Garbage Collector 를 사용하는 것을 의미한다.
Parallel GC(예전 GC는 Parallel Old GC라고 불린다)는 Java 8의 디폴트 GC이다.
이 옵션은 기본 컬렉터와 함께 Young Generation을 복사하는 컬렉터를 병렬로 사용한다.
병렬로 모든 사용 가능한 CPU를 사용하여 작동 중지를 최소화시킨다.
기본 컬렉터, Mark and Sweep(사용 중/사용하지 않는 중인 메모리를 확인하고 객체를 지우는) 컬렉터와 사용 가능하다.

-XX:+UseConcMarkSweepGC 옵션은 ParNewGC가 Young Generation의 GC가 되게 한다.

  • 멀티 스레드 방식을 사용하기 때문에, Young Generation에서 가비지 컬렉터를 실행하기 위해 JVM이 애플리케이션을 멈추는 시간이 짧다. 
  • 애플리케이션 처리량이 지연 시간보다 훨씬 더 중요할 때 사용한다. 배치 작업을 할 때, 작업이 빠르게 끝날 것으로 기대된다.
  • 최악의 경우에, 애플리케이션의 지연 시간 요구사항(일시 중지 시간, 일시 중지 빈도)을 충족할 수 있는 경우 Parallel GC는 최상의 처리량을 제공한다.

 

위의 두 옵션을 주석 처리하고

-XX:+UseG1GC 를 추가하는 것은 G1(Garbage First) Garbage Collector를 사용하겠다는 것이다.
G1GC는 큰 메모리를 가진 멀티 프로세서 머신 위에서 돌아가는 애플리케이션을 위해 디자인된 것으로,
Heap 영역을 Region이라는 일정한 부분으로 나눠서 메모리를 관리한다.
가비지로 가득찬 영역부터 컬렉션을 시작하며, 이러한 영역을 첫 번째로 모음으로써 상당한 양의 free 공간을 만들어낸다.

  • 응답 시간이 처리량보다 중요하고, GC의 일시 정지가 1초 미만이어야 할때 사용한다.
  • 가비지 컬렉터를 실행하기 위해 JVM이 애플리케이션을 멈추는 시간이 Parallel GC 보다 짧다. 

 

 

참고

https://docs.oracle.com/cd/E13209_01/wlcp/wlss30/configwlss/jvmgc.html

https://mangkyu.tistory.com/118

 

https://www.herongyang.com/Java-GC/Concurrent-ParNew-Collector-for-Minor-GC.html

Java Performance Companion