大家好,我是蓝胖子,有段时间没有做性能分析案例讲解了,正好前两天碰到一个性能问题,今天就来对它探讨探讨。

问题背景

在晚上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 查询瞬间超时案例分析的更多相关文章

  1. ElasticSearch集群故障案例分析: 警惕通配符查询

    最近ElasticSearch集群出现了 https://elasticsearch.cn/article/171 文章中描述的情况,现在转载全文警示下自己. 许多有RDBMS/SQL背景的开发者,在 ...

  2. mysql转ElasticSearch的案例分析

    前言 最近工作中在进行一些技术优化,为了减少对数据库的压力,对于只读操作,在程序与db之间加了一层-ElasticSearch.具体实现是db与es通过bin-log进行同步,保证数据一致性,代码调用 ...

  3. Elasticsearch学习之深入聚合分析四---案例实战

    1. 需求:比如有一个网站,记录下了每次请求的访问的耗时,需要统计tp50,tp90,tp99 tp50:50%的请求的耗时最长在多长时间tp90:90%的请求的耗时最长在多长时间tp99:99%的请 ...

  4. (转)一个MySQL 5.7 分区表性能下降的案例分析

    一个MySQL 5.7 分区表性能下降的案例分析 原文:http://www.talkwithtrend.com/Article/216803 前言 希望通过本文,使MySQL5.7.18的使用者知晓 ...

  5. 如何更有效使用 Rational AppScan 扫描大型网站,第 2 部分: 案例分析

    使用 AppScan 进行扫描 针对大型网站的扫描,我们按照戴明环 PDCA 的方法论来进行规划和讨论,建议 AppScan 使用步骤:计划(Plan).执行(Do).检查(check).分析(Ana ...

  6. java 并发基础,及案例分析

    对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了,然而并发问题是令我们大多数程序员头疼的问题,但话又说回来了,既然逃避不掉,那我们就坦然面对吧~今天就让我们深入研 ...

  7. Elasticsearch入门教程(五):Elasticsearch查询(一)

    原文:Elasticsearch入门教程(五):Elasticsearch查询(一) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:h ...

  8. 【Zookeeper】(三)部署与使用、服务器节点动态上下线案例分析

    目录 Zookeeper部署与使用 1 分布式安装部署 配置服务器编号 增加zoo.cfg集群配置参数 2 启动集群服务器 3 启动集群客户端和命令 4 ️API的使用 引入依赖 创建客户端 创建节点 ...

  9. SQL性能优化案例分析

    这段时间做一个SQL性能优化的案例分析, 整理了一下过往的案例,发现一个比较有意思的,拿出来给大家分享. 这个项目是我在项目开展2期的时候才加入的, 之前一期是个金融内部信息门户, 里面有个功能是收集 ...

  10. 个人作业-Week2 案例分析

    微软必应词典客户端的案例分析 第一部分 调研,评测 1)bug: 运行平台:iOS 10.0.2 必应词典版本:4.2.2 1. bug标题:词库加载错误 bug详细描述:学习界面中的经典词库出国考试 ...

随机推荐

  1. UI通过元素定位实现特定区域截图

    最近计划做一个自动截图的工具,目的是实现性能测试资源监控平台(grafana)各硬件资源的自动截图,解放手工操作.前期的截图做了如下探索. 1. 整个页面截图 1.1 代码实现 通过save_scre ...

  2. 【技术实战】Vue功能样式实战【七】

    需求实战一 样式展示 代码展示 <template> <transition name="fade-in" appear> <ARow v-if=&q ...

  3. 形象谈JVM-第三章-即时编译器优化技术

    即时编译器优化技术一览: 相信许多同学看完这个表格,脑子里面嗡嗡的,这些名字也是晦涩难懂,要实现这些优化的技术确实有比较大的难度,但是咱们只是学习,去理解这些技术,其实并不难,下面咱们直接开讲. 首先 ...

  4. 基于 JMeter API 开发性能测试平台

    背景: JMeter 是一个功能强大的性能测试工具,若开发一个性能测试平台,用它作为底层执行引擎在合适不过.如要使用其API,就不得不对JMeter 整个执行流程,常见的类有清楚的了解. 常用的 JM ...

  5. SQL简单使用指南

    SQL简单使用指南 SQL(结构化查询语言)是一种用于管理和操作关系型数据库的标准化语言. 数据库概述 数据库是用于存储和组织数据的结构.它由表(表格)组成,每个表都包含多个列和行.以下是SQL中最常 ...

  6. RocketMQ 系列(三) 集成 SpringBoot

    RocketMQ 系列(三) 集成 SpringBoot 前两篇文章介绍了 RocketMQ 基本概念与搭建,现在以它与 SpringBoot 的结合来介绍其基本的用法. RocketMQ系列(一) ...

  7. 关于关闭Sublime Text自动更新提示

    Sublime Text默认提示自动更新,实在让人烦不胜烦,那么有没有办法解决嘞,那当然是有的,下面就教你如何关闭Sublime Text自动更新提示 首先注册,不注册的话,一切操作都没有用:(注册码 ...

  8. Gradle 设置全局镜像源

    复制 init.gradle.kts 文件到 Windows 的 %USERPROFILE%/.gradle 或者 Linux 的 ~/.gradle 目录下.也可以直接复制文末的代码为 init.g ...

  9. linux下查找文件中某字符串出现的行以及该行前后n行

    linux下查找文件中某字符串出现的行以及该行前后n行 查找指定字符串的前后n行 grep -A 100 -B 100 "要查找的字符串" 被查找的文件 -A after 后面 - ...

  10. 洛谷题解 | P5660 数字游戏

    ​ 目录 题目描述 输入格式 输出格式 输入输出样例 说明/提示 题目简化 题目思路 AC代码 题目描述 小 K 同学向小 P 同学发送了一个长度为 8 的 01 字符串来玩数字游戏,小 P 同学想要 ...