一次elasticsearch 查询瞬间超时案例分析
大家好,我是蓝胖子,有段时间没有做性能分析案例讲解了,正好前两天碰到一个性能问题,今天就来对它探讨探讨。
问题背景
在晚上9点左右,刚从外面逛街回到家,就接到了电话报警(幸好前不久刚好把电话报警机制加上,不然可能我就要去洗澡了),电话告警告知线上业务存在大量请求失败的情况。于是赶紧打开电脑,排查了起来。
错误日志我们都是直接打到了钉钉上,发现大量的报警都是elasticsearch 访问超时发生的。紧接着看了下线上业务网站是否正常,各项接口也是正常返回的,查看错误日志发现,错误仅仅是在那一瞬间出现。之后便正常了。下面是在kibana上的错误日志图表。

好在系统现在是正常的,我可以慢慢的排查为啥会出现大量超时的情况,下面是我的排查思路。
排查思路
在 服务监控实践那个专题里 我有提到 ,监控是分层的,分层的好处也容易定位问题出现的根本原因。一般把整个监控范围划分为机器监控,组件监控,应用监控,业务监控。由于目前线上主要是elasticsearch访问超时了,所以我首先查看了elasticsearch的组件的相关情况。
排查elasticsearch 组件
想到访问超时,会不会是由于elasticsearch集群在那段时间承载了过多的访问流量,如下图所示,是当时elasticsearch的访问情况。

我们生产上是3台机器组成的集群,其余两台机器流量情况也和这个类似,可以看到整个集群的qps并不高,也就几百的样子。
既然不是流量问题,那会不会是es在执行一些耗时的操作,因为es中执行请求是在线程池中排队请求的,如果其中某些请求比较耗时会造成请求排队的情况。所以紧接着又看了es的线程池的情况。
机器1

机器2

还有一台机器3的线程池线程池情况,不过它和机器1类似,我这里就不粘贴出来了,可以看到很明显的是机器2中有较多的排队请求,不过没有出现拒绝请求的情况,那应用服务的es客户端为啥会触发超时呢?这是因为我们部门使用es客户端的时候都会加上超时时间(出现超时的请求设置的3s超时),虽然es服务端没有拒绝请求,但是在3s内客户端把请求取消了。
不过看到这里,能够想到,机器2这台机器很大可能是在执行什么比较耗时的查询,导致发往它的请求都在排队了。
耗时的查询原因又可以分为以下两种情况,
1,es执行的查询语句的确足够慢,性能不佳。
2,是由于机器的原因导致es的查询慢,比如同一台机器上有其他磁盘吞吐比较大的服务在运行。
进程服务与机器监控
基于上述分析,我先看了出现问题的机器2上的进程服务读写磁盘的情况,发现对磁盘读写最频繁的仍然是es服务,所以应该是es的dsl语句导致的。
这里再插入一个当时观察到的异常监控指标,机器2上的tcp连接个数在异常时出现激增,并且出现了tcp over flow的错误。如下是机器2当时的tcp连接状态的监控。


如果单看这两个指标,可能会认为是tcp的等待队列设置小了,但经过排查,等待队列的长度已经设置的足够大。结合前面对elasticsearch的监控,可以很好的解释这两个指标为啥出现。
原因在于elasticsearch此时执行语句比较慢,导致大量的连接没有被释放,而后续仍然会有新的请求过来,最终导致tcp连接异常了。
好了,基于上述分析,最后定位到了elasticsearch的慢查询导致的问题。
elasticsearch 慢查询日志排查
通过查看慢查询日志,发现当时的确有这样一个耗时16s的查询。是个数量达到上千的terms查询。该查询刚好是最近上线的一个定时任务在执行的语句。

elasticsearch 对于单term的精准查询是很迅速的,但是对terms的查询性能会出现性能急剧下降的情况,multi terms查询会将每个term的倒排列表读取出来进行合并,这个合并过程是非常耗时的(可以通过profile dsl语句验证这一点),特别是查询的term值对应很多文档的时候,开销会更大。并且这条查询直接读取了10000条数据。分析下来,这个查询对cpu,磁盘,还是内存都具有很大压力。
解决办法
针对上述慢查询,由于是后台定时任务,对查询时间没有要求,最直接的优化方法 可以采用分批的方法,将上千terms的查询分成小批量的terms查询,比如100个terms,一批批的查询。同时采用scroll滚动查询的方式,每次只查询1000条数据出来,减小对内存的压力。
总结
其实,你可以看到,整个排查过程是比较顺畅的,但是要完成这一系列比较顺畅的排查动作前提是要有比较完善的监控机制。无论是对组件还是机器乃至应用服务的监控,我们都设有比较完善的监控图表用于保留问题现场。对于慢查询日志则是直接发往了钉钉群,这也有利于快速对慢查询进行发现和修改以及对慢查询进行检索。
有了这些监控机制,当问题发生时,只需要分层的去观察不同层的监控情况,问题便能迎刃而解了。对于如何落地一个能用于生产环境的监控机制,欢迎收看我直接的服务监控实践系列结合对公司监控系统的建设,我完整的介绍了如何构建一套比较完备的监控系统。
一次elasticsearch 查询瞬间超时案例分析的更多相关文章
- ElasticSearch集群故障案例分析: 警惕通配符查询
最近ElasticSearch集群出现了 https://elasticsearch.cn/article/171 文章中描述的情况,现在转载全文警示下自己. 许多有RDBMS/SQL背景的开发者,在 ...
- mysql转ElasticSearch的案例分析
前言 最近工作中在进行一些技术优化,为了减少对数据库的压力,对于只读操作,在程序与db之间加了一层-ElasticSearch.具体实现是db与es通过bin-log进行同步,保证数据一致性,代码调用 ...
- Elasticsearch学习之深入聚合分析四---案例实战
1. 需求:比如有一个网站,记录下了每次请求的访问的耗时,需要统计tp50,tp90,tp99 tp50:50%的请求的耗时最长在多长时间tp90:90%的请求的耗时最长在多长时间tp99:99%的请 ...
- (转)一个MySQL 5.7 分区表性能下降的案例分析
一个MySQL 5.7 分区表性能下降的案例分析 原文:http://www.talkwithtrend.com/Article/216803 前言 希望通过本文,使MySQL5.7.18的使用者知晓 ...
- 如何更有效使用 Rational AppScan 扫描大型网站,第 2 部分: 案例分析
使用 AppScan 进行扫描 针对大型网站的扫描,我们按照戴明环 PDCA 的方法论来进行规划和讨论,建议 AppScan 使用步骤:计划(Plan).执行(Do).检查(check).分析(Ana ...
- java 并发基础,及案例分析
对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了,然而并发问题是令我们大多数程序员头疼的问题,但话又说回来了,既然逃避不掉,那我们就坦然面对吧~今天就让我们深入研 ...
- Elasticsearch入门教程(五):Elasticsearch查询(一)
原文:Elasticsearch入门教程(五):Elasticsearch查询(一) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:h ...
- 【Zookeeper】(三)部署与使用、服务器节点动态上下线案例分析
目录 Zookeeper部署与使用 1 分布式安装部署 配置服务器编号 增加zoo.cfg集群配置参数 2 启动集群服务器 3 启动集群客户端和命令 4 ️API的使用 引入依赖 创建客户端 创建节点 ...
- SQL性能优化案例分析
这段时间做一个SQL性能优化的案例分析, 整理了一下过往的案例,发现一个比较有意思的,拿出来给大家分享. 这个项目是我在项目开展2期的时候才加入的, 之前一期是个金融内部信息门户, 里面有个功能是收集 ...
- 个人作业-Week2 案例分析
微软必应词典客户端的案例分析 第一部分 调研,评测 1)bug: 运行平台:iOS 10.0.2 必应词典版本:4.2.2 1. bug标题:词库加载错误 bug详细描述:学习界面中的经典词库出国考试 ...
随机推荐
- Vue 框架下提升加载速度的一些实战经验分享
现在前端的框架有很多,甚至两只手已经数不过来,当然也完全没必要全部都学,还是应该深入的学习一两个被广泛使用的就好.其实我和大部分同学的想法一致,认为最值得我们深究的还是主流的 Vue 和 React. ...
- 领域驱动设计(DDD):从基础代码探讨高内聚低耦合的演进
大家好,我是付威,一名已在编码第一线奋斗了十余年的程序员.在2019年我初次接触到领域驱动设计(Domain-Driven Design,简称DDD)的概念.在我的探索中,我发现许多有关DDD的教程过 ...
- java与es8实战之六:用JSON创建请求对象(比builder pattern更加直观简洁)
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<java与es8实战>系 ...
- AI绘图开源工具Stable Diffusion WebUI前端API对接
背景 本文主要介绍 AI 绘图开源工具 Stable Diffusion WebUI 的 API 开启和基本调用方法,通过本文的阅读,你将了解到 stable-diffusion-webui 的基本介 ...
- Codeforces Round #576 (Div. 2)
A - City Day 题意:给n,x,y和数组a[n],求最小的下标d,使得有a[d-x,d-x+1,--d-1,d+1,d-1,d+1,--d+y-1,d+y]都比a[d]小,若d-x<= ...
- 快速了解C#接口(Interface)
Runoob 接口定义了所有类继承接口时应遵循的语法合同.接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做" 部分. 接口定义了属性.方法和 ...
- Avalonia开发(二)项目结构解析
一.前言 在Avalonia开发(一)环境搭建 文章中介绍了Avalonia的介绍.开发环境的搭建.项目创建,以及项目FirstAvaloniaApp项目结构的介绍.本篇文章将介绍各平台的项目介绍. ...
- MySQL到TiDB:Hive Metastore横向扩展之路
作者:vivo 互联网大数据团队 - Wang Zhiwen 本文介绍了vivo在大数据元数据服务横向扩展道路上的探索历程,由实际面临的问题出发,对当前主流的横向扩展方案进行了调研及对比测试,通过多方 ...
- 背景图片随机API
在美化博客园的时候,遇到了一个问题:博客背景图片只支持一张图片,看到有道友说可以用API随机图片. 于是就有了这篇文章. 本文主要整理了一些随机图片API,希望对你有帮助. 岁月小筑 https:// ...
- How to install Django¶
This document will get you up and running with Django. Install Python Being a Python Web framework, ...