elasticsearch优化

ES配置优化

优化目的

  • 此次优化针对ES中fielddata无法正常GC造成资源紧张,无法接收DSL执行请求

常用配置

  • 设置断路器,防止构建DSL超出集群资源极限
  • 适当调大filedata上限阈值,加快搜索速度
1
2
3
4
5
6
7
8
9
10
curl -XPUT 'localhost:9200/_cluster/settings'  -d'
{
"persistent" : {
"indices.store.throttle.max_bytes_per_sec":"20mb",
"indices.breaker.fielddata.limit":"35%",
"indices.breaker.request.limit":"30%",
"indices.breaker.total.limit":"50%"
}
}
'
  • 预加载fielddata进入filesystemcache,即在建索引的时候就加载这样可以提升排序和统计的性能
1
2
3
4
5
6
7
8
9
10
11
POST /test_index/_mapping/test_type
{
"properties": {
"test_field": {
"type": "string",
"fielddata": {
"loading" : "eager"
}
}
}
}
  • elasticsearch.yml: indices.fielddata.cache.size: 20%,超出限制,清除内存已有的fielddata。
    也可以设置为绝对内存,比如16g

测试环境调优

先看一下现有集群配置

现有配置

现有配置

现有配置

DSL请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 前端传来的测试语句
curl "http://192.168.20.122:9200/nctermlte202006/nctermlte/_search?pretty" -d '
{
"from": 0,
"size": 15,
"sort": [{
"stime": {
"order": "desc"
}
}],
"query": {
"bool": {
"must": {
"range": {
"stime": {
"gte": 1592198576,
"lt": 1592284976
}
}
}
}
}
}'

响应结果

响应结果

更换DSL语句响应结果

响应结果

领导说此业务用了好几年了,完全没有这种问题,你们大数据这块肯定有问题,必须你们这里改,xxx.

开始调优

开始调优1

  • fileddatacache
    • 这个参数比率过小,导致无法充分利用集群的内存资源,大部分fielddata字段无法做到从filesystemcache中获取,需要调大

优化结束测试

image-20200622100434583

image-20200622100501831

完整配置

image-20200622100630018

full

full

1
2
3
4
cache设定值:产线等比率放大即可
max.window:单次分页可接收的最大返回条数限定值:可根据需要设定
index.buffer:如果有频繁的写入操作,为了提高效率可以讲buffer相关的两个值调大
默认10%==虚拟机 heap 10%

fielddata相关查询命令

1
2
3
GET /_stats/fielddata?fields=* //各个分片、索引的fielddata在内存中的占用情况
GET /_nodes/stats/indices/fielddata?fields=* //每个node的fielddata在内存中的占用情况
GET /_nodes/stats/indices/fielddata?level=indices&fields=* //每个node中的每个索引的fielddata在内存中的占用情况
  • image-20200622102358496

    evictions次数的增加代表fileddata在达到设定的驱逐临界值(现有配置50%)

    后被执行了GC清除

总结

fileddata正在按照设定的上限阈值被gc,而这个上限值在ES默认配置当中是无限大

如果不手动设定这个上线阈值,会造成fileddata从不被GC(驱逐)

通过以上配置 (fielddata使用上限百分比(值),驱逐百分比(值) ) 并且配合断路器

可以做到有效安全的利用fileddata,快速查询document!

参考

一些配置参数

1
2
# 使用bulkAPI档次最大接收数据的大小,首次可以适当放大,根据每次增加插入大小来观察文档入库的效率,直到速度不再增加以后将这个值设为最大值
http.max_content_length