一次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详细描述:学习界面中的经典词库出国考试 ...
随机推荐
- go-zero 是如何实现计数器限流的?
原文链接: 如何实现计数器限流? 上一篇文章 go-zero 是如何做路由管理的? 介绍了路由管理,这篇文章来说说限流,主要介绍计数器限流算法,具体的代码实现,我们还是来分析微服务框架 go-zero ...
- 8.0 Python 使用进程与线程
python 进程与线程是并发编程的两种常见方式.进程是操作系统中的一个基本概念,表示程序在操作系统中的一次执行过程,拥有独立的地址空间.资源.优先级等属性.线程是进程中的一条执行路径,可以看做是轻量 ...
- Jmeter逻辑控制器Switch Controller的用法
一.概述 类似编程语言中的switch函数,Switch Controller根据给定的值n(可使用变量)选择执行其下的 第n+1个子节点. 作用:Switch Controller通过给该控制器中的 ...
- 微信小程序2--WXML与WXSS
编辑WXML文件 我们在开发者工具里打开之前修改的模板小程序home文件夹下的home.wxml,里面有如下代码 <!--pages/home/home.wxml--> <text& ...
- day1项目配置
项目初始化 本项目使用vite进行构建,vite参考官网 pnpm包管理:performant npm,意味"高性能的npm".pnpm由npm/yarn衍生而来,解决了npmly ...
- 微服务使用openfeign调用单点的会话失效问题
项目Springcloud,认证中心方式实现SSO使用开源框架Sa-Token 本身的单独访问每个客户端服务的单点就没有问题.然后单点通过Fegin调用就不好使了! 主要使用的Sa-Token的微服务 ...
- Linux系列教程——Linux发展介绍、Linux系统安装、查看Linux内核版本和系统版本、Centos7安装jdk1.8
文章目录 1 Linux发展介绍 零 什么是Linux 一 Linux前身 二 Linux诞生 三 开源文化 四 Linux系统特点 五 Linux分支 2 Linux系统安装 Linux虚拟机安装 ...
- 再谈http请求调用(Post与Get),项目研发的核心一环
支持.Net Core(2.0及以上)与.Net Framework(4.0及以上) [目录] 前言 Post请求 Get请求 与其它工具的比较 1[前言] http请求调用是开发中经常会用到的功能. ...
- SQL 语句 增删改查、边学习边增加中..... 这一部分为select
SQL语句按照最大的类别分为 1.增加 insert 2.删除 delete https://www.cnblogs.com/kuangmeng/p/17756654.html 3.修改update ...
- 深入探讨I/O模型:Java中的阻塞和非阻塞和其他高级IO应用
引言 I/O(Input/Output)模型是计算机科学中的一个关键概念,它涉及到如何进行输入和输出操作,而这在计算机应用中是不可或缺的一部分.在不同的应用场景下,选择正确的I/O模型是至关重要的,因 ...