ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Elasticsearch GC 변경 계획 (CMS-> G1GC)
    검색/ElasticSearch 2021. 8. 26. 16:44
    반응형

    CMS와 G1GC :Java Garbage Collection

    G1GC 상세 :Java HotSpot VM G1GC

    참고 :G1 GC 적용과 JVM Upgrade

     

    작업 방향

    자바 버전 업그레이드 :

    1. Elasticsearch 버전 별 지원 JDK 정보 Elastic Support Matrix | Elasticsearch
    2. Elasticsaerch6.5.4 버전은 1.8을 제외하면 JDK11 버전을 지원한다.

    jvm.options 변경 :

             다음 CMS GC를 주석처리 한다.

             G1GC 활성화 :

    G1GC 설정 : 

    일반적인 권장 사항 : 가급적이면 기본 설정으로 사용할 것.

    옵션 및 기본값
    -XX:MaxGCPauseMillis=200
    
    최대 일시 정지 시간 목표. 기본값은 200ms.
    -XX:GCPauseTimeInterval=<ergo>
    
    일시 정지 시간 "최대 간격" 목표
    이 값은 기본값이 없어서, 최악의 경우 G1이 GC를 끊임없이 계속 수행할 수도 있다.
    -XX:ParallelGCThreads = <ergo>
    
    일시 정지 중 parallel 작업에 사용되는 최대 스레드 갯수.
    사용 가능한 프로세서 수가 8보다 작으면 그대로 지정한 값을 사용하고, 그 외의 경우는 
    5/8
     만큼의 스레드를 추가로 사용한다.
    예를 들어 사용 가능한 프로세서 수가 13 개라면 
    8+(13−8)×5/8=11.125
     이므로, 11 개의 스레드를 사용한다.
    일시 정지 상태로 들어갔을 때 사용되는 최대 스레드의 수는 최대 토탈 heap 사이즈에 의해 제한을 받는다.
    -XX:HeapSizePerGCThread 옵션으로 지정된 GC 스레드가 담당할 heap 사이즈의 최대값에 영향을 받는다.
    -XX:ConcGCThreads=<ergo>
    
    동시 작업에 사용하는 최대 스레드 수.
    이 값은 -XX:ParallelGCThreads를 4로 나눈 값이다.
    -XX:+G1UseAdaptiveIHOP, -XX:InitiatingHeapOccupancyPercent=45
    
    IHOP 관련 설정.
    -XX:G1HeapRegionSize=<ergo>
    
    영역 하나의 사이즈.
    기본적으로는 최대 heap 사이즈 
    1/2048
     만큼의 계산된 사이즈를 갖는다.
    굳이 설정을 한다면 1 ~ 32MB 정도로 설정할 수 있으며, 2의 거듭제곱 값이어야 한다.
    -XX:G1NewSizePercent=5, -XX:G1MaxNewSizePercent=60
    
    young gen의 총 사이즈는 이 두 값 사이에서 변화한다.
    -XX:G1HeapWastePercent=5
    
    The allowed unreclaimed space in the collection set candidates as a percentage. G1 stops the space-reclamation phase if the free space in the collection set candidates is lower than that.
    -XX:G1MixedGCCountTarget=8
    
    The expected length of the space-reclamation phase in a number of collections.
    -XX:G1MixedGCLiveThresholdPercent=85
    
    라이브 객체 점유율이 이 값보다 높은 old gen은 space-reclamation 단계에서 수집되지 않는다.
    튜닝
    여기에 나오는 지침들은 훑어보고 감 잡는 용으로만 쓰고, 실제로 튜닝을 하려면 문서를 직접 읽고 충분히 테스트하도록 하자.
    
    일반적인 권장 사항
    가급적이면 기본 설정으로 사용할 것.
    필요하다면 -Xmx 옵션으로 최대 heap 사이즈를 넉넉하게 설정할 것.
    -Xmn, -XX:NewRatio 옵션으로 young gen의 사이즈를 설정하지 말 것. 이 사이즈 목표가 일시 중지 시간 목표보다 우선하게 되며, 일시 중지 시간 목표는 비활성화된다.
    GC 튜닝시 처리량과 정지 시간 사이의 상충 관계를 염두에 둘 것.
    G1은 90%의 애플리케이션 시간과 10%의 GC 시간을 목표로 한다(Parallel GC의 경우 99%의 애플리케이션 시간과 1%의 GC 시간 목표). 따라서 처리량을 늘리고자 한다면 일시 정지 시간 목표를 어느 정도 느슨하게 해줘야 한다.
    G1 퍼포먼스 향상
    가장 중요한 것은 로그. -Xlog:gc*=debug 옵션으로 로그를 보도록 하자.

     

    작업 순서

    java 버전 체크 :

    [elastic@jn-elasticsearch-dev-01 share]$ java -version
    openjdk version "1.8.0_252"
    OpenJDK Runtime Environment (build 1.8.0_252-b09)
    OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)

    사용 중인 자바 위치 체크 : 

    [elastic@jn-elasticsearch-dev-02 share]$ which java
    /bin/java

    /bin/java 디렉터리 확인 : 

    java 버전이 alternatives로 관리 되고 있음을 확인

    [elastic@jn-elaseicsearch-dev-03 share]$ ls -alrt /bin/java
    lrwxrwxrwx 1 root root 22  5월 11  2020 /bin/java -> /etc/alternatives/java  
    
    [ec2-user@jn-elasticsearch-dev-01 etc]$ alternatives --config java
    1 개의 프로그램이 'java'를 제공합니다.
    
      선택    명령
    -----------------------------------------------
    *+ 1           java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.amzn2.0.1.x86_64/jre/bin/java)

    jdk를 원하는 위치에 설치하고 alternatives에 패키지 등록 :

    Archived OpenJDK GA Releases (https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz)

    ####### jdk11 설치 #######
    [root@jn-elasticsearch-dev-01 ec2-user]# cd /usr/share
    [root@jn-elasticsearch-dev-01 share]# mkdir java-11.0.2
    [root@jn-elasticsearch-dev-01 share]# cd java-11.0.2/
    
    # 다운로드
    [root@jn-elasticsearch-dev-01 java-11.0.2]# wget https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz
    --2021-06-17 16:50:42--  https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz
    Resolving download.java.net (download.java.net)... 104.109.240.89
    Connecting to download.java.net (download.java.net)|104.109.240.89|:443... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 187513052 (179M) [application/x-gzip]
    Saving to: ‘openjdk-11.0.2_linux-x64_bin.tar.gz’
    
    100%[==========================================================================================================================>] 187,513,052  127MB/s   in 1.4s
    
    2021-06-17 16:50:43 (127 MB/s) - ‘openjdk-11.0.2_linux-x64_bin.tar.gz’ saved [187513052/187513052]
    
    # 압축 해제
    [root@jn-elasticsearch-dev-01 java-11.0.2]# tar -xvf openjdk-11.0.2_linux-x64_bin.tar.gz
    
    ####### alternatives에 등록 #######
    [root@jn-elasticsearch-dev-01 bin]# alternatives --help
    대체 버전 1.7.4 - Copyright (C) 2001 Red Hat, Inc.
    GNU Public License하에 이 프로그램을
    자유롭게 재배포 할 수 있습니다.
    usage: alternatives --install <link> <name> <path> <priority>
                        [--initscript <service>]
                        [--family <family>]
                        [--slave <link> <name> <path>]*
           alternatives --remove <name> <path>
           alternatives --auto <name>
           alternatives --config <name>
           alternatives --display <name>
           alternatives --set <name> <path>
           alternatives --list
    
    common options: --verbose --test --help --usage --version --keep-missing
                    --altdir <directory> --admindir <directory>
     
    # alternative에 등록               
    [root@jn-elasticsearch-dev-01 bin]# alternatives --install /usr/bin/java java /usr/share/java-11.0.2/jdk-11.0.2/bin/java 100
    
    # java11 선택
    [root@jn-elasticsearch-dev-01 bin]# alternatives --config java
    
    2 개의 프로그램이 'java'를 제공합니다.
    
      선택    명령
    -----------------------------------------------
    *+ 1           java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.amzn2.0.1.x86_64/jre/bin/java)
       2           /usr/share/java-11.0.2/jdk-11.0.2/bin/java
    
    현재 선택[+]을 유지하려면 엔터키를 누르고, 아니면 선택 번호를 입력하십시오:2     
    
    # java11이 default로 선택 되었는지 확인
    [root@jn-elasticsearch-dev-01 bin]# java -version
    openjdk version "11.0.2" 2019-01-15
    OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
    OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)

    GC 변경

    # 계정 변경
    [root@jn-elasticsearch-dev-01 ~]# sudo su elastic
    # elasticsearch config 위치로 이동
    [elastic@jn-elasticsearch-dev-01 ~]cd /elastic/elasticsearch/config
    [elastic@jn-elasticsearch-dev-01 config]$ vi jvm.options
    ===========================
    # CMSGC 설정 주석
    ## GC configuration
    #-XX:+UseConcMarkSweepGC
    #-XX:CMSInitiatingOccupancyFraction=75
    #-XX:+UseCMSInitiatingOccupancyOnly
    
    # G1GC 설정
    ## set G1GC configuration
    -XX:+UseG1GC
    
    ===========================

    G1GC 반영을 위한 elasticsearch 재시작 :

    https://mondayus.tistory.com/54

     

    모니터링 :

    설정을 반영한 2021-06-17 17:25 이후 다음과 같이 CMS GC양상(mainGC가 발생할 때 급격한 Heap이 정리)을 띄는지 모니터링을 한다.

    반응형
Designed by Tistory.