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 메모리로 할당하는 것이 적당합니다.