Elasticsearch慢查询故障诊断
最近在做ES搜索调优,看了一些lucene搜索的文档和代码,本文用于总结调优过程中学到的知识和自己的思考。
在抓到ES慢查询之后,会通过profile或者kibana的Search Profiler console查看具体慢在了哪里。一般在执行profile search之前,需要稍微改变query语句里的查询内容,防止cache影响测试效果。
profile主要包括shard级别的query耗时、query语句rewrite耗时以及最终lucene collector的耗时。
一般主要关注query的耗时,profile返回的query部分详细的展示了被rewrite后的查询语句以及每个子查询的耗时。包括子查询的类型(type),子查询语句(description),子查询耗时(time_in_nanos)和一个breakdown集合包含了lucene segements search各阶段的耗时。从这个breakdown集合中能比较清晰的看到耗时的原因,当然,前提是要理解breakdown里每个指标代表什么意思和内部的实现逻辑。
breakdown里的主要指标及lucene中的实现:
build_scorer:构造一个scorer的耗时。scorer主要用于对matching的doc进行打分和排序。build_scorer内部构造了迭代器,这个迭代器可以遍历所有matched document,构造迭代器是非常耗时的操作,因为涉及到对各子查询的docId结果集构造倒排链或bitset,并且做conjunction生成最终可被迭代的docId bitset或倒排链。大多数查询主要耗时在这一步。
next_doc: 寻找下一个匹配的document Id。这里keyword, text等文本类型的字段会利用skipList,数值类型的数据会利用Tree结构快速找的下一个匹配的docoument Id。同时,这里会记录该doc命中的子查询数量,用于最终的min_should_match之类的过滤。
advance: 类似于一个low level的next_doc。并不是所有的query都能实现next_doc,比如must查询走的advance去找下一个匹配的文档。
score: 记录socrer中对文档打分的耗时,通过Freq,normal等数据结合tf-idf等算法计算出得分。
match: 记录第二阶段打分的耗时。有些查询需要两阶段打分,比如短语查询(phrase query) "chinese love china", 第一阶段先找所有包含“chinese”、“love”、“china”三个term的文档。第二阶段再在第一阶段匹配到到的所有文档中计算“chinese”,"love","china"三个单词的位置和顺序是否满足条件,这一操作非常耗时,所以通过第一阶段缩小匹配文档的范围。
create_weight: 创建weight过程的耗时,weight就相当于lucene查询的context,里面包含了query,collector,indexreader等。
*_count: 记录方法调用次数,比如next_doc_count:2,代表next_doc方法被调用了两次。
除了query过程的详细统计,还包括:
rewrite_time: query语句被重写的耗时,lucene自己维护了一套查询语句重写逻辑,比如terms查询中如果要查询的terms个数小于16,会被重写成多个TermQuery做or结合;如果大于16会被重写成TermInSetQuery。
collector: query数据收集阶段的各种指标。包括query用到的collector的个数,类型和耗时。ES默认使用的是SimpleTopScoreDocCollector。lucene的collector主要通过reduce方法对每个segment上匹配的结果进行合并和排序,返回topN。
故障诊断过程中,除了通过profile API定位慢查询,也需要关注ES集群的整体资源使用情况,比如data node的CPU, Mem, 磁盘IO是否有瓶颈,单节点shard个数是否过多等。一般可以通过cerebro或者elasticsearch_exporter+Prometheus来监控集群状态, 也可以通过ES API查看相关指标。
Elasticsearch慢查询故障诊断的更多相关文章
- 【转】elasticsearch的查询器query与过滤器filter的区别
很多刚学elasticsearch的人对于查询方面很是苦恼,说实话es的查询语法真心不简单- 当然你如果入门之后,会发现elasticsearch的rest api设计是多么有意思. 说正题,ela ...
- 基于百度地图SDK和Elasticsearch GEO查询的地理围栏分析系统(1)
本文描述了一个系统,功能是评价和抽象地理围栏(Geo-fencing),以及监控和分析核心地理围栏中业务的表现. 技术栈:Spring-JQuery-百度地图WEB SDK 存储:Hive-Elast ...
- Elasticsearch Kibana查询语法
Elasticsearch Kibana查询语法 2018年06月03日 23:52:30 wangpei1949 阅读数:3992 Elasticsearch Kibana Discover的搜 ...
- ElasticSearch—分页查询
ElasticSearch查询—分页查询详解 Elasticsearch中数据都存储在分片中,当执行搜索时每个分片独立搜索后,数据再经过整合返回.那么,如何实现分页查询呢? 按照一般的查询流程来说,如 ...
- Elasticsearch 邻近查询示例
Elasticsearch 邻近查询示例(全切分分词) JAVA API方式: SpanNearQueryBuilder span = QueryBuilders.spanNearQuery(); s ...
- elasticsearch简单查询
elasticsearch简单查询示例: { "from": "0", //分页,从第一页开始 "size": "10" ...
- ElasticSearch高级查询
ElasticSearch高级查询 https://www.imooc.com/video/15759/0 ElasticSearch查询 1,子条件查询:特定字段查询所指特定值 1.1query c ...
- elasticsearch 分页查询实现方案——Top K+归并排序
elasticsearch 分页查询实现方案 1. from+size 实现分页 from表示从第几行开始,size表示查询多少条文档.from默认为0,size默认为10,注意:size的大小不能超 ...
- ELK 学习笔记之 elasticsearch 基本查询
elasticsearch 基本查询: 基本查询: term查询: terms查询: from和size查询: match查询: match_all查询: match_phrase查询: multi_ ...
随机推荐
- HTML5八大特性助力移动WebApp开发
http://www.cocoachina.com/webapp/20150906/13344.html WebApp的实现基础就是HMTL5+JS+CSS3,但是WebApp还是基于浏览器的微网站开 ...
- 如何用django框架完整的写一个项目
实现目标及功能,增删改,并且实现搜索,分页,日期插件,删除提示,以及批量导入等功能 软件版本: python3.5 django1.11 一 用pycharm创建一个项目,名字自定义 二 编辑url ...
- 说说iOS与内存管理(上)
http://www.cocoachina.com/ios/20150625/12234.html 说起内存管理,看似老生常谈,而真正掌握内存管理的核心其实并不简单.ARC/MRR以及“谁分配谁就负责 ...
- MaxCompute Studio使用心得系列7——作业对比
在数据开发过程中,我们通常需要将两个作业进行对比从而定位作业运行性能或者结果有差异的问题,但是对比作业时需要同时打开两个studio 的tab页,或者两个Logview页,不停切换进行对比,使用起来非 ...
- Firefox浏览器怎么安装adobe flash player插件
https://jingyan.baidu.com/article/0a52e3f435d171bf62ed7237.html 有些朋友在使用Firefox火狐浏览器,但是火狐浏览器安装以后是没有fl ...
- AFNetworkingErrorDomain 错误
AFNetworking and POST Request I'm getting this response in error.userInfo while making a POST reques ...
- oracle用UNION-ALL 替换UNION ( 如果有可能的话)
当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序. 如果用UNION ALL替代UNION, 这样排序就不是必要了. 效率 ...
- Laravel 之搜索引擎elasticsearch扩展Scout
简介 Laravel Scout 是针对Eloquent 模型开发的一个简单的,基于驱动的全文检索系统.Scout 使用模型观察者时会自动保持你的检索索引与你的 Eloquent 记录同步. 目前,S ...
- js获取dom节点
var s= document.getElementById("test");del_ff(s); //清理空格var chils= s.childNodes; //得到s的全部子 ...
- js后端返回一个时间戳,用原生怎么对时间进行格式化?
function fn(time) { var date = new Date(time); var len = time.toString().length; // 时间戳不足13位则在后面加零 i ...