Elasticsearch cache(캐시)

By | 2020년 7월 2일
Table of Content

Elasticsearch 캐시

Node Query Cache

Node 단위로 캐시가 이루어지며, Query 중 Filter query 만 캐시가 됩니다.

속도가 빠르고 cache 가 되므로, 다른 쿼리에 앞서 실행해 주는것이 성능향상에 도움이 됩니다.

문서 자체를 cache 하는 것이 아니라, 필터쿼리와 각 문서의 매칭이 true, false 인지만 bitset 형태로 저장해 둡니다.

cache 는 현재의 쿼리 뿐만 아니라 다른 쿼리에서도 재사용됩니다.

filter cache 에 할당되는 메모리 사이즈는 디폴트값이 JVM HEAP 사이즈의 10% 입니다.

elasticsearch.yml 에 indices.queries.cache.size 로 설정해야 합니다.

Shard Request Cache

"size": 0 일 때만 cache 가 됩니다.

size 가 0 이란 의미는 문서를 리턴받지 않고 집계 데이타만 사용한다는 의미입니다.

shard 단위로 캐싱을 합니다. shard 내의 문서에 변화가 생기면 모든 cache 는 무효화됩니다. 때문에, 문서의 변화가 거의 없는 정적인 shard 에서 사용하는 것이 좋습니다.

shard cache 에 할당되는 메모리 사이즈는 디폴트로 JVM HEAP 사이즈의 1% 입니다.

elasticsearch.yml 에 indices.requests.cache.size 로 설정해야 합니다.

Field Data Cache

통계 데이타 생성에 ES 는 모든 문서를 메모리에 올립니다.

elasticsearch.yml 에 indices.fielddata.cache.size 로 설정해야 합니다. 하지만, Field Data Cache 는 할당량을 제한해도 작동방식이 먼저 메모리에 데이타를 올리고 제한을 넘으면 사용되지 않는 데이타를 제거하는 방식이기에 OOM 에러가 발생할 수 있습니다.

Circuit breaker

Circuit breaker 는 데이타를 메모리에 올리기 이전에 사이즈를 측정해서 OOM 을 막는 방식입니다.

indices.breaker.fielddata.limit 에 디폴트로 40% 로 지정되어 있고 elasticsearch.yml 에서 변경할 수 있습니다.

설정값 정리

sudo vi /etc/elasticsearch/elasticsearch.yml
indices.queries.cache.size: 10%
indices.requests.cache.size: 1%
indices.breaker.fielddata.limit: 40%

운영체제 캐시

OS 메모리의 절반(half rule)을 JVM HEAP 메모리로 할당하는 것이 적당합니다.

답글 남기기