[ElasticSearch] Circuit breaker 정리

Woong·2022년 9월 1일
0

ElasticSearch

목록 보기
11/21

Circuit Breaker

  • ElasticSearch 에서 OOM 발생을 방지하기 위해 사용하는 기능
    • PUT /_cluster/settings API 를 통해 조정

parent circuit breaker

  • indices.breaker.total.use_real_memory
    • true 이면 parent breaker 활성화 여부. 기본값.
    • false 이면 child breaker 를 통해서만 처리
  • indices.breaker.total.limit
    • 모든 parent circuit breaker 의 limit 지정
    • indices.breaker.total.use_real_memory 가 true 이면 75%, false 이면 90%
    • 설정값을 높이거나 circuit breaker 를 비활성화할 수 있으나, ElasticSearch 충돌이 발생할 위험성이 생긴다.

Field data circuit breaker

  • 필드 데이터를 로딩하는 heap 메모리를 추정하여, field 데이터 캐시 메모리 사용량이 초과하면 중단하고 에러 리턴

  • indices.breaker.fielddata.limit

    • (Dynamic) 필드 데이터 breaker 의 제한값. 기본값 40%
  • indices.breaker.fielddata.overhead

    • (Dynamic) 최종 추정을 위해, 모든 필드 데이터 추정에 곱하는 상수값. 기본값 1.03

Request circuit breaker

  • 각 request 마다 특정 메모리를 초과하는 것을 방지
    • ex) request 로 인한 집계 연산에 사용되는 메모리
  • indices.breaker.request.limit
    • request breaker 의 제한값. 기본값 60%
  • indices.breaker.request.overhead
    • 최종 추정을 위해, 모든 request 추정에 곱하는 상수값. 기본값 1

In flight requests circuit breaker

  • transport 나 HTTP 레벨에서, 노드에서 동작중인 모든 request 의 메모리 사용량 제한
    • request 의 contents 길이 기반
  • `network.breaker.inflight_requests.limit
    • flight requests breaker 의 제한값
    • 기본값 100%. (기본값이면 parent breaker 설정을 따르게 됨)
  • network.breaker.inflight_requests.overhead
    • 최종 추정을 위해, 모든 flight request 추정에 곱하는 상수값. 기본값 2

Accounting requests circuit breaker

  • request 가 완료될 때, 해제되지 않은 메모리에 대한 제한
    • Lucene 세그먼트 메모리 포함
  • indices.breaker.accounting.limit
    • accounting breaker 의 제한값
    • 기본값 100%. (기본값이면 parent breaker 설정을 따르게 됨)
  • indices.breaker.accounting.overhead
    • 최종 추정을 위해 모든 accounting 추정에 곱하는 상수값. 기본값 1

Script compilation circuit breaker

  • 일정 시간 내 스크립트 컴파일 수를 제한
  • script.max_compilations_rate
    • 특정 기간 내 스크립트 컴파일 횟수 제한
    • 기본값 150/5m (5분동안 150개)
  • 제한에 자주 도달하는 경우, 스크립트 캐시가 너무 작아서 생기는 문제일 수 있음
    • _nodes/statsscript.cache_evictions_historyscript.compilations_history 점검
    • 위 값이 너무 크다면 script.cache.max_size 를 두배로 늘려 조치 권장

Regex circuit breaker

  • painless 스크립트에서 정규식 사용 가능 여부 및 복잡도를 제한
  • script.painless.regex.enabled
    • limited : 기본값. 정규식 활성화하되, 클러스터 설정의 script.painless.regex.limit-factor 값으로 제한
    • true 복잡도 제한 없이 정규식 활성화 (=breaker 비활성화)
    • false : 정규식 사용 자체를 제한. 정규식 request 는 모두 에러 리턴
  • script.painless.regex.limit-factor
    • painless script 에서 정규식으로 고려 가능한 문자열 길이 제한
    • 스크립트 입력 문자열 길이에 이 값을 곱한 값이 기준
      • ex)
    • script.painless.regex.enabled 설정이 limited 일 때에만 적용

발생 예시

Caused by: ElasticsearchException[Elasticsearch exception [type=circuit_breaking_exception, reason=[parent] Data too large, data for [indices:data/write/bulk[s]] would be [509191974/485.6mb], which is larger than the limit of [493030604/470.1mb], real usage: [508969864/485.3mb], new bytes reserved: [222110/216.9kb], usages [request=0/0b, fielddata=700/700b, in_flight_requests=222110/216.9kb, model_inference=0/0b, accounting=8111422/7.7mb]]]

reference

0개의 댓글