Elasticsearch에서 JDK 및 GC 옵션을 동적으로 처리
11146 단어 jvmjavaelasticstackelasticsearch
Elasticsearch는 분포식 검색과 분석 엔진이다.Elasticsearch의 전문 검색 기능은 Apache Lucene에 기반을 두고 있다.Elastic Stack의 핵심으로 그 해결 방안인 기업의 검색, 관찰성과 안전성을 지원하고 많은 유명한 인터넷 사이트, 예를 들어 위키백과, GitHub 또는 Stack Overflow를 지원한다.
Elasticsearch는 좋은 JVM 생태계 시민이 되고자 JVM의 최신 버전을 발표했다.Elasticsearch 7.9.3은 최신 OpenJDK 15 릴리스를 발표했다.Elasticsearch의 핵심 원칙 중 하나는 가능한 한 간단하게 시작하고 운행하는 것이다.이것이 바로 Elasticsearch가 JDK를 제공하는 이유입니다. 이렇게 하면 사용자가 JDK를 설치하는 번거로움을 겪지 않을 것입니다.모두가 자바 전문가는 아니니까!그러나, 최소한 소규모 전문가가 되어야 할 때가 있습니다. 왜냐하면 JDK 옵션을 설정해야 하기 때문입니다. 예를 들어 설정더미를 설정해야 하기 때문입니다.
시작하기 전에 Elasticsearch에 JDK 옵션을 설정할 수 있도록 이 옵션을 분석하고 평가해야 합니다.사용자가 ./bin/elasticsearch 또는 ./bin/elasticsearch.bat를 실행할 때 실제 Elasticsearch 프로세스가 시작되기 전에 자바 프로그램을 시작합니다.먼저 프로그램 tocreate a temporary directory를 시작합니다. Windows에서의 조작은 다른 운영체제에서의 조작과 다릅니다.둘째, JvmOptionsParser 클래스를 사용하여 자바 옵션을 확정한다. 완성된 후에만 해석기의 출력은 주요 Elasticsearch 프로세스를 시작하는 데 사용된다.JDK 기본값을 사용하여 다른 Java 프로그램을 작은 무더기로 실행하여 속도를 확보할 수 있습니다.
JVM 옵션을 구성하는 메커니즘에 대해 자세히 살펴보겠습니다.
Elasticsearch를 사용하여 JVM 옵션 구성
Elasticsearch 자바 프로세스가 시작되기 전에 가장 자주 사용하는 jvm 옵션은 무더기 크기를 설정하는 것입니다.이를 위해 Elasticsearch는 a mechanism 파일을 읽을 뿐만 아니라
config/jvm.options
디렉터리를 읽을 뿐만 아니라, 모든 파일의 내용을 추가해서 JVM 옵션의 큰 목록을 만들 수 있습니다.다음과 같이 비슷한 config/jvm.options.d
파일을 만들 수 있습니다.# make sure we configure 2gb of heap
-Xms2g
-Xmx2g
이것은 시작할 때 무더기를 설정할 것입니다.그러나 배치와 해석 메커니즘은 더욱 강하다.옵션을 구성할 수 있을 뿐만 아니라 JDK 주요 버전마다 다른 옵션을 구성할 수도 있습니다.방주: 파일이 아닌
config/jvm.options.d/heap.options
디렉터리가 왜 있는지 스스로에게 묻는다. 이것은 RPM이나 debian 패키지의 패키지 업그레이드에 적합하기 때문에 원래의 jvm.options.d
를 교체할 수 있고 편집할 필요가 없다.그럼 왜 이게 쓸모가 있는지 스스로에게 물어볼지도 몰라요.새로운 Java 버전에서는 기능을 권장하지 않을 때도 있고 삭제할 때도 있습니다.그 중 하나는 CMS 스팸 수집기인데 Java 9에서 폐기되었고 2년여 후Java 14에 최종적으로 삭제되었다.Elasticsearch는 여러 해 동안 CMS의 즐거운 사용자였지만 CMS가 삭제되면서 자바14부터 다른 스팸 수집기를 사용하는 메커니즘이 있어야 한다.이를 지원하기 위해 JVM 옵션 파서는 다음과 같이 특정 Java 버전에만 특정 옵션을 설정하는 기능도 지원합니다.
## GC configuration
8-13:-XX:+UseConcMarkSweepGC
8-13:-XX:CMSInitiatingOccupancyFraction=75
8-13:-XX:+UseCMSInitiatingOccupancyOnly
## G1GC Configuration
# NOTE: G1 GC is only supported on JDK version 10 or later
# to use G1GC, uncomment the next two lines and update the version on the
# following three lines to your version of the JDK
# 10-13:-XX:-UseConcMarkSweepGC
# 10-13:-XX:-UseCMSInitiatingOccupancyOnly
14-:-XX:+UseG1GC
14-:-XX:G1ReservePercent=25
14-:-XX:InitiatingHeapOccupancyPercent=30
이것은 자바 8과 자바 9의 다른 GC 옵션에도 적용된다## JDK 8 GC logging
8:-XX:+PrintGCDetails
8:-XX:+PrintGCDateStamps
8:-XX:+PrintTenuringDistribution
8:-XX:+PrintGCApplicationStoppedTime
8:-Xloggc:logs/gc.log
8:-XX:+UseGCLogFileRotation
8:-XX:NumberOfGCLogFiles=32
8:-XX:GCLogFileSize=64m
# JDK 9+ GC logging
9-:-Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m
공식 Elastic docs에서 더 많은 정보setting JVM options를 읽을 수 있습니다.또 하나safeguard는 설정되고 동적으로 만들어진 JVM 로고를 추가하고 JVM을 시작합니다. 바로 Elasticsearch를 시작하기 전에 이 옵션들이 빨리 실패할 수 있도록 호환되는지 확인하는 것입니다.
또한 Elasticsearch는 시작할 때 모든 JVM 옵션을 기록하여 사용자의 가정을 쉽게 비교할 수 있도록 합니다.이 옵션들은 기록될 뿐만 아니라 nodes info API 검색도 할 수 있다.
인체 공학 기본값
그렇다면 JVM 옵션을 분석하는 것보다 더 재미있는 일을 할 수 있을까?우리는 당연히 할 수 있지!누구 있어요?
장점 중 하나는 Elasticsearch를 시작할 때 유용한 표준 JVM 옵션을 제공하는 것이다.기본 인코딩을 UTF-8로 설정하거나 DNS TTL 캐시를 설정하는 등 두 가지 재미있는 옵션이 있습니다. Elasticsearch가 항상 자바 보안 관리자를 사용하기 때문입니다.
또한 JDK 버전을 사용할 때만 일부 옵션을 사용할 수 있습니다.그러면 Java14 이상에서 참조를 해제하는 빈 포인터 예외가 활성화됩니다.
private static String maybeShowCodeDetailsInExceptionMessages() {
if (JavaVersion.majorVersion(JavaVersion.CURRENT) >= 14) {
return "-XX:+ShowCodeDetailsInExceptionMessages";
} else {
return "";
}
}
그러나 시간이 지날수록 이런 인프라는 더 멀어지고 스마트해질 수 있다.무더기 등 설정 설정에 따라 다른 JVM 옵션을 제공하는 것은 어떻습니까?이것이 바로 SystemJvmOptionsElasticsearch에 가서 한 일이다.
G1 스팸 컬렉터와 결합하여 작은 더미를 설정하면 추가 옵션이 설정됩니다.
final boolean tuneG1GCForSmallHeap = tuneG1GCForSmallHeap(heapSize);
final boolean tuneG1GCHeapRegion =
tuneG1GCHeapRegion(finalJvmOptions, tuneG1GCForSmallHeap);
final boolean tuneG1GCInitiatingHeapOccupancyPercent =
tuneG1GCInitiatingHeapOccupancyPercent(finalJvmOptions);
final int tuneG1GCReservePercent =
tuneG1GCReservePercent(finalJvmOptions, tuneG1GCForSmallHeap);
그럼, 여기 무슨 일이 일어났어요, 왜요?만약 설정된 무더기가 8GB보다 적으면, 많은 사용자들이 비교적 작은 Elasticsearch 실례를 실행하고, 비교적 적은 무더기를 사용해서 시스템의 다른 부분으로 마운트 해제하려고 노력하고 있기 때문에, 세 가지 추가 옵션을 설정합니다.물론 모든 것을 수동으로 덮을 수 있다.우선
jvm.options
를 사용하여 G1더미 영역의 크기를 4MB로 설정합니다.그 다음에 트리거 표시 주기의 점용 한도값은
XX:G1HeapRegionSize=4m
로 기본값XX:InitiatingHeapOccupancyPercent=30
보다 약간 이르다.셋째, 작은 무더기의 경우
45
옵션은 25%가 아닌 15%로 설정되어 두 가지 상황 모두 기본적인 10%에서 벗어났다.수개월의 기준 테스트와 테스트를 거쳐야만 이 숫자를 얻을 수 있으며, 토론에 관심이 있다면, 또 하나의 긴 과정이 있다. recent additionElasticsearch를 테스트할 때 이 문제들이 어떻게 발생했는지 알고 싶으시면Elasticsearch는 누드 하드웨어에서 야간 기준 테스트를 사용하여 회귀를 쉽게 발견하고 조사합니다.이것들을 보셔도 됩니다GitHub issue.이 목적에 사용되는 도구는 benchmarks here라고 하는데 이것은 Elasticsearch에 사용되는 거시적 기준 테스트 프레임워크입니다.rally의 가장 큰 특징은 자신의 데이터와 조회를 사용하여 테스트와 기준 테스트를 할 수 있기 때문에 야간 기준 테스트를 할 수 있다는 것이다.
그렇다면 왜 이런 옵션을 선택했는지 스스로에게 물어볼 수도 있다.기준 테스트 덕분에 인프라 테스트가 쉬워졌지만 테스트의 원인은 아니다.CMS에서 G1로 전환한 후 일부 기준 테스트 결과는 더 나빠져 조사가 필요하다.그 중 하나는 ParallelGC가 G1이 아닌 아주 작은 무더기가 있는지 테스트하는 것이었지만 포기되었다.
G1 구성 옵션에서 버그까지 찾았습니다.이 문제를 이해하기 위해서, Elasticsearch의 일부 기능을 설명해 봅시다.Elasticsearch는 메모리 계산을 통해 단일 노드의 과부하를 방지합니다. 예를 들어 집합 응답을 만들거나 네트워크를 통해 요청을 받을 때.일단 한계에 도달하면, Elasticsearch의 차단기는 스위치를 뛰어넘어 이상을 되돌려줍니다.유명한 문제
G1ReservePercent
가 발생하지 않도록 사용자에게 요청을 처리할 수 없다고 알리고 일시적인 문제인지 영구적인 문제인지 지적하는 것이다.Elasticsearch 7.0arally를 추가했기 때문에 현재 기록된 데이터뿐만 아니라 전체 무더기를 고려할 것이다.그러나 이 차단기는 부착된 G1 설정과 함께 작동할 수 없다. 설정된 설정real memory circuit breaker이 무엇을 설정했는지 가정하기 때문에 차단기는 쓰레기 수집기가 제공한 설정에 따라 쓰레기 수집 작업을 시작하기 전에 스위치를 밟는다.또한 메모리 차단기는 어느 순간에 일부 G1 특정 코드를 통해 a heap bigger than 100%로 강화되었다.
nudge G1 to do a young GC
요약
보시다시피 쓰레기 수집기에서 다른 쓰레기 수집기로 전환하는 등 기본 JDK 옵션을 정확하게 처리하고 해석하며 선택하십시오. 예를 들어 상당히 많은 절차, 인프라 시설, 테스트, 생산 운행, 검증이 관련되어 있습니다. 이것은 응용 프로그램에도 적용될 수 있습니다.
이것은 또한 모든 차세대 쓰레기 수집기, 예를 들어 와
ZGC . 이것들은 광범위한 테스트, 적당한 CI 통합, 심지어 코드에 대한 변경이 필요할 수도 있다.비록 이러한 지상 군사 시스템은 큰 개선을 약속하지만, 이 시스템을 사용하기 전에, 자신의 작업 부하를 사용하여 정확한 테스트를 했는지 확인하십시오.
또한 사용자 중 일부는 자신의 옵션을 설정하고 업그레이드를 포함한 수요를 적절하게 충족시키기를 원한다는 것을 잊지 마십시오.
Reference
이 문제에 관하여(Elasticsearch에서 JDK 및 GC 옵션을 동적으로 처리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/spinscale/handling-jdk-gc-options-dynamically-in-elasticsearch-57ll텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)