1、jvm内存最好为系统的一半,另一半交给luence使用
2、增加reflush刷新间隔(10s,减少段合并带来的性能影响)
3、增大集群间互相发现、心跳的时间间隔(防止脑裂和误操作导致的不可用)
4、每个分片的存储量尽量和jvm内存分配的大小一致(保证搜索的数据都在内存中,对搜索延迟至关重要)
5、关闭不必要的索引(只要索引开着,就会分配内存给这个索引)
6、提前建好template,设置好mapping(减少es在创建索引时的消耗,如果多了一个字段,es也会自动按照第一次提交的数据格式设置mapping)
7、可以尝试使用G1GC垃圾回收器(jvm内存大于8G时,G1GC的处理效率要高很多,只在client机器上使用过,未在data节点上使用过)
8、搜索条件尽可能的详细(越详细,搜索的耗时越?。?/p>
### 配置文件:
#### elasticsearch.yml
```
cluster.name: {{ cluster_name }}
node.name: {{ ansible_nodename }}
node.master: {{ node_master }}
node.data: {{ node_data }}
path.data: /data/elasticsearch/
path.logs: /data0/log-data/elasticsearch/
network.host: {{ inventory_hostname }}
network.bind_host: {{ inventory_hostname }}
network.publish_host: {{ inventory_hostname }}
transport.tcp.port: 9300
http.port: 9200
discovery.zen.fd.ping_timeout: 120s
discovery.zen.fd.ping_interval: 30s
discovery.zen.ping.unicast.hosts: [{{ hosts }}]
discovery.zen.minimum_master_nodes: {{ min_master_nodes }}
http.cors.allow-origin: "/.*/"
http.cors.enabled: true
node.ingest: {{ node_ingest }}
```
#### jvm.option
```
-Xms{{ es_heap }}m
-Xmx{{ es_heap }}m
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+AlwaysPreTouch
-server
-Xss1m
-Djava.awt.headless=true
-Dfile.encoding=UTF-8
-Djna.nosys=true
-Djdk.io.permissionsUseCanonicalPath=true
-Dio.netty.noUnsafe=true
-Dio.netty.noKeySetOptimization=true
-Dio.netty.recycler.maxCapacityPerThread=0
-Dlog4j.shutdownHookEnabled=false
-Dlog4j2.disable.jmx=true
-Dlog4j.skipJansi=true
-XX:+HeapDumpOnOutOfMemoryError
```