1.配置原则
作为一个Java应用程序,Elasticsearch需要从系统的物理内存中分配一些逻辑内存(堆)。这应该最多是物理RAM的一半,上限为32GB。设置较高的堆使用率通常是为了应对开销较大的查询和更大的数据存储。父级熔断器默认值为95%,但我们建议在持续达到85%时就扩展资源。
2.配置文件
2.1 elasticsearch配置文件
直接在本地 Elasticsearch 文件的 config > jvm.options 文件中配置。
## JVM configuration ################################################################ ## IMPORTANT: JVM heap size ################################################################ … # Xms represents the initial size of total heap space # Xmx represents the maximum size of total heap space -Xms4g -Xmx4g
2.2 docker-compose配置文件
作为 docker-compose 中的 Elasticsearch 环境变量。
version: '2.2' services: es01: image: docker.elastic.co/elasticsearch/elasticsearch:7.12.0 environment: - node.name=es01 - cluster.name=es - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms512m -Xmx512m" - discovery.type=single-node ulimits: memlock: soft: -1 hard: -1 ports: - 9200:9200
3.熔断器配置
Elasticsearch 有一系列的断路器,它们都能保证内存不会超出限制:
- indices.breaker.fielddata.limit fielddata 断路器默认设置堆的 60% 作为 fielddata 大小的上限。
- indices.breaker.request.limit request 断路器估算需要完成其他请求部分的结构大小,例如创建一个聚合桶,默认限制是堆内存的 60%。它实际上是node level的一个统计值,统计的是这个结点上,各类查询聚合操作,需要申请的Bigarray的空间大小总和。 所以如果有一个聚合需要很大的空间,同时在执行的聚合可能也会被break掉。
- indices.breaker.total.limit 父熔断,inflight、request(agg)和fielddata不会使用超过堆内存的 70%。
- network.breaker.inflight requests.limit 限制当前通过HTTP等进来的请求使用内存不能超过Node内存的指定值。这个内存主要是限制请求内容的长度。 默认100%。
- script.max_compilations_per_minute
- 限制script并发执行数,默认值为15。