搜索性能优化
硬件/系统
- 为系统 cache 预留 至少一半的可用物理内存
- 搜索依赖对系统的 cache 的命中
- 禁用 swap
- swap 分区是从磁盘空间划分而来
- 更快的硬件
- 写入性能对 CPU 更敏感
- 搜索性能更在意 IO 能力
- 搜索请求有更多的所及访问
- 使用 SSD 比 旋转介质 还有质的飞跃
- 如果搜索类型计算比较多,考虑使用更快的 CPU
查看 swap
# 或 free -m
$ swapon -s
Filename Type Size Used Priority
/dev/dm-1 partition 2097144 0 -1
关闭 swap
$ swapoff /dev/dm-1
索引/建模
- 合理建模
- 嵌套 会使查询慢 几倍 ???
- 父子 会使查询慢 百倍 ???
- 预索引数据
- 搜索时需要 范围查询
range
的字段,在生成索引时进行计算,生成新的字段,变为terms
查询
- 搜索时需要 范围查询
- 字段映射
keyword
比integer
和long
更好
- 为只读索引执行 forceMerge、Shrink
- 基于日期进行轮训的索引,旧数据一般不会更新
- 预热全局序号(Global Ordinals)???
- 【6.1+】开启 ARS(自适应副本选择)
- ES 搜索存在长尾效应,即 一个延迟高的节点 会影响 整个请求的耗时
- ARS 更根据分片副本的响应情况,只能的把请求路由的性能更高的节点
- 开启方法?:
搜索技巧
- 避免使用脚本
- 有效使用查询缓存
- 时间力度粗化,如:精确到分钟、固定时间 等,每次查询的时间返回都不一样,会导致缓存利用率降低
- 细化数据分类: 大部门和缓存的部分 + 少量不可缓存的部分, 如 ( time < 一小时前 OR time >= 最近一小时 )
- execution hint: map ???
- 限制搜索的分片数
- action.search.shard_count ???
聚合技巧
- batched_reduce_size ???
- 近似聚合
- 权衡 深度优先 和 广度优先